K8S 서비스 품질 QoS —— 꿈을 이루는 길

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의 하드 선호도 예약 전략을 사용하여 추가 노드에 예약할 수 있습니다.

추천

출처blog.csdn.net/qq_34777982/article/details/130949805