← 아티클 목록

쿠버네티스 노드 NotReady — 진단과 복구 (kubectl 실전)

2026-10-12#kubernetes#트러블슈팅#노드

kubectl get nodes에서 한 노드가 NotReady로 떠 있으면, 그 노드 위의 파드들은 더 이상 정상 동작을 보장받지 못하고 일정 시간 뒤 다른 노드로 쫓겨납니다(eviction). NotReady는 "kubelet이 API 서버에 정상 신호를 못 보내고 있다"는 결과 상태이고, 진짜 원인은 kubelet·네트워크·리소스 중 하나인 경우가 대부분입니다.

1단계 — 왜 NotReady인지 본다

Kubernetes
# 노드 상태와 마지막 하트비트
kubectl get nodes -o wide

# Conditions(메모리·디스크·PID 압박)와 이벤트
kubectl describe node <node>

describeConditions 블록에서 Ready 외에 DiskPressure, MemoryPressure, PIDPressureTrue인지 먼저 확인합니다. 여기서 원인의 절반이 갈립니다.

2단계 — 노드에 들어가 kubelet을 본다

서버 터미널
# 노드에 SSH 후
systemctl status kubelet
journalctl -u kubelet -n 100 --no-pager

kubelet이 죽어 있거나 재시작을 반복하면 로그 마지막 줄에 원인(인증서 만료, CNI 미동작, 컨테이너 런타임 다운)이 거의 그대로 찍힙니다.

원인별 해결

Conditions / 로그원인해결
kubelet stopped posting statuskubelet 다운systemctl restart kubelet
DiskPressure: True디스크 가득 참이미지·로그 정리(crictl rmi --prune), 디스크 확장
container runtime is downcontainerd/docker 다운systemctl restart containerd
cni plugin not initializedCNI 미동작CNI 파드(calico/flannel) 재배포·로그 확인
certificate has expiredkubelet 인증서 만료인증서 갱신 후 kubelet 재시작

복구가 안 되거나 시간이 걸릴 때는, 다른 노드로 파드를 안전하게 옮기고 작업합니다.

Kubernetes
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
# 복구 후
kubectl uncordon <node>

복구 체크리스트

Kubernetes
kubectl describe node <node>         # Conditions·이벤트
systemctl status kubelet             # 노드에서 kubelet 생사
journalctl -u kubelet -n 100         # 죽은 직전 로그
df -h /var/lib                       # 디스크 압박 여부

"하트비트가 끊겼나 → 디스크/메모리 압박인가 → 런타임/CNI가 죽었나" 순으로 보면 원인이 좁혀집니다.


노드를 일부러 drain하고 파드가 재배치되는 과정을 직접 확인하는 실습은 쿠버네티스 트랙에서 해볼 수 있습니다 — 회원가입 없이 무료로.