CentOS 7 使用kubeadm 部署 Kubernetes

 

关闭swap

执行swapoff临时关闭swap。

重启后会失效,若要永久关闭,可以编辑/etc/fstab文件,将其中swap分区一行注释掉

#/dev/mapper/centos-swap swap                    swap    defaults        0 0

安装配置docker

可以参考官方安装文档

1. 安装docker

$ yum install yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
$ yum update && yum install docker-ce-18.06.2.ce

2. docker配置

创建文件/etc/docker/daemon.json, 写入下面的内容。

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

若在国内部署,可以使用国内的docker源加快拉取速度,/etc/docker/daemon.json中加入国内源。

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}

3. 重启docker

mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload
systemctl restart docker

安装kubeadm, kubelet和kubectl

1. 添加yum仓库

如果节点在国内,可以使用国内镜像仓库,这里使用了阿里云的,创建/etc/yum.repos.d/kubernetes.repo,文件如下内容

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

如果在国外,可以使用谷歌官方镜像仓库,文件内容如下

[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*

2. 关闭SELinux

kubelet不支持SELinux, 这里需要将SELinux设置为permissive模式

$ setenforce 0
$ sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

3. 安装 kubelet, kubectl和kubeadm

$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
$ systemctl enable --now kubelet

4. 配置sysctl

在RHEL/CentOS 7上由于 iptables 被绕过导致网络请求被错误的路由。您得保证 在您的 sysctl 配置中 net.bridge.bridge-nf-call-iptables 被设为1。

创建文件/etc/sysctl.d/k8s.conf, 文件内容如下

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

执行sysctl --system使配置生效

5. 拉取镜像

如果节点在国外,可以跳过这一步。

执行kubeadm config images pull查看到gcr.io的连接,如果拉取成功可以进入下一步。

如果失败,说明无法访问gcr.io。这时需要手动拉取镜像,可以执行下面的脚本,从阿里云拉取相应镜像。

#!/bin/bash

images=(
    kube-apiserver:v1.13.4
    kube-controller-manager:v1.13.4
    kube-scheduler:v1.13.4
    kube-proxy:v1.13.4
    pause:3.1
    etcd:3.2.24
    coredns:1.2.6
)

for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
done

也可以在国外的vps上拉取相应的镜像,执行docker save保存为tar文件,复制到需要的节点上,docker load加载,然后通过docker tag恢复镜像的tag。

执行kubeadm config images list可以查看所需镜像

安装pod网络插件

这里使用flannel

$ yum insatll flanneld

初始化集群的master

1. kubeadm init初始化

可以先通过kubeadm config images pull确认镜像拉取成功。

通过kubeadm init <args>初始化。由于这里使用了flannel作为网络插件,在初始化时需要加入--pod-network-cidr=10.244.0.0/16指定网络。如果不适用默认的

kubeadm init --pod-network-cidr=10.244.0.0/16

初始化成功后,会输出下面的信息

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

注意这里最后一行的kubeadm join .....,在其他节点执行此行命令,使节点加入到集群中。

如果使用非root账户操作kubectl,则需执行如下命令

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

2. 部署flannel

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

通过kubectl get nodes查看节点,如果看到master节点表示安装成功。

$ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
host-168   Ready    master   41h   v1.13.4

将其他节点加入到集群中

只有master需要执行kubeadm init初始化,其他node节点通过执行kubeadm join加入到集群中

命令及参数采用kubeadm init时的输出,示例如下

kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

这里的toke有效期只有24小时,如果过期在master上执行kubeadm create token创建新的token。

执行kubectl get nodes查看node节点

$ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
host-167   Ready    <none>   41h   v1.13.4
host-168   Ready    master   41h   v1.13.4

集群中的master和node节点的hostname不能重复,否则会加入集群失败。 如果重复,可以通过hostnamectl set-hostname NAME修改节点的hostname

安装Web界面(可选)

安装kuberenets-dashboard后可以通过浏览器查看/更改集群

1. 拉取镜像

和前述相同,需要node节点拉取下面几个镜像。国内节点需要从阿里云拉取或者从国外节点拉取后传到节点再加载

k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
gcr.io/google_containers/kube-proxy-amd64:v1.9.8
k8s.gcr.io/pause:3.1
gcr.io/google_containers/pause-amd64:3.0

2. 部署dashboard

获取yaml配置文件

$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

kubernetes-dashboard默认需要通过kubectl proxy来访问,但是这时使用的是HTTP,在HTTP下访问dashboard时即使登录成功,也会卡在登录页面。可以选择让dashboard直接监听外部端口,不经过kubectl proxy的代理。

为此可以在kubernets-dashboard.yaml最后一栏,Dashboard Service中,增加了type: NodePortnodePort: 30001,更改后的结果如下所示。(这里30001端口也可以更改)

# ------------------- Dashboard Service ------------------- #

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard

部署dashboard

通过kubectl部署dashboard

$ kubectl apply -f kubernets-dashboard.yaml

访问https://nodeIP:30001,出现登录界面表示成功。这里的证书不被浏览器信任,chrome无法访问的话,可以用firefox打开。

3. 创建admin用户来访问dashboard

这里为了简单,创建了一个admin账户用来登录

新建文件dashboard-adminuser.yaml,内容如下

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system

在master上执行kubectl apply -f dashboard-adminuser.yaml创建admin用户及role绑定。

获取token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

输出如下所示

Name:         admin-user-token-6gl6l
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=admin-user
              kubernetes.io/service-account.uid=b16afba9-dfec-11e7-bbb9-901b0e532516

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTZnbDZsIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiMTZhZmJhOS1kZmVjLTExZTctYmJiOS05MDFiMGU1MzI1MTYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.M70CU3lbu3PP4OjhFms8PVL5pQKj-jj4RNSLA4YmQfTXpPUuxqXjiTf094_Rzr0fgN_IVX6gC4fiNUL5ynx9KU-lkPfk0HnX8scxfJNzypL039mpGt0bbe1IXKSIRaq_9VW59Xz-yBUhycYcKPO9RM2Qa1Ax29nqNVko4vLn1_1wPqJ6XSq3GYI8anTzV8Fku4jasUwjrws6Cn6_sPEGmL54sq5R4Z5afUtv-mItTmqZZdxnkRqcJLlg2Y8WbCPogErbsaCDJoABQ7ppaqHetwfM_0yMun6ABOQbIwwl8pspJhpplKwyo700OSpvTT9zlBsu-b35lzXGBRHzv5g_RA

在dashboard登录界面,选择令牌,将上面输出的token粘贴到输入框,点击登录就可以已admin登入。

常见问题

  1. node节点kubeadm join成功,master上看不到

可以查看node节点的hostname是否于集群内其他节点重复,重复的话通过hostnamectl修改

  1. node节点一直处于NotReady状态

查看节点是否安装了flannel,没有需要安装。

通过systemctl status kubelet查看运行日志中的错误信息。

 cni.go:213] Unable to update cni config: No networks found in /etc/cni/net.d
3月 31 17:50:00 host-166 kubelet[19833]: E0331 17:50:00.085663   19833 kubelet.go:2170] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

类似上面的报错,应该是flannel没有安装或者找不到flannel的配置,可以手动将master的/etc/cni/net.d/10-flannel.conflist文件手动复制到node节点相应目录下。如果拉取镜像失败,则可以手动拉取。

  1. dashboard卡在登录界面

确保浏览器通过https访问dashboard。

  1. token过期导致kubeadm join时失败

执行kubeadm join时报错如下。

[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
error execution phase preflight: unable to fetch the kubeadm-config ConfigMap: failed to get config map: Unauthorized

这是因为kubeadm生成的token默认24小时过期,在master上执行kubeadm token create创建新的token,替换kubeadm join --token XXX中的token即可

[转帖]CentOS 7 使用kubeadm 部署 Kubernetes的更多相关文章

  1. [原]使用kubeadm部署kubernetes(一)

    #######################    以下为声明  ##################### 在公众号  木子李的菜田 输入关键词:   k8s 有系列安装文档 此文档是之前做笔记在 ...

  2. 02 . Kubeadm部署Kubernetes及简单应用

    kubeadm部署Kubernetes kubeadm简介 # kubeadm是一位高中生的作品,他叫Lucas Kaldstrom,芬兰人,17岁用业余时间完成的一个社区项目: # kubeadm的 ...

  3. Kubeadm部署Kubernetes

    Kubeadm部署Kubernetes 1.环境准备 主机名 IP 说明 宿主机系统 k8s-master 10.0.0.101 Kubernetes集群的master节点 Ubuntu2004 k8 ...

  4. 使用kubeadm部署Kubernetes v1.13.3

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: 1. 安装要求 在开始之前,部署Kubernetes集群 ...

  5. 附025.kubeadm部署Kubernetes更新证书

    一 查看证书 1.1 查看过期时间-方式一 1 [root@master01 ~]# tree /etc/kubernetes/pki/ 2 [root@master01 ~]# for tls in ...

  6. 使用kubeadm部署Kubernetes集群

    一.环境架构与部署准备 1.集群节点架构与各节点所需安装的服务如下图: 2.安装环境与软件版本: Master: 所需软件:docker-ce 17.03.kubelet1.11.1.kubeadm1 ...

  7. kubeadm部署Kubernetes集群

    Preface 通过kubeadm管理工具部署Kubernetes集群,相对离线包的二进制部署集群方式而言,更为简单与便捷.以下为个人学习总结: 两者区别在于前者部署方式使得大部分集群组件(Kube- ...

  8. 使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像)

    系列目录 kubernetes简介 Kubernetes节点架构图: kubernetes组件架构图: 准备基础环境 我们将使用kubeadm部署3个节点的 Kubernetes Cluster,整体 ...

  9. centos7.1使用kubeadm部署kubernetes 1.16.2的master高可用

    机器列表,配置域名解析 cat /etc/hosts192.168.200.210 k8s-master1192.168.200.211 k8s-master2192.168.200.212 k8s- ...

随机推荐

  1. div中的图片跑出来

    一:div中的图片跑出来 <style> /* 图片在一行 */ #div1 li{ float: left; list-style: none; } </style> < ...

  2. pyqt5--QTDesigner--安装与配置

    安装: 安装PyQt5-tools 文件--->设置---> ---> 安装之后在 安装目录\Lib\site-packages\pyqt5_tools  找到 designer.e ...

  3. Python---webserver3

    一.v07-添加路由功能 - 路由:能够理解请求并按照请求调用相应处理函数的模块 - 理解请求内容 - 能够调用或者指定相应业务处理模块 - 算法: - 按行读取传入报文 - 假如报文能用空格分割成三 ...

  4. leaflet 地图容器大小改变时,地图自适应新容器

    window.onload = function () { changeDivHeight(); } //当浏览器窗口大小改变时,设置显示内容的高度 window.onresize = functio ...

  5. 020:reverse函数补充

    补充reverse两点: 1.如若在反转url时,需要添加参数,那么可以传递 kwargs 参数到 reverse 函数中,实例代码如下: '}) ) 2.如若想添加查询字符串参数,则必须手动进行ur ...

  6. centos7下open--v!(p/n)部署

    一,client-server 路由模式 使用tun,openssl,lzo压缩,启用转发,生成证书,关闭selinux 同步下时间 #1安装 yum -y install openvpn easy- ...

  7. UVa 572 Oil Deposits (Floodfill && DFS)

    题意 :输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横竖以及对角方向),就是说它们属于同一个八连块. 分析 :可以考虑种子填充深搜的方法.两重for循 ...

  8. go语言系列--输出正弦函数

    实验所用到的标准库和包 库与包之间的理解可以类比成:数据库种的库和表 库名 作用 image 常见图形格式的访问及生成 log 日志记录库 math 数学库 os 操作系统平台不依赖平台操作封装 查看 ...

  9. hibernate一对一单项关联映射

    一.主键关联 1.两个实体对象的主键一样,以表明它们之间的一一对应关系: 2.不需要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值. Pe ...

  10. Vue左滑组件slider的实现

    本文链接:https://blog.csdn.net/latency_cheng/article/details/82983000 slider组件与swiper组件不同,slider滑动时并不翻页, ...