kubectl get nodes
kubectl describe node node1 | grep -A15 Conditions
Conditions
Ready False 면 kubelet 이 보고를 못 하고 있다
MemoryPressure 메모리 부족 → 파드 퇴출이 시작된다
DiskPressure 디스크 부족 → 이미지 GC · 파드 퇴출
PIDPressure PID 고갈
NotReady 의 흔한 원인
- kubelet 이 죽었다 — systemctl status kubelet
- CNI 플러그인이 준비 안 됨 — 노드가 NotReady 로 고정된다
- (파드 네트워크를 설정할 수 없어서다)
- 디스크가 찼다 — 이미지·로그가 원인인 경우가 많다
- 인증서 만료 — kubelet 이 API 서버와 못 붙는다
- 노드 자체가 죽었다 — 네트워크 단절 포함
# 노드에 들어가서
journalctl -u kubelet -f --since '10 min ago'
crictl ps -a # 컨테이너 목록 (docker ps 대신)
crictl logs <container-id>
df -h /var/lib/kubelet /var/lib/containerd
crictl 을 쓰는 이유 — 런타임이 containerd 라 docker 명령이 없다 "쿠버네티스가 Docker 를 뺐다" 의 실제 결과가 이것이다
디스크 압박이 만드는 연쇄
디스크가 차면
- kubelet 이 이미지 GC 를 돌린다
- 그래도 부족하면 파드를 퇴출한다 (BestEffort 부터)
- 새 파드가 이미지를 못 받는다
- 노드가 NotReady 로 빠진다
원인 대부분이 로그다
- 컨테이너 로그 로테이션 미설정
- emptyDir 에 큰 파일을 쌓는 워크로드
- 안 쓰는 이미지 누적
노드가 죽으면 파드는 어떻게 되나
- ① 노드가 상태 보고를 멈춘다
- ② 일정 시간(기본 40초) 후 Ready=Unknown 이 된다
- ③ 노드 컨트롤러가 NoExecute 테인트를 건다
- ④ 파드에 tolerationSeconds(기본 300초)가 붙어 있어 그만큼 버틴다
- ⑤ 그 뒤 파드가 퇴출되고 다른 노드에 다시 생긴다
즉 노드 장애에서 복구까지 기본 설정으로 5분 이상 걸린다 더 빠른 복구가 필요하면 이 값들을 조정한다 (단 너무 짧으면 일시적 네트워크 흔들림에도 파드가 옮겨 다닌다)
노드 압박 임계값
kubelet 이 퇴출을 시작하는 기준이 있다 (기본값 예)
| memory.available | < 100Mi | |
|---|---|---|
| nodefs.available | < 10% | |
| imagefs.available | < 15% | |
| nodefs.inodesFree | < 5% |
soft 와 hard 가 있다
soft 유예 기간을 두고 정상 종료로 퇴출
hard 즉시 퇴출
퇴출된 파드는 Evicted 상태로 남는다 — 자동으로 정리되지 않는다
- kubectl delete pods --field-selector=status.phase=Failed -A
노드 교체 절차
-
① kubectl cordon node1 새 파드 차단
-
② kubectl drain node1 --ignore-daemonsets --delete-emptydir-data
-
③ 작업 (업그레이드 · 재부팅 · 교체)
-
④ kubectl uncordon node1 다시 받는다
-
주의
- PDB 때문에 drain 이 멈출 수 있다 (정상 동작이다)
- DaemonSet 파드는 옮길 수 없어 제외한다
- 로컬 볼륨을 쓰는 파드는 옮길 곳이 없다 — 별도 계획이 필요하다
면접 함정
- ❌ "NotReady면 파드도 죽는다" → 파드는 계속 돌 수 있다. 보고와 새 배포가 멈출 뿐이다.
- ❌ "노드가 죽으면 즉시 옮겨간다" → 기본 설정으로 5분 이상 걸린다.