본문 바로가기

About/Kubernetes

[k8s] 파드의 우선순위(Pod QoS, Quality of Service)

 쿠버네티스는 하나의 클러스터에서 여러 개의 컨테이너 애플리케이션을 실행할 수 있습니다. 하지만 예를 들어 '온라인 처리를 제공하는 컨테이너으 우선순위를 높이고 싶다', '배치 처리를 하는 리소스의 우선순위를 낮추고 싶다' 와 같은 조건을 주고 싶은 경우 QoS 클래스를 사용하여 파드에 우선순위를 붙일 수 있습니다.

파드의 QoS 클래스 조건

쿠버네티스에서는 파드에 대해 3개의 Quality of Service(QoS) 클래스를 제공하고 있습니다. 이 QoS는 Resource Requests와 리소스의 상한을 정하는 Resource Limits 조건을 바탕으로 우선순위가 다음과 같이 정해집니다.

BestEffort 파드 안의 어떤 컨테이너에도 Resource Requests와 Resource Limit이 설정되어 있지 않았을 때 설정 된다.
Bustable BestEffort와 Guaranteed 이외의 경우에 설정된다.
Guaranteed - CPU와 메모리 둘 다에 Resource Requests와 Resource Limits가 설정되어 있는 경우
- 파드 안의 각각의 컨테이너에 설정되어 있는 경우
- Resource Requests와 Resource 값이 각각 똑같은 경우에 설정된다.

Pod QoS

 

CPU와 메모리, QoS의 관계를 표로 나타내면 다음과 같습니다.

CPU 설정 메모리 설정 QoS Classes
- - BestEffort
- Requests < Limits Burstable
- Requests = Limits Burstable
Requests < Limits - Burstable
Requests < Limits Requests < Limits Burstable
Requests < Limits Requests = Limits Burstable
Requests = Limits Requests = Limits Guranteed

 

여러 컨테이너로 구성된 파드의 경우 먼저 각 컨테이너에 각각 QoS를 할당합니다. 모든 컨테이너가 BestEffort라면 파드의 QoS는 Best Effort가 되며, 모든 컨테이너가 Guranteed라면 파드의 QoS도 Guranteed가 됩니다. 어떤 조건에도 해당하지 않는 경우 BestEffort가 됩니다.

QoS는 어떻게 이용되는가?

쿠버네티스에서는 리소스가 부족할 때 QoS에 따라 어떤 파드의 컨테이너 애플리케이션을 Kill할지 정합니다. 가장 우선순위가 낮고 처음에 kill되는 것은 BestEffort이며, 그 다음이 Burstable, 마지막이 Guranteed가 kill됩니다. Guranteed는 시스템이 메모리를 필요로 하는 경우에만 kill됩니다. 만일 동일한 QoS의 경우 OutOfMemory Score에 따라 어떤 프로세스를 kill할지 비교하여 정합니다.

위 그림에서 Pod2와 Pod3가 같은 QoS 클래스이고 Pod하나를 삭제해야한다고 했을 때 두 파드의 Request Memory와 실제 사용중인 Memory 이용하여 OOM(OutOfMemory Score)를 비교합니다. OOM Score는 (사용 중인 메모리)/(Request 메모리)로 계산합니다. Pod2의 경우 4G/5G 이므로 75%, Pod3의 경우 4G/8G이므로 50% 입니다. 이 때 사용량이 더 높은 Pod가 제거되므로 Pod2가 삭제될 것입니다.

Pod의 QoS 확인

파드에 설정된 QoS의 확인은 kubectl describe로 할 수 있습니다.

kubectl describe pod <파드명> | grep QoS

 


QoS에 따라 파드의 우선순위가 정해지고, 리소스가 부족하여 파드가 삭제될 때의 순서가 정해지므로 이러한 동작을 고려하여 애플리케이션에 적절한 QoS를 설정하는 것이 좋아보입니다.

참고