在Kubernetes中配置Pod的服务质量

在Kubernetes中配置Pod的服务质量

Posted by Brian on Tuesday, September 19, 2023

介绍

Pod的服务质量类Qos全称是(Quality of Service),主要作用是在Node节点资源不足时使用Qos类来做出驱驱逐Pod的决定。它有如下三种:

Guaranteed

Guaranteed Pod 具有最严格的资源限制,并且最不可能面临驱逐。

判定依据:

Pod中的每个容器必有有Cpu、Memory的请求和限制,并且请求与限制的值必须相等。

Burstable

Burstable Pod 有一些基于 request 的资源下限保证,但不需要特定的 limit。Node资源不足时,在所有 BestEffort Pod 被驱逐后 这些 Pod 才会被驱逐。

判定的依据:

Pod 中至少一个容器有内存或 CPU 的 request 或 limit。

BestEffort

BestEffort QoS 类中的 Pod 可以使用未专门分配给其他 QoS 类中的 Pod 的节点资源。如果节点遇到资源压力,kubelet 将优先驱逐 BestEffort Pod。

判定的依据:

当 Pod 中的所有容器没有内存 limit 或内存 request,也没有 CPU limit 或 CPU request 时,Pod 才是 BestEffort

不难看出,如果节点遭遇资源压力时,驱逐顺序为 :

BestEffort -> Burstable -> Guaranteed

最佳实践

为了资源隔离,首先创建一个名为 qos-example 的 namespace

kubectl create namespace qos-example

创建一个Qos类为 Guaranteed 的Pod

qos-guaranteed-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: qos-demo
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-ctr
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "700m"

可以看到示例中,并没有设置 requests 。这是因为如果设置 了 limits 没有的设置的 requests 的话,Kubernetes 会自动帮我们设置requests 中 cpu 与 memory 的值一致。

创建Pod

kubectl create -f qos-guaranteed-pod.yaml

查看Pod详细信息

kubectl get pod qos-demo -n qos-example --output=yaml

从输出中的 yaml 文件中查看 status.qosClassGuaranteed

spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: qos-demo-ctr
    resources:
      limits:
        cpu: 700m
        memory: 200Mi
      requests:
        cpu: 700m
        memory: 200Mi
...
status:
  qosClass: Guaranteed
...

创建一个Qos类为 Burstable 的Pod

qos-burstable-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: qos-demo-1
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-ctr
    image: nginx
    resources:
      requests:
        memory: "50Mi"
      limits:
        memory: "100Mi"

创建Pod

kubectl create -f qos-burstable-pod.yaml

查看Pod详细信息

kubectl get pod qos-demo-1 -n qos-example --output=yaml

从输出中的 yaml 文件中查看 status.qosClassBurstable

spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: qos-demo-ctr
    resources:
      limits:
        memory: 100Mi
      requests:
        memory: 50Mi
...
status:
  qosClass: Burstable
...

这里值得注意的是只要Pod中有一个容器指定了内存或Cpu请求限制,那么该Pod都是满足 Burstable 类的。

创建一个Qos类为 BestEffort 的Pod

qos-besteffort-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: qos-demo-2
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-ctr
    image: nginx

创建Pod

kubectl create -f qos-besteffort-pod.yaml

查看Pod详细信息

kubectl get pod qos-demo-2 -n qos-example --output=yaml

从输出中的 yaml 文件中查看 status.qosClassBestEffort

spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: qos-demo-ctr
    resources: {}
...
status:
  qosClass: BestEffort
...

值得注意的是我们平常使用的过程中经常忘记写Limit 限制。也就是说Pod的Qos默认是BestEffort类。一旦节点资源不足时,这些服务将首先被驱逐。

如果只想查看Pod的Qos类请使用以下命令

kubectl -n=qos-example get pod qos-demo-2 -o jsonpath='{ .status.qosClass}{"\n"}'

# Output:
BestEffort

环境清理

kubectl delete namespace qos-example