kubeadm 踩坑记

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 psdocker logsdocker inspect几个命令,逐个查看组件的运行情况,对失败组件的原因进行排除,之前提过的resolv.conf的故障就是在这一阶段发现并排除的。
K8S中文社区微信公众号

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #2

    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

    红裙翠襦1年前 (2017-07-05)回复
  2. #1

    请问,我在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
    请问,两个值都是一样的,我是哪里出了问题了呢?

    搜狐网友6318932210个月前 (01-11)回复