kubectl get nodes에서 한 노드가 NotReady로 떠 있으면, 그 노드 위의 파드들은 더 이상 정상 동작을 보장받지 못하고 일정 시간 뒤 다른 노드로 쫓겨납니다(eviction). NotReady는 "kubelet이 API 서버에 정상 신호를 못 보내고 있다"는 결과 상태이고, 진짜 원인은 kubelet·네트워크·리소스 중 하나인 경우가 대부분입니다.
1단계 — 왜 NotReady인지 본다
Kubernetes
# 노드 상태와 마지막 하트비트
kubectl get nodes -o wide
# Conditions(메모리·디스크·PID 압박)와 이벤트
kubectl describe node <node>
describe의 Conditions 블록에서 Ready 외에 DiskPressure, MemoryPressure, PIDPressure가 True인지 먼저 확인합니다. 여기서 원인의 절반이 갈립니다.
2단계 — 노드에 들어가 kubelet을 본다
서버 터미널
# 노드에 SSH 후
systemctl status kubelet
journalctl -u kubelet -n 100 --no-pager
kubelet이 죽어 있거나 재시작을 반복하면 로그 마지막 줄에 원인(인증서 만료, CNI 미동작, 컨테이너 런타임 다운)이 거의 그대로 찍힙니다.
원인별 해결
| Conditions / 로그 | 원인 | 해결 |
|---|---|---|
kubelet stopped posting status | kubelet 다운 | systemctl restart kubelet |
DiskPressure: True | 디스크 가득 참 | 이미지·로그 정리(crictl rmi --prune), 디스크 확장 |
container runtime is down | containerd/docker 다운 | systemctl restart containerd |
cni plugin not initialized | CNI 미동작 | CNI 파드(calico/flannel) 재배포·로그 확인 |
certificate has expired | kubelet 인증서 만료 | 인증서 갱신 후 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하고 파드가 재배치되는 과정을 직접 확인하는 실습은 쿠버네티스 트랙에서 해볼 수 있습니다 — 회원가입 없이 무료로.