본문 바로가기

Kubernetes

kube-apiserver 트러블슈팅 (feat. kubelet)

집에서 쿠버네티스 클러스터를 구축하다보니 하루종일 컴퓨터를 켜 놓을 수는 없기에, 노드 컴퓨터들을 재부팅하는 경우가 자주 있다.

이번에 마스터노드 컴퓨터를 업데이트하고 재부팅하니 kubectl 명령어가 먹통이 됐었다.

 

kubectl get nodes 등의 명령어를 실행시켰을때

 

the connection to the server 6443 was refused



해당 오류가 발생했었고, kubeadm 으로 kubernetes 클러스터 구축을 하다보니, kube-apiserver가 pod로 떠야하는데, 어떠한 문제 때문인지 pod로 안떠서 먹통이 되는듯 싶었다.

lsof -i:6443 으로 6443포트 사용중인 프로세스를 확인해보니 역시 아무런 프로세스가 없었고, 이 때문이었다.

일단 kubeadm으로 클러스터를 구성하다보면, 필수적인 kube-apiserver, kube-controller-manager등이 kubelet에 의해 pod로 뜨게 된다.

 

여기까지 봐서 kubelet이 문제라는 것을 확인.

 

kubelet 로그를 확인해보았다.

sudo journalctl -xeu kubelet

 

"command failed" err="failed to run Kubelet: validate service connection: validate CRI v1 runtime API for endpoint \">unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"

 

이런 문구를 확인.

containerRuntimeEndpoint 확인해보라 해서 확인했더니 나의 경우에는 ""로 비어있었다.

sudo cat /var/lib/kubelet/config.yaml | grep containerRuntimeEndpoint

 

그래서 넣어줌.

containerRuntimeEndpoint: unix:///run/containerd/containerd.sock

 

이후 kubelet 재시작해줘도 안됨. 여전히 CRI 문제인 것 같아서 쿠버네티스 공식문서 확인.

 

https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd

 

Container Runtimes

Note: Dockershim has been removed from the Kubernetes project as of release 1.24. Read the Dockershim Removal FAQ for further details. You need to install a container runtime into each node in the cluster so that Pods can run there. This page outlines what

kubernetes.io


친절하게 나와있다.

CRI로 containerd를 사용하는 경우 필요한 설정이 있다.

 

To use the systemd cgroup driver in /etc/containerd/config.toml with runc, set

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

 

 

위의 부분을 false -> true로 수정 후 containerd 재시작

sudo systemctl restart containerd

 

sudo systemctl status kubelet

 

kubelet이 돌아왔다.

그리고 kubectl 명령어로 kube-apiserver 통신도 잘 되는 것을 확인할 수 있었다.