요약
/etc/kubernetes/manifests 위치에 존재하는 쿠버네티스 핵심 컴포넌트 매니페스트 파일을 일시적으로 다른 경로로 옮겼다가 다시 재위치시켜라.
다양한 문제로 kube-apiserver나 kube-controller-manager, etcd, scheduler 파드가 제대로 동작하지 않을 수 있습니다.
물론 대부분의 오류는 해당 파드의 컨테이너에서 출력되는 로그를 보고 정확한 원인에 대해 대처를 해야 하는데요.
대처하기 어렵거나, 정확한 원인을 파악할 수 없는 경우 한번쯤 시도해 볼만한 방법입니다.
# 핵심 manifest 파일들을 인식할 수 있도록 임시로 옮겼다가 다시 재위치시킨다.
# 재생성이 안되면, kube-apiserver.yaml 파일 수정 후에 아래의 내용을 다시 시도
sudo mkdir -p /tmp/k8s-recovery
sudo mv /etc/kubernetes/manifests/*.yaml /tmp/k8s-recovery/
# kubelet 재시작 후, controller-manager, apisever 등 파드들이 자동으로 내려간 것을 확인
sudo mv /tmp/k8s-recovery/*.yaml /etc/kubernetes/manifests/
sudo systemctl restart kubelet
저의 경우에는 특정 노드에서만 핵심 컴포넌트들의 반복적인 에러 로그를 확인할 수 있었습니다.
인증서가 만료되었다는 문제로 인가에 실패했다는 로그였습니다.
kube-apiserver
"Unable to authenticate the request" err="[x509: certificate has expired or is not yet valid: current time 2025-05-13T00:25:26Z is after 2025-02-04T08:39:31Z, verifying certificate SN=, SKID=, AKID=│
│ ] "Unable to authenticate the request" err="[x509: certificate has expired or is not yet valid: current time 2025-05-13T00:25:27Z is after 2025-02-04T08:39:31Z, verifying certificate SN=, SKID=, AKID=
kube-controller-manager
미승인(Unauthorized)으로 kube-controller-manager의 리더 선출 과정에서 무언가 문제가 발생하였습니다.
E0513 00:31:56.027551 1 leaderelection.go:332] error retrieving resource lock kube-system/kube-controller-manager: Unauthorized
그래서 현재 쿠버네티스 인증서를 확인해 보았지만, 만료된 인증서를 찾을 수 없었습니다.
또한, 로그에 출력되는 SN를 가진 인증서도 확인할 수 없었습니다.
# 만료된 인증서 보이지 않음
sudo kubeadm certs check-expiration
# api-server 마운트 진행된 호스트 시스템의 위치에서 확인해 보아도 로그에 나오는 인증서 시리얼 넘버를 찾을 수 없음
find /var/lib/kubelet/pki -name "*.crt" -exec openssl x509 -in {} -noout -serial
그렇게 한참을 원인에 대해 찾아보던 중, kube-controller-manager의 unauthorized 문제를 겪는 github issue를 발견하였습니다.
https://github.com/kelseyhightower/kubernetes-the-hard-way/issues/354
Problems with authorization of kube-controller-manager and kube-scheduler · Issue #354 · kelseyhightower/kubernetes-the-hard-w
E0522 21:53:26.598561 1 leaderelection.go:224] error retrieving resource lock kube-system/kube-controller-manager: Unauthorized E0522 21:54:37.749664 1 reflector.go:205] k8s.io/kubernetes/vendor/k8...
github.com
kubeadm으로 쿠버네티스 클러스터를 구성하게 되면, controller, scheduler, etcd, apiserver 핵심 컴포넌트들이 static pod형태로 실행됩니다.
해당 static pod의 manifest는 노드의 /etc/kubernetes/manifests 에 기본적으로 위치하게 됩니다.
/etc/kubernetes/manifests 위치에 존재하는 매니페스트들을 일시적으로 다른 경로로 옮긴 후에 다시 원래 경로로 위치시키니, 해당 static pod가 재시작 되면서 문제를 해결할 수 있었습니다.
# 핵심 manifest 파일들을 인식할 수 있도록 임시로 옮겼다가 다시 재위치시킨다.
# 재생성이 안되면, kube-apiserver.yaml 파일 수정 후에 아래의 내용을 다시 시도
sudo mkdir -p /tmp/k8s-recovery
sudo mv /etc/kubernetes/manifests/*.yaml /tmp/k8s-recovery/
# kubelet 재시작 후, controller-manager, apisever 등 파드들이 자동으로 내려간 것을 확인
sudo mv /tmp/k8s-recovery/*.yaml /etc/kubernetes/manifests/
sudo systemctl restart kubelet
/etc/kubernetes/manifests 위치의 manifest yaml 파일을 수정하거나 옮기게 되면 해당 static pod가 종료되거나 재시작도니, 작업에 유의하시길 바랍니다.
'Kubernetes' 카테고리의 다른 글
kubernetes ingress (0) | 2025.04.20 |
---|---|
사이드카 활용 패턴과 namespace 활용 전략 (0) | 2025.04.13 |
kubernetes - service, namespace, configmap, secret (0) | 2025.04.13 |
쿠버네티스 설치 및 기본 개념 (pod, replicaset, deployment) (0) | 2025.04.05 |
도커 컴포즈 (설치 및 개념) (0) | 2025.03.29 |