1. 程式人生 > 實用技巧 >【kubeadm初始化報錯】failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

【kubeadm初始化報錯】failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

復現場景

環境

  • 系統:Centos7
  • kubernetes:1.18.5
  • docker:19.03.9

復現步驟

1、通過 yumrpm 安裝 kubelet kubectl kubeadm,並 systemctl enable --now kubelet

2、安裝 docker 並配置 (kubernetes官方推薦docker等使用systemd作為cgroupdriver)

mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"data-root": "/data/docker"
}
EOF

3、kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.18.5 提示 [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/,到最後初始化失敗,提示kubelet 健康狀態不正常

4、檢視 kubelet 狀態 systemctl status kubelet,提示error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"

解決方案

1、只修改docker

docker 不再設定native.cgroupdriver=systemd,或將 systemd 改成 cgroupfs,重啟docker systemctl daemon-reload && systemctl restart docker

檢查 docker info|grep "Cgroup Driver" 是否輸出 Cgroup Driver: cgroupfs

kubelet 預設cgroupdriver是cgroupfs,但是它竟然推薦用systemd,interesting!

2、分別修改docker與控制平臺的kubelet為systemd 【官方推薦】

鑑於用的k8s版本有點新,本文只記錄當前1.18.x的修改方式,其他版本請參詳官方:

重置未初始化成功的kubeadm配置

echo y|kubead reset

修改docker,只需在/etc/docker/daemon.json中,新增"exec-opts": ["native.cgroupdriver=systemd"]即可,本文最初的docker配置可供參考。

修改kubelet:

cat > /var/lib/kubelet/config.yaml <<EOF
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF

重啟docker 與 kubelet:

systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet

檢查 docker info|grep "Cgroup Driver" 是否輸出 Cgroup Driver: systemd

再次執行kubeadm init時,我發現kubeadm將cgroupDriver的配置到了/var/lib/kubelet/kubeadm-flags.env

後續檢查/var/lib/kubelet/config.yaml 發現,裡邊已經被新的配置替換掉了;

另外,在配置期間,我這裡一直出現kubelet健康狀態不正常的問題,重置了kubeadm,刪除了執行使用者的家目錄下的~/.kube,之後正常了

ps: 有趣的是,kubelet自啟動後,會週期性重啟,還是會提示docker的cgroup driver是與kubelet不同,等kubeadm初始化成功就不這樣了。

本文參考自官方檔案,版本1.18.5