Skip to content

解决 kubeadm 初始化时提示 cgroups v1 support is in maintenance mode, please migrate to cgroups v2 问题

概述

在 Ubuntu20.04 通过 kubeadm 初始化控制平面时提示 cgroups v1 support is in maintenance mode, please migrate to cgroups v2,不影响使用,但是看着难受呀!

解决

根据您的 mount | grep cgroup 输出,您的 Ubuntu 20.04 系统当前处于 cgroups v1 和 v2 混合模式,但 实际默认使用的是 cgroups v1。以下是详细分析和针对性建议:


1. 当前 cgroups 状态解析

挂载点类型说明
/sys/fs/cgroup/unifiedcgroup2v2 统一层级(未实际使用关键子系统)
/sys/fs/cgroup/{systemd,cpu,memory,...}cgroupv1 子系统(实际控制资源)
  • 关键结论
    • 系统同时支持 v1 和 v2,但所有核心子系统(CPU、内存、设备等)仍通过 cgroups v1 挂载。
    • Kubernetes/Docker 默认会使用 v1,除非显式配置为 v2。

2. 对 Kubernetes 的影响

  • 当前状态kubeadm 的警告([WARNING SystemVerification]: cgroups v1)表明您的集群运行在 cgroups v1 上,但未来版本可能不再支持。
  • 风险: 长期使用 v1 可能导致兼容性问题(尤其是新版本 Kubernetes)。

3. 两种解决方案

根据您的需求选择:

方案 1:保持 cgroups v1(兼容现有环境)

  • 适用场景:生产环境已稳定运行,或无严格版本要求。
  • 操作建议: 忽略警告,但需确保 Kubernetes 组件使用一致的 cgroup driver(推荐 systemd):
    bash
    # 检查 kubelet 配置
    cat /var/lib/kubelet/config.yaml | grep cgroupDriver
    # 如果不是 systemd,修改后重启
    sudo sed -i 's/cgroupDriver:.*/cgroupDriver: systemd/' /var/lib/kubelet/config.yaml
    sudo systemctl restart kubelet

方案 2:完全切换到 cgroups v2(推荐新集群)

  • 适用场景:新部署环境或测试集群。
  • 操作步骤
步骤 1:启用 cgroups v2 并禁用 v1
bash
sudo nano /etc/default/grub

修改 GRUB_CMDLINE_LINUX 行,添加以下参数:

ini
GRUB_CMDLINE_LINUX="... systemd.unified_cgroup_hierarchy=1 cgroup_no_v1=all"

更新 GRUB 并重启:

bash
sudo update-grub
sudo reboot
步骤 2:验证切换结果
bash
mount | grep cgroup

预期输出应仅剩 cgroup2 挂载点:

bash
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,...)
步骤 3:重新配置 Kubernetes 和 Docker
  • Docker
    bash
    echo '{"exec-opts": ["native.cgroupdriver=systemd"]}' | sudo tee /etc/docker/daemon.json
    sudo systemctl restart docker
  • Kubernetes
    bash
    sudo kubeadm reset
    sudo rm -rf /etc/kubernetes/ $HOME/.kube
    # 重新初始化时显式指定 cgroup driver
    sudo kubeadm init --cgroup-driver=systemd ...

4. 注意事项

  1. 数据兼容性: 切换 cgroups 版本后,原有容器/Pod 可能需要重建
  2. 旧工具兼容性: 部分监控工具(如 cadvisor)可能需要升级以支持 cgroups v2。
  3. 回滚方法: 删除 GRUB 参数中的 cgroup_no_v1=all 并重启即可恢复 v1。

5. 扩展检查

确认当前系统的 cgroup 驱动:

bash
docker info | grep -i cgroup  # Docker 使用的驱动
kubelet --help | grep cgroup-driver  # Kubelet 支持的驱动

请根据您的实际需求选择方案。如果需要更具体的操作指导(如保留现有集群数据迁移),请补充说明您的场景!

最后更新2026/06/09 05:35
如果你觉得这篇文章有帮助,或者想聊聊技术、工作,欢迎通过下面方式联系我:
contact fishfinal