Node가 Not Ready 상태일 때의 원인과 해결 방법
개요
Kubernetes에서 kubectl get nodes 명령을 실행했을 때 특정 노드가 NotReady 상태로 표시되는 경우가 있습니다. 이는 노드가 정상적으로 클러스터에 참여하지 못하고 있으며, 해당 노드에서 실행 중인 워크로드에도 영향을 미칠 수 있음을 의미합니다.
이 글에서는 NotReady 상태가 발생하는 주요 원인과 해결 방법을 정리하여, Kubernetes 운영 시 문제를 신속하게 진단하고 복구하는데 도움이 되셨으면 합니다.
NotReady 상태가 발생하는 경우
Kubelet 프로세스 이상
원인: Kubelet 프로세스가 충돌했거나 중지됨
확인 방법:
systemctl status kubelet
journalctl -u kubelet --no-pager | tail -n 20
설명: Kubelet이 실행되지 않으면 노드가 상태를 클러스터에 보고하지 못하여 NotReady가 됩니다.
네트워크 연결 문제
원인: 마스터 노드와의 네트워크 단절, CNI 플러그인 오류
확인 방법:
ping <node-ip>
kubectl get pods -n kube-system -o wide | grep calico #calico, cilium 등, CNI 플러그인 확인.
설명: API 서버와의 통신이 불가능하면 노드가 NotReady 상태가 됩니다.
디스크 공간 부족
원인: 디스크 공간이 가득 차서 Kubelet이 실행되지 못함
확인 방법:
df -h
kubectl describe node <node-name> | grep "DiskPressure"
설명: 디스크 압박(DiskPressure)이 발생하면 노드는 NotReady 상태가 됩니다.
CPU/메모리 부족
원인: 과부하로 인해 노드 리소스 부족
확인 방법:
kubectl describe node <node-name> | grep -E "MemoryPressure|PIDPressure"
top
설명: MemoryPressure가 감지되면 노드가 NotReady 상태가 될 수 있습니다.
컨트롤 플레인 문제
원인: kube-apiserver 또는 etcd 장애, kube-proxy 오류
확인 방법:
kubectl get pods -n kube-system | grep -E "etcd|kube-apiserver|kube-proxy"
설명: 컨트롤 플레인과 연결되지 않으면 노드가 NotReady 상태가 됩니다.
인증서 만료 문제
원인: Kubelet 인증서(/var/lib/kubelet/pki/kubelet-client.crt) 또는 API 서버 인증서 만료
확인 방법:
openssl x509 -in /var/lib/kubelet/pki/kubelet-client.crt -noout -enddate
설명: Kubernetes의 kubelet 및 API 서버는 인증서를 사용하여 상호 인증을 수행합니다. 인증서가 만료되면 kubelet이 API 서버와 통신할 수 없어 노드가 NotReady 상태가 됩니다.
해결 방법
Kubelet 재시작
systemctl restart kubelet
네트워크 문제 해결
마스터 노드와의 연결 확인:
ping <master-node-ip>
CNI 플러그인 재설정:
kubectl delete pod <cni-pod-name> -n kube-system
방화벽 규칙 확인:
iptables -L -v -n
디스크 정리
해결 예시: 디스크를 차지하고 있는 로그 삭제
rm -rf /var/log/*.log
리소스 최적화
해결 예시: 리소스를 많이 차지하고 있는 Pod 삭제
kubectl top pod -A
kubectl delete pod <pod-name> -n <namespace>
컨트롤 플레인과 연결 문제 해결
해결 예시: kube-proxy 연결 재시작
systemctl restart kube-proxy
인증서 갱신 및 재시작
인증서의 갱신과정은 설치한 k8s 방법(kubeadm, kubespary 등)에 따라 다를 수 있으며 아래의 내용은 참고사항입니다.
인증서 수동 갱신:
kubeadm certs renew all
systemctl restart kubelet
kubelet 인증서 갱신:
systemctl stop kubelet
rm -f /var/lib/kubelet/pki/kubelet-client.*
systemctl start kubelet
kubelet이 API 서버와 다시 연결되면서 새로운 인증서를 자동으로 요청합니다.
정리
Kubernetes에서 노드가 NotReady 상태가 되는 주요 원인은 Kubelet 오류, 네트워크 문제, 디스크 및 리소스 부족, 컨트롤 플레인 장애, 그리고 인증서 만료 등입니다. 원인을 신속하게 파악하고 적절한 조치를 취하면 클러스터의 안정성을 유지할 수 있습니다.
빠른 점검 체크리스트
1. systemctl status kubelet 확인 (Kubelet 상태 점검)
2. ping <master-node-ip> (네트워크 연결 점검)
3. df -h (디스크 용량 확인)
4. kubectl describe node <node-name> (리소스 상태 및 인증서 만료 여부 확인)
5. kubectl get pods -n kube-system (kube-system namespace 내부 컴포넌트 정상 동작 여부 확인)
위 체크리스트를 활용하여 문제를 빠르게 해결하고, 클러스터 운영 중 NotReady 상태가 발생하더라도 신속하게 대응할 수 있도록 준비하는 것이 중요합니다.