Pod eviction과 OOM Killer

Ryu·2022년 5월 16일
0

2021-archive

목록 보기
6/8

2021년에 작성한 노트를 옮겨 적은 것입니다.

참고 및 출처: https://ssup2.github.io/theory_analysis/Kubernetes_Pod_Eviction/

메모리가 부족한 경우

  • 어떤 프로세스가 Pod에 설정된 resources.limits.memory보다 많은 메모리를 사용할 때
  • 한 노드에 가용한 메모리가 더 이상 없을 때

Pod memory limit

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. 사용자가 특별히 지정한 프로세스를 선택합니다.

Node memory 부족

Kubelet이 cAdvisor 폴링을 통해서 노드의 메모리 사용량을 모니터링하고 있고 모든 컨테이너의 메모리 사용량이 노드 메모리보다 크게 될 때 Pod eviction을 수행한다.

Kubelet이 Pod eviction 수행하기도 전에 갑작스럽게 메모리 사용량이 늘면 OOMkiller가 임의이 container를 죽인다.

Pod QoSoom_score_adj
Guaranteed-998
Burstablemin(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999)
BestEffort1000

위 두 경우 모두 OOMKilled status를 갖게됨.

0개의 댓글