Kubeadm 是个让我爱恨交加的东西,一方面,我不认为一个生产集群应该使用这样一个第三方工具进行在线安装,尤其是在目前这种网络环境之下;而另外一方面,Kubeadm 这一工具是随 Kubernetes 同步更新的,其中包含了大量的集群配置方面的最佳实践,是追新的最佳参考,所以这个讨厌的东西的运行是必须需要得到保障的。kubeadm 的执行过程沉默到令人发指,因此下面分享几个使用过程中遇到的一些问题和解决的思路和方法,希望对同行们有所帮助。
下面的例子是基于 kubeadm 1.6.6 + Centos 7 的执行过程记录的。
- 写入 yum repo 并进行安装之后,利用
systemctl enable kubelet
启用 kubelet 服务之后,只要运行一下systemctl daemon-reload
即可,这一服务的启动需要 kubeadm 生成的证书和配置文件等的支持,因此无需进行启动。 kubeadm init
过程首先会检查代理服务器,确定跟 kube-apiserver 的 https 连接方式,如果有代理设置,会提出警告。- 接下来会对 sysctl 进行检查,我这里需要执行
sysctl net.bridge.bridge-nf-call-iptables=1
,对这一参数进行调整,解决他的警告。 - 接下来进入最抓狂的一个等待时间,屏幕显示为
[apiclient] Created API client, waiting for the control plane to become ready
,这一过程中会遇到大多数的坑,我一般会另外启动一个连接或者 tmux 窗口,进行观察和除错:- 这里已经做好运行 kubelet 服务的准备,因此这一时间内,我们可以利用
systemctl statusl -l kubelet
对服务的启动状况进行检查,目前比较容易遇到的是 kubectl 和 docker 两个服务的cgroup-driver
不一致的问题,这里编辑文件/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
,修改这一参数值为跟 docker 一致的cgroupfs
即可。这一步可以在 kubeadm init 之前执行完成 - kubelet 启动之后,会尝试运行系统组件的 Pod,这里我们可以通过观察
docker images
的镜像列表来观察是否能够顺利进行下载。 - 镜像下载完成之后就会开始运行各个系统组件,因此也是事故最为集中的阶段,我们可以使用
docker ps
、docker logs
、docker inspect
几个命令,逐个查看组件的运行情况,对失败组件的原因进行排除,之前提过的resolv.conf
的故障就是在这一阶段发现并排除的。
- 这里已经做好运行 kubelet 服务的准备,因此这一时间内,我们可以利用
K8S安装注意事项:
主要参考为http://blog.frognew.com/2017/04/kubeadm-install-kubernetes-1.6.html
需要注意的点为:
1)最好应该连接到GOOGLE,因为安装K8S会从Google下载,安装后配置时K8S会从grc.io下载docker镜像,必须保证链接,必要时FQ。
2)必须时间同步,否则HTTPS无法连接到源K8S源,特别虚拟机安装K8S时要注意,如果从快照启动建议同步一次
安装ntp: yum install -y ntp
同步时间 ntpdate 0.cn.pool.ntp.org(与国家授时中心同步)
3)/etc/hosts文件必须有127.0.0.1 localhost,必须设置各节点的主机名。
4)建议一次节点之间免秘钥认证,否则可能执行kubeadm时在API处卡住。
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.20.0.250
5)由于DOCKER使用的cgroup为cgroupfs (使用docker info查看)而不是systemd,因此必须修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件如下:
[Service]
Environment=KUBELET_KUBECONFIG_ARGS=–kubeconfig=/etc/kubernetes/kubelet.conf –require-kubeconfig=true
Environment=KUBELET_SYSTEM_PODS_ARGS=–pod-manifest-path=/etc/kubernetes/manifests –allow-privileged=true
Environment=KUBELET_NETWORK_ARGS=–network-plugin=cni –cni-conf-dir=/etc/cni/net.d –cni-bin-dir=/opt/cni/bin
Environment=KUBELET_DNS_ARGS=–cluster-dns=10.96.0.10 –cluster-domain=cluster.local
Environment=KUBELET_AUTHZ_ARGS=–authorization-mode=Webhook –client-ca-file=/etc/kubernetes/pki/ca.crt
Environment=KUBELET_EXTRA_ARGS=–cgroup-driver=cgroupfs
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_EXTRA_ARGS
6)关闭和从开机去除firewalld服务,安装iptables(我的机器是最小安装,未装IPTABELS服务),
安装yum install iptables-services
启动systemctl enables iptables
7) 去掉SELINUX
Setenforce 0
编辑 /etc/selinux/config文件,开机禁用selinux
请问,我在kubeadm安装完成后,执行kubelet命令时,提示错误
kubelet cgroup driver: cgroupfs is different from docker cgroup driver: systemd
可是在10-kubeadm.conf中的值为–cgroup-driver=systemd
docker info 也看到的cgroup为systemd: Cgroup Driver: systemd
请问,两个值都是一样的,我是哪里出了问题了呢?