在kylin系统中我们通过二进制包的方式离线安装docker,安装完后发现 Cgroup的版本还是V1,驱动仍然为cgroupfs,这是不满足kubernetes的安装要求的。

kuberbetes 在v1.25 版本正式支持 cgroup v2,并建议所有新集群使用;v1.35 版本开始弃用 cgroup v1。此外,使用 Cgroup v2 时必须将 kubelet 和容器运行时的 Cgroup 驱动都配置为 systemd

从v1.22版本开始 kubeadmkubelet 作为 systemd 服务来管理,让 kubelet 和容器运行时(如 containerd)都使用 systemd 作为 cgroup 驱动,可以确保两者在同一个 cgroup 管理视角下工作,避免资源管理冲突

886010-20260825103748145-192439019-Atrh.png

1、识别当前系统上的cgroup版本

cgroup 版本取决于正在使用的 Linux 发行版和操作系统上配置的默认 cgroup 版本。 要检查你的发行版使用的是哪个 cgroup 版本,请在该节点上运行 stat -fc %T /sys/fs/cgroup/ 命令:

stat -fc %T /sys/fs/cgroup/

对于 cgroup v2,输出为 cgroup2fs

对于 cgroup v1,输出为 tmpfs

2、修改Cgroup版本

将系统从 Cgroup v1 切换到 v2,核心操作是修改系统的内核引导参数,然后重启。因为对于 KylinV10、CentOS 等系统,默认挂载的是 cgroup v1,需要手动配置来启用 v2。此外 cgroup v2 对内核版本要求 >= kernel 4.5

通过修改 GRUB 配置文件,让系统在启动时加载 cgroup v2。

# 打开 GRUB 配置文件
vim /etc/default/grub

找到 GRUB_CMDLINE_LINUX 这一行,在双引号内的参数列表末尾,添加 systemd.unified_cgroup_hierarchy=1

如果之前为了开启 v1 添加过类似 systemd.unified_cgroup_hierarchy=0cgroup_no_v1=all 的参数,需要将其移除,以避免冲突 。
修改后的内容看起来像这样:

GRUB_CMDLINE_LINUX="... rhgb quiet systemd.unified_cgroup_hierarchy=1"

修改了引导配置后,需要更新 GRUB 文件并重启系统使其生效

在 KylinV10 系统上,执行以下命令重新生成 GRUB 配置

sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# 输出结果
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.19.90-89.11.v2401.ky10.aarch64
Found initrd image: /boot/initramfs-4.19.90-89.11.v2401.ky10.aarch64.img
Found linux image: /boot/vmlinuz-0-rescue-cda737e7e6844aa3b739764ce65c7fa6
Found initrd image: /boot/initramfs-0-rescue-cda737e7e6844aa3b739764ce65c7fa6.img
Adding boot menu entry for EFI firmware configuration
done

# 更新完重启系统
reboot -h now

某些系统也可能使用 sudo update-grub 命令,但 grub2-mkconfig 在 KylinV10 上是更通用的方式。

执行验证查询

如果输出变为 cgroup2fs,说明操作系统层面已成功切换到 cgroup v2 。
你也可以用 mount | grep cgroup 命令查看挂载情况,如果看到 cgroup2 on /sys/fs/cgroup 这样的记录,同样证明切换成功

2.1、对于UEFI启动的系统来说,需要修改对应UEF的启动文件

使用 find 命令搜索所有包含旧参数的配置文件

sudo find /boot -name "grub.cfg"
# 输出
/boot/efi/EFI/kylin/grub.cfg
# 查看该配置文件后发现引用 /etc/default/grub 文件
cat /etc/default/grub
# 添加systemd.unified_cgroup_hierarchy=1 
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=klas/root rd.lvm.lv=klas/swap video=VGA-1:640x480-32@60me cgroup_disable=files apparmor=0 crashkernel=1024M,high smmu.bypassdev=0x1000:0x17 smmu.bypassdev=0x1000:0x15 smmu.bypassdev=0xffe1:0xd200 audit=0 video=efifb:off rhgb quiet console=tty0 systemd.unified_cgroup_hierarchy=1"
GRUB_DISABLE_RECOVERY="true"

# 重启

生成正确UEFI引导配置

sudo grub2-mkconfig -o /boot/efi/EFI/kylin/grub.cfg
# 输出
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.19.90-89.11.v2401.ky10.aarch64
Found initrd image: /boot/initramfs-4.19.90-89.11.v2401.ky10.aarch64.img
Found linux image: /boot/vmlinuz-0-rescue-cda737e7e6844aa3b739764ce65c7fa6
Found initrd image: /boot/initramfs-0-rescue-cda737e7e6844aa3b739764ce65c7fa6.img
Adding boot menu entry for EFI firmware configuration
done

3、配置 Docker 使用 systemd cgroup 驱动

操作系统切换到 cgroup v2 后,还需要让 Docker 使用 systemd 作为 cgroup 驱动,以便与系统更好地集成。

exec-opts 参数即用于指定 cgroup 驱动,如果之前已有其他配置,只需在根 JSON 对象中添加这一项即可。

vim /etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

配置完成后重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker

4、查看cgroup信息

docker info
---------------
 Cgroup Driver: systemd
 Cgroup Version: 2
---------------