Appearance
解决 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/unified | cgroup2 | v2 统一层级(未实际使用关键子系统) |
/sys/fs/cgroup/{systemd,cpu,memory,...} | cgroup | v1 子系统(实际控制资源) |
- 关键结论:
- 系统同时支持 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. 注意事项
- 数据兼容性: 切换 cgroups 版本后,原有容器/Pod 可能需要重建。
- 旧工具兼容性: 部分监控工具(如
cadvisor)可能需要升级以支持 cgroups v2。 - 回滚方法: 删除 GRUB 参数中的
cgroup_no_v1=all并重启即可恢复 v1。
5. 扩展检查
确认当前系统的 cgroup 驱动:
bash
docker info | grep -i cgroup # Docker 使用的驱动
kubelet --help | grep cgroup-driver # Kubelet 支持的驱动请根据您的实际需求选择方案。如果需要更具体的操作指导(如保留现有集群数据迁移),请补充说明您的场景!
