根本原因是Docker与kubelet的cgroup驱动不一致,须通过docker info和ps aux确认实际驱动,推荐统一为systemd:修改docker.service添加--exec-opt native.cgroupdriver=systemd,重载重启Docker,再验证;若改kubelet则需编辑config.yaml中cgroupDriver字段并重启服务。

Kubernetes集群初始化失败,kubelet反复报错“cgroup driver mismatch”,根本原因常是Docker默认用cgroupfs而kubelet配置为systemd,必须在安装K8s前就让两者驱动严格一致,否则节点无法加入集群。
确认当前Docker和kubelet的Cgroup驱动实际值
别凭印象或文档猜,直接查运行时真实状态:运行docker info | grep "Cgroup Driver",输出结果就是Docker当前生效的驱动;再执行ps aux | grep kubelet | grep -o 'cgroup-driver=[^[:space:]]*',看到的才是kubelet正在使用的驱动。如果二者字符串不完全相同(比如一个是cgroupfs,另一个是systemd),冲突已存在。
注意:【docker info显示的是真正运行的驱动,比任何配置文件都权威】。若没查到kubelet参数,说明它用的是默认值——v1.24之前默认cgroupfs,v1.24+默认systemd,但kubeadm生成的旧config.yaml可能仍写死为cgroupfs。
统一改为systemd(推荐且最稳妥)
systemd驱动能与宿主机init系统深度协同,避免资源统计分裂、指标丢失和OOM误判,在CentOS 7+/Ubuntu 16.04+等主流发行版上应作为首选。
第一步:检查宿主机是否支持systemd驱动——运行systemctl show --property=DefaultController --value,输出systemd即表示系统原生适配;再运行cat /proc/1/cgroup,若路径含/sys/fs/cgroup/systemd或大量0::/开头条目,说明cgroup v2已启用,此时必须用systemd驱动。
第二步:修改Docker服务启动参数——编辑/lib/systemd/system/docker.service,找到ExecStart=行,在其末尾追加--exec-opt native.cgroupdriver=systemd。切勿只改/etc/docker/daemon.json,否则若docker.service里已有同名参数,会导致dockerd启动失败。
第三步:重载并重启Docker——执行systemctl daemon-reload && systemctl restart docker,然后立刻用docker info | grep "Cgroup Driver"验证输出是否已变为systemd。
仅当无法动Docker时才改kubelet
方法一:直接编辑kubelet配置文件
打开/var/lib/kubelet/config.yaml,定位cgroupDriver:字段,将其值明确改为systemd(注意缩进对齐,YAML对空格敏感)。保存后执行systemctl restart kubelet。
方法二:若集群已初始化过,必须先清理残留状态——运行kubeadm reset -f,否则旧cgroup路径仍被引用,可能导致Pod卡在ContainerCreating或cadvisor指标异常。
注意:【不要去改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf里的Environment变量】,v1.22+版本中kubeadm会覆盖该文件中的--cgroup-driver参数,改了也无效。


















