
[ 추가 설명 ]
- 여기서 "graceful eviction"을 만족하기 위해서는 "Soft eviction"을 설정해야 되는데
설정 값 중"terminationGracePeriodSeconds"를 지정하면 "SIGTERM => 앱 정리 -> 시간 초과 시 SIGKILL" 순서로 진행
K8s 운영 시 Pod가 강제 종료되는 경우는 크게 **K8s 레벨(Pod Disruption)**과 **Linux 레벨(OOM Kill)**로 나뉜다.
| 주체 | 관리 범위 | 동작 결과 | 동작 방식 | 한계 |
|---|---|---|---|---|
| kube-scheduler (trigger) | cluster | pod 축출(eviction) | Event 방식 (더 높은 PriorityClass pod scheduling 시) | memory pressure와 무관, preemption 시에 동작 |
| kubelet | node | pod 축출(eviction) | Polling 방식 (노드 가용 메모리가 eviction threshold에 도달 시) | polling으로 인해 node pressure 신호는 늦게 감지될 수 있음. 따라서 OOMKilled의 완전한 차단은 불가 |
| cgroup OOM killer | pod | container OOMKilled | Event 방식 (limit 초과 시) | cgroup V1은 kernel memory, 특히 spike로 문제되는 TCP socket buffer를 다루는데 제약이 크고, V2 및 global 조차 한계가 있음 |
| global OOM killer | node | process OOMKilled | Event 방식 (메모리 할당 실패 시) | kill 대상에 k8s, 시스템 프로세스까지 포함 → node 회복 불가 |
CPU는 "선점 자원(preemptible resource)"이기 때문에 프로세스 종료를 야기하지 않고 느려지기만 한다. 따라서 주로 memory만 논한다.
Pod Disruption
├── Voluntary (의도적)
│ ├── API-initiated Eviction
│ └── Preemption (Eviction 아님)
│
└── Involuntary (비의도적)
└── Node-pressure Eviction
누군가(운영자 또는 스케줄러)가 의도를 가지고 Pod를 제거하는 경우