今日在部署旧版本 k8s 集群 (1.16.10) 时出现错误,主要是在新版本操作系统上部署老版本 k8s,kubelet会出现如下错误

bash
1
2
W1123 22:31:47.383423    3686 server.go:605] failed to get the kubelet's cgroup: mountpoint for cpu not found.  Kubelet system container metrics may be missing.
W1123 22:31:47.383572    3686 server.go:612] failed to get the container runtime's cgroup: failed to get container name for docker process: mountpoint for cpu not found. Runtime system container metrics may be missing.

错误原因

上面的报错是 Kubelet 无法正确访问 Docker 容器运行时的 cgroup 信息,特别是关于 CPU 使用的 cgroup 信息

从 Linux 内核 4.5 起,cgroup v2 被引入并逐渐取代了 cgroup v1。如果系统启用了 cgroup v2,而 Docker 或 Kubelet 并没有正确配置,可能会导致 Kubelet 无法访问 cgroup 信息。

查看系统 cgroup 版本

bash
1
2
$ mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)

更改Docker和Kubelet的cgroup版本

更改 Docker 的 cgroup 版本

bash
1
2
3
$ docker info |grep Cgroup
 Cgroup Driver: systemd
 Cgroup Version: 2

强制 Docker 使用 cgroup v1

bash
1
2
3
4
{
  "exec-opts": ["native.cgroupdriver=cgroupfs"],
  "log-driver": "json-file"
}

查看结果

bash
1
2
root@debian-template:~# docker info|grep cgroup
 Cgroup Driver: cgroupfs

配置 kubelet 使用 cgroup v1

修改 kubelet 参数

bash
1
--cgroup-driver=cgroupfs

让操作系统挂载 cgroup v1

查看系统 cgroup 版本

bash
1
2
$ mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)

手动挂载

通常手动挂载是不成功的

bash
1
2
mount: /sys/fs/cgroup: cgroup already mounted or mount point busy.
       dmesg(1) may have more information after failed mount system call.

需要修改启动参数让操作系统挂载上 cgroup v1

bash
1
vi /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT 行中,添加 cgroup_no_v2=1systemd.unified_cgroup_hierarchy=0 选项,确保系统使用 cgroup v1

bash
1
GRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_no_v2=1 systemd.unified_cgroup_hierarchy=0"

更新 GRUB 配置

bash
1
update-grub

重启后查看挂载信息

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ mount | grep group
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,size=4096k,nr_inodes=1024,mode=755,inode64)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/misc type cgroup (rw,nosuid,nodev,noexec,relatime,misc)

此时 kubelet 可以正常启动了