kubectl 이 API 서버에 붙지 못한다.
The connection to the server 10.0.0.10:6443 was refused - did you specify the right host or port?
컨트롤 플레인 노드에서 kubelet 로그를 보면 다음이 나온다.
systemd[1]: Failed to load environment files: No such file or directory
systemd[1]: kubelet.service failed to run 'start' task: No such file or directory
systemd[1]: Failed to start kubelet: The Kubernetes Node Agent.
kubeadm 으로 만든 클러스터에서 API 서버는 정적 파드다. 정적 파드는 kubelet 이 /etc/kubernetes/manifests/ 를 읽어 직접 띄운다. 즉 kubelet 이 뜨지 않으면 API 서버도 뜨지 않고, 6443 포트를 듣는 프로세스가 아예 없다.
그래서 kubectl 쪽 오류만 보고 네트워크나 인증서를 뒤지면 시간을 쓴다. 먼저 노드에서 kubelet 상태를 본다.
systemctl status kubelet
journalctl -u kubelet -n 100 --no-pager
kubelet 유닛은 드롭인으로 환경 파일을 참조한다.
systemctl cat kubelet
출력에서 EnvironmentFile= 줄을 본다. kubeadm 이 설치한 드롭인은 보통 다음과 같다.
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
EnvironmentFile=-/etc/sysconfig/kubelet
경로 앞의 - 는 파일이 없어도 무시하라는 뜻이다. 이 표시가 없는 줄의 파일이 없으면 기동이 실패한다. 따라서 - 없이 적힌 경로가 있는지, 그 파일이 실제로 있는지를 본다.
ls -l /var/lib/kubelet/kubeadm-flags.env /etc/sysconfig/kubelet /etc/default/kubelet 2>&1
배포판에 따라 RHEL 계열은 /etc/sysconfig/kubelet, Debian 계열은 /etc/default/kubelet 을 쓴다.
환경 파일만 사라진 경우. 빈 파일이나 원래 내용을 다시 만든다. kubeadm-flags.env 는 컨테이너 런타임 소켓과 노드 이름 같은 값을 담는다.
cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime-endpoint=unix:///run/containerd/containerd.sock --pod-infra-container-image=registry.k8s.io/pause:3.10"
내용을 모르면 같은 버전의 정상 노드에서 복사해 노드 이름 부분만 맞춘다. 정상 노드가 없으면 kubeadm 이 다시 만들게 한다.
kubeadm init phase kubelet-start
워커 노드라면 다음을 쓴다.
kubeadm join phase kubelet-start --config <join 설정 파일>
드롭인 자체가 깨진 경우. 패키지를 다시 깔면 원본 드롭인이 복구된다.
sudo dnf reinstall -y kubelet
고친 뒤 반영한다.
sudo systemctl daemon-reload
sudo systemctl restart kubelet
kubelet 이 떴어도 API 서버가 올라오기까지 시간이 걸린다. 정적 파드가 뜨고 있는지 컨테이너 런타임에서 직접 본다.
sudo crictl ps -a | grep -E 'kube-apiserver|etcd'
sudo crictl logs $(sudo crictl ps -a -q --name kube-apiserver | head -1)
포트가 열렸는지 본다.
ss -lntp | grep 6443
이제 kubectl 이 붙는다.
kubectl --kubeconfig /etc/kubernetes/admin.conf get nodes
kubelet 이 떴는데도 API 서버가 안 뜨면 원인이 다른 곳이다. etcd 가 먼저 떠야 하고, 인증서 만료도 흔한 원인이다.