问题现象:

k8s集群启用了 TLS Bootstrapping 机制,新增node节点启动kubelet后,systemctl status查看是running状态,k8s的master节点也能get 到csr信息,

批准node加入集群后,get nodes看不到新增节点,并且新增node的kubelet会处于失败状态,狂刷日志就像下边这种

新增node加入k8s集群失败_k8s新增node

困扰了好久,检查了:kubelet版本、docker版本、防火墙、日志都没找到,直到查看日志,一直往上翻最终找到第一条有用的报错

新增node加入k8s集群失败_cgroupfs_02

kubelet cgroup驱动:"systemd"不同于docker cgroup驱动:"cgroupfs"  

1、查看master设置的docker json文件驱动为system

# vim /etc/docker/daemon.json

{
"registry-mirrors":["http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn","https://f3lu6ju1.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"]
}

2、查看新增节点的docker json文件是空的,意味着是默认的cgroupfs,修改成一样的就行

# vim /etc/docker/daemon.json
{
"registry-mirrors":["http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn","https://f3lu6ju1.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"]
}

3、重启node上的docker、kubelet服务

# systemctl restart docker kubelet
# 下面报错可以忽略,是kubelet动态探测插件找不到插件导致

新增node加入k8s集群失败_cgroupfs_03

  • cgroupfs是什么?

docker默认的Cgroup Driver是cgroupfs,

cgroupfs是cgroup为给用户提供的操作接口而开发的虚拟文件系统类型,

它和sysfs,proc类似,可以向用户展示cgroup的hierarchy,通知kernel 用户对cgroup改动对cgroup的查询和修改只能通过cgroupfs文件系统来进行。

  • 为什么要修改为使用systemd?

Kubernetes 推荐使用 ​​systemd​​​ 来代替 ​​cgroupfs​

​​​因为​​​systemd是Kubernetes自带的cgroup管理器, 负责为每个进程分配cgroups,  但docker的cgroup driver默认是cgroupfs,这样就同时运行有两个cgroup控制管理器,  当资源有压力的情况时,有可能出现不稳定的情况