[Retry, k8s] 31. 리소스 관리, 오토 스케일링 - QoS Class

Date:     Updated:

카테고리:

태그:


04. QoS Class


‘QoS Class’(Quality of Service Class)는 쿠버네티스에서 운영하는 컨테이너가 자원을 어떻게 사용하고, 어떤 순서로 중단될 것인지를 결정하는 방식을 말한다.

파드의 Requests/Limits 설정에 따라 자동으로 QoS Class 값이 설정되게 되어 있으며, QoS Class는 사용자가 직접 설정하지 않고 조건을 아래 표의 조건을 바탕으로 쿠버네티스의 Status에 자동으로 설정되는 값이다.

QoS Class 조건
BestEffort Requests/Limits 모두 미지정 (우선순위 : 3)
Guaranteed Requests/Limits가 같고 CPU와 메모리 모두 지정되어 있음 (우선순위 : 1)
Burstable Guaranteed를 충족하지 못하고 한 개 이상의 Requests/Limits가 설정되어 있음 (우선순위 : 2)

‘QoS Class’는 쿠버네티스가 컨테이너에 ‘oom score(Out Of Memory 상황, 즉 메모리 부족 상황)’를 설정할 때 사용된다. ‘oom score’는 -1000부터 1000까지의 범위로 설정될 수 있으며, 점수가 높을수록 먼저 종료된다.

따라서, 쿠버네티스 시스템에서 메모리 부족 상황이 발생했을 때, 컨테이너들은 BestEffort, Burstable, Guaranteed의 순서로 종료되며, 그 중 Guaranteed 클래스는 쿠버네티스 시스템 구성 요소보다 우선순위가 높은 컨테이너가 없으므로, 안정적으로 실행될 수 있다.


(1) BestEffort

리소스 제한이 전혀 없는 상태로, LimitRange가 설정된 환경에서는 지정되지 않은 경우에도 자동으로 리소스 제한이 설정되므로 BestEffort의 QoS Class는 되지 않는다.

apiVersion: v1
kind: Pod
metadata:
    name: sample-qos-besteffort
spec:
    containers:
    - name: nginx-container
      image: nginx:1.16


(2) Guaranteed

최소한으로 사용하는 리소스와 최대한으로 사용하는 리소스에 차이가 없는 상태로, Requests와 Limits의 차이가 큰 파드가 있으면 그 파드에 노드의 리소스를 많이 소비하게 되어 다른 파드에 영향을 줄 수 있으므로 주의해야 한다.

모든 파드를 QoS Class를 Guaranteed로 한더면, 부하 증가에 따른 다른 파드로의 영향을 피할 수 있는 장점이 있다. 하지만 집약률이 낮아지는 단점도 생긴다.

apiVersion: v1
kind: Pod
metadata:
    name: sample-qos-guaranteed
spec:
    containers:
    - name: nginx-container
      image: nginx:1.16
      resources:
        requests: 
            memory: "1024Mi"
            cpu: "500m"
        limits:
            memory: "1024Mi"
            cpu: "500m"


(3) Burstable

특정 리소스만 제한을 설정하거나 Requests보다 Limits가 큰 경우에 Burstable이 해당된다. 이름 그대로 변동 요소가 크기 때문에 최악의 경우 노드가 과부하를 받을 가능성이 있다.

apiVersion: v1
kind: Pod
metadata:
    name: sample-qos-burstable
spec:
    containers:
    - name: nginx-container
      image: nginx:1.16
      resources:
        requests: 
            cpu: "250m"
        limits:
            cpu: "500m"


(4) QoS Class 확인

# 파드 목록과 QoS Class 할당 표시
$ kubectl get pods -o custom-columns="NAME:{.metadata.name},QoS Class:{.status.qosClass}"

KUBERNETES 카테고리 내 다른 글 보러가기

댓글 남기기