【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、通過 yum
或 rpm
安裝 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