Kubernetes

[ERROR] kubelet.service: Unit entered failed state.

chaenii 2022. 2. 4. 13:48

[kubelet 상태 점검]

$ systemctl status kubelet

kubelet.service: Unit entered failed state.
kubelet.service: Failed with result 'exit-code'.

 

[kubelet log 출력]

$ journalctl -a -f

"Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"cgroupfs\" is different from docker cgroup driver: \"systemd\""

 

⚠️ kubelet의 cgroup driver는 cgroupfs이고, docker의 cgroup driver는 systemd이기 때문에 cgroup driver가 일치하지 않아서 발생하는 오류이다.

 


해결 방법

 

[방법1] kubelet ConfigMap 변경하기 (only master node)

✅ master node에서는 kubectl 명령어를 이용해 configMap을 변경할 수 있다.

 

1. kubelet ConfigMap 이름을 찾기

$ kubectl get cm -n kube-system | grep kubelet-config
kubelet-config-1.20                  1      20h
kubelet-config-1.21                  1      88m
kubelet-config-1.22                  1      77m

 

2. kubelet-config 파일 편집하기 (replace x.yy with the Kubernetes version)

$ kubectl edit cm kubelet-config-x.yy -n kube-system

 

3. 기존 cgroupDriver값을 수정하거나 다음과 같은 새 필드를 추가한다.

cgroupDriver: systemd

[방법2] 모든 노드에서 cgroup 드라이버 업데이트

1. 해당 노드 drain하기

$ kubectl drain <node-name> --ignore-daemonsets

 

2. kubelet 중지하기

$ systemctl stop kubelet

 

3. container runtime 중지하기

$ systemctl stop docker.service

 

4. container runtime cgroup driver를 systemd로 변경

$ docker info | grep -i cgroup
$ cat <<EOF | sudo tee /etc/docker/daemon.json 
{ 
    "exec-opts": ["native.cgroupdriver=systemd"], 
    "log-driver": "json-file", 
    "log-opts": { "max-size": "100m" }, 
    "storage-driver": "overlay2" 
} 
EOF

 

6. /var/lib/kubelet/config.yaml을 cgroupDriver: systemd로 설정하기

$ vi /var/lib/kubelet/config.yaml

 

7. container runtime start

$ systemctl daemon-reload
$ systemctl restart docker

 

8. kubelet start

$ systemctl restart kubelet

9. uncorden node

kubectl uncordon <node-name>

 

 

kubelet 정상 작동 확인~😀

 

 


https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/

 

 

 

 

반응형