Kubernetes

Node가 Not Ready 상태일 때의 원인과 해결 방법

hdoo 2025. 3. 3. 07:53

개요


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 상태가 발생하더라도 신속하게 대응할 수 있도록 준비하는 것이 중요합니다.