[Retry, k8s] 31. 리소스 관리, 오토 스케일링 - QoS Class
카테고리: KUBERNETES
태그: kubernetes
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}"
댓글 남기기