QoS

Hermaeus Mora · · Devops

운영 DB 파드 상태 조회 중에 다음 값을 발견했다고 하자.

QoS Class: BestEffort

저게 뭘 의미하는 걸까? QoS는 Quality of Service의 약자로, kubelet이 파드를 Evict하고 OOM Killer가 프로세스를 죽이는 순서에 영향을 미친다.

QoS는 다음 3가지 값과 조건을 가진다.

  1. Guaranteed, 파드의 모든 컨테이너가 cpu, memory limit을 지정하고 각각 request == limit
  2. Burstable, Guaranteed가 아니면서 컨테이너 중 하나라도 request 또는 limit 존재
  3. 그 외 BestEffort

파드 우선순위가 같다면, kubelet은 리소스 사용량이 request를 초과하는 파드일수록 먼저 Evict 한다. 또한 파드 생성 시 계산한 QoS에 따라 oom_score_adj값을 다음과 같이 CRI에 전달한다(CRI는 /proc/<pid>/oom_score_adj 에 write)

  1. Guaranteed: -997
  2. Burstable: min(max(2, 1000 - (1000 * memoryRequest / machineMemoryCapacity)), 999), request가 노드 메모리 대비 클수록 낮은 값
  3. BestEffort: 1000

즉 위 의미는 운영 DB 파드가 kubelet에게도(request가 0으로 계산되므로), OOM Killer에게도 우선 제거 대상이라는 것이다.