2021년에 작성한 노트를 옮겨 적은 것입니다.
참고 및 출처: https://ssup2.github.io/theory_analysis/Kubernetes_Pod_Eviction/
Swap을 사용할 수 없다면 OOMkiller가 해당 컨테이너의 특정 프로세스를 죽인다.
badness를 계산하여 kill할 프로세스를 정하므로 어떤 프로세스가 죽게될지는 모른다.
...
badness_for_task = total_vm_for_task / (sqrt(cpu_time_in_seconds) * sqrt(sqrt(cpu_time_in_minutes)))
...
1. 특정 프로세스를 죽임으로써, 최소한 양의 프로세스만 잃을 수 있어야 합니다.
2. 많은 메모리를 회수할 수 있어야 합니다.
3. 프로세스중 Leak 가 발생되지 않는 프로세스는 선택하지 않습니다.
4. 사용자가 특별히 지정한 프로세스를 선택합니다.
Kubelet이 cAdvisor 폴링을 통해서 노드의 메모리 사용량을 모니터링하고 있고 모든 컨테이너의 메모리 사용량이 노드 메모리보다 크게 될 때 Pod eviction을 수행한다.
Kubelet이 Pod eviction 수행하기도 전에 갑작스럽게 메모리 사용량이 늘면 OOMkiller가 임의이 container를 죽인다.
Pod QoS | oom_score_adj |
---|---|
Guaranteed | -998 |
Burstable | min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999) |
BestEffort | 1000 |
위 두 경우 모두 OOMKilled status를 갖게됨.