K8S의 애플리케이션 서비스 품질(QoS) 소개
QoS(Quality of Service) 클래스는 Pod의 예약 및 제거 우선순위를 결정하는 Kubernetes 개념입니다.
Kubelet에서 포드가 제거되는 순서를 관리하고 고급 CPU 관리 전략을 사용하여 더 복잡한 포드 스케줄링 결정을 허용하는 데 사용됩니다.
QoS는 Kubernetes 자체에서 포드에 할당됩니다. 그러나 DevOps는 Pod 내의 개별 컨테이너에 대한 리소스 요청 및 제한을 처리하여 컨테이너에 할당된 QoS 클래스를 제어할 수 있습니다.
QoS 클래스 분류
보장: POD의 모든 컨테이너(초기화 컨테이너 포함)에는 제한이 균일하게 설정되어야 하며 설정 매개변수가 일관되어야 합니다.
Burstable: POD에는 메모리 또는 CPU 요청이 설정된 컨테이너가 있습니다.
BestEffort: POD의 모든 컨테이너는 CPU 및 메모리 요청과 제한을 지정하지 않습니다.
Guaranteed
对于 QoS 类为 Guaranteed 的 Pod:
Pod 中的每个容器,包含初始化容器,必须指定内存 请求和 内存 限制,并且两者要相等。
Pod 中的每个容器,包含初始化容器,必须指定 CPU 请求和 CPU 限制,并且两者要相等。
举例:
apiVersion: v1
kind: Pod
metadata:
name: qos-demo
spec:
containers:
- name: qos-demo
image: nginx
resources:
limits:
memory: "500Mi"
cpu: "700m"
requests:
memory: "500Mi"
cpu: "700m"
注意点:
如果容器指定了自己的内存limits,但没有指定内存requests,Kubernetes 会自动为它指定与内存limits匹配的内存requests。 同样,如果容器指定了自己的 CPU limits,但没有指定 CPU requests,Kubernetes 会自动为它指定与 CPU limits匹配的 CPU requests;
------------------------------------------------------------------------------
Burstable
如果满足下面条件,将会指定 Pod 的 QoS 类为 Burstable:
Pod 不符合 Guaranteed QoS 类的标准;
Pod 中至少一个容器具有内存 或 CPU requests;
举例:
apiVersion: v1
kind: Pod
metadata:
name: qos-demo2
spec:
containers:
- name: qos-demo2
image: nginx
resources:
limits:
memory: "500Mi"
requests:
memory: "200Mi"
--------------------------------------------------------------------------
BestEffort
对于 QoS 类为 BestEffort 的 Pod,Pod 中的容器必须没有设置内存和 CPU 限制或请求。
举例:
apiVersion: v1
kind: Pod
metadata:
name: qos-demo3
spec:
containers:
- name: qos-demo3
image: nginx
如何查看Qos
kubectl describe po qos-demo
QoS 우선순위
낮은 것부터 높은 것까지(왼쪽에서 오른쪽으로) 3개의 QoS 우선 순위:
BestEffort 포드 -> 버스트 가능 포드 -> 보장 포드
퇴학 원칙
압축 가능한 리소스: CPU
압축 리소스 섹션에서 언급한 바와 같이 CPU는 압축 가능한 리소스로 Pod 사용량이 설정된 제한 값을 초과하면 Pod 내 프로세스의 CPU 사용량이 제한되지만 종료되지는 않습니다.
압축할 수 없는 리소스: 메모리
노드가 OOM일 때 Guaranteed, Burstable 및 BestEffort Pod를 처리하는 방법은 무엇입니까?
Kubelet이 재활용할 수 있기 전에 노드의 메모리가 부족하면 즉, 노드 oom이 발생하면 oom_killer는 oom_score에 따라 컨테이너를 종료합니다.
oom_score_adj는 "보장된" Pod의 컨테이너에 대해 "-998"입니다.
"BestEffort" 포드에 있는 컨테이너의 경우 "1000"입니다.
값이 "min(max(2, 1000-(1000*memoryRequestBytes)/machineMemoryCapacityBytes), 999")"인 Burstable Pod의 컨테이너입니다.
oom_killer는 QoS 수준이 가장 낮고 가장 많이 요청된 리소스보다 많은 컨테이너를 먼저 종료합니다. 이는 너무 많은 리소스 요청을 차지하는 컨테이너가 제거를 위해 Burstable에서 먼저 선택됨을 의미합니다.
모범 사례
1. 애플리케이션 유형별 분류: 핵심 애플리케이션(core) / 기존 애플리케이션(nomarl) / 추가 애플리케이션(extral)
2. 핵심 적용: 보장됨 / 일반 적용: 버스트 가능 / 추가 적용: BestEffort
3. 클러스터 노드는 코어 애플리케이션 노드/일반 애플리케이션 노드/추가 애플리케이션 노드로 나뉩니다.
4. 스케줄링 전략:
코어 애플리케이션: nodeAffinity의 기본 스케줄링 전략을 채택하여 코어 노드에 스케줄링할 수 있습니다.
일반 애플리케이션: nodeAffinity의 하드 선호도 예약 전략을 사용하여 일반 노드로 예약할 수 있습니다.
추가 애플리케이션: nodeAffinity의 하드 선호도 예약 전략을 사용하여 추가 노드에 예약할 수 있습니다.