配置 Pod 的服务质量

本页介绍怎样配置 Pod 让其获得特定的服务质量(QoS)类。Kubernetes 使用 QoS 类来决定 Pod 的调度和驱逐策略。

准备开始

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

要获知版本信息,请输入 kubectl version.

QoS 类

Kubernetes 创建 Pod 时就给它指定了下列一种 QoS 类:

  • Guaranteed
  • Burstable
  • BestEffort

创建命名空间

创建一个命名空间,以便将本练习所创建的资源与集群的其余资源相隔离。

  1. kubectl create namespace qos-example

创建一个 QoS 类为 Guaranteed 的 Pod

对于 QoS 类为 Guaranteed 的 Pod:

  • Pod 中的每个容器都必须指定内存限制和内存请求。
  • 对于 Pod 中的每个容器,内存限制必须等于内存请求。
  • Pod 中的每个容器都必须指定 CPU 限制和 CPU 请求。
  • 对于 Pod 中的每个容器,CPU 限制必须等于 CPU 请求。

这些限制同样适用于初始化容器和应用程序容器。

下面是包含一个容器的 Pod 配置文件。 该容器设置了内存请求和内存限制,值都是 200 MiB。 该容器设置了 CPU 请求和 CPU 限制,值都是 700 milliCPU:

pods/qos/qos-pod.yaml 配置 Pod 的服务质量 - 图1

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: qos-demo
  5. namespace: qos-example
  6. spec:
  7. containers:
  8. - name: qos-demo-ctr
  9. image: nginx
  10. resources:
  11. limits:
  12. memory: "200Mi"
  13. cpu: "700m"
  14. requests:
  15. memory: "200Mi"
  16. cpu: "700m"

创建 Pod:

  1. kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod.yaml --namespace=qos-example

查看 Pod 详情:

  1. kubectl get pod qos-demo --namespace=qos-example --output=yaml

结果表明 Kubernetes 为 Pod 配置的 QoS 类为 Guaranteed。 结果也确认了 Pod 容器设置了与内存限制匹配的内存请求,设置了与 CPU 限制匹配的 CPU 请求。

  1. spec:
  2. containers:
  3. ...
  4. resources:
  5. limits:
  6. cpu: 700m
  7. memory: 200Mi
  8. requests:
  9. cpu: 700m
  10. memory: 200Mi
  11. ...
  12. status:
  13. qosClass: Guaranteed

说明:

如果容器指定了自己的内存限制,但没有指定内存请求,Kubernetes 会自动为它指定与内存限制匹配的内存请求。 同样,如果容器指定了自己的 CPU 限制,但没有指定 CPU 请求,Kubernetes 会自动为它指定与 CPU 限制匹配的 CPU 请求。

删除 Pod:

  1. kubectl delete pod qos-demo --namespace=qos-example

创建一个 QoS 类为 Burstable 的 Pod

如果满足下面条件,将会指定 Pod 的 QoS 类为 Burstable:

  • Pod 不符合 Guaranteed QoS 类的标准。
  • Pod 中至少一个容器具有内存或 CPU 的请求或限制。

下面是包含一个容器的 Pod 配置文件。 该容器设置了内存限制 200 MiB 和内存请求 100 MiB。

pods/qos/qos-pod-2.yaml 配置 Pod 的服务质量 - 图2

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: qos-demo-2
  5. namespace: qos-example
  6. spec:
  7. containers:
  8. - name: qos-demo-2-ctr
  9. image: nginx
  10. resources:
  11. limits:
  12. memory: "200Mi"
  13. requests:
  14. memory: "100Mi"

创建 Pod:

  1. kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-2.yaml --namespace=qos-example

查看 Pod 详情:

  1. kubectl get pod qos-demo-2 --namespace=qos-example --output=yaml

结果表明 Kubernetes 为 Pod 配置的 QoS 类为 Burstable。

  1. spec:
  2. containers:
  3. - image: nginx
  4. imagePullPolicy: Always
  5. name: qos-demo-2-ctr
  6. resources:
  7. limits:
  8. memory: 200Mi
  9. requests:
  10. memory: 100Mi
  11. ...
  12. status:
  13. qosClass: Burstable

删除 Pod:

  1. kubectl delete pod qos-demo-2 --namespace=qos-example

创建一个 QoS 类为 BestEffort 的 Pod

对于 QoS 类为 BestEffort 的 Pod,Pod 中的容器必须没有设置内存和 CPU 限制或请求。

下面是包含一个容器的 Pod 配置文件。 该容器没有设置内存和 CPU 限制或请求。

pods/qos/qos-pod-3.yaml 配置 Pod 的服务质量 - 图3

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: qos-demo-3
  5. namespace: qos-example
  6. spec:
  7. containers:
  8. - name: qos-demo-3-ctr
  9. image: nginx

创建 Pod:

  1. kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-3.yaml --namespace=qos-example

查看 Pod 详情:

  1. kubectl get pod qos-demo-3 --namespace=qos-example --output=yaml

结果表明 Kubernetes 为 Pod 配置的 QoS 类为 BestEffort。

  1. spec:
  2. containers:
  3. ...
  4. resources: {}
  5. ...
  6. status:
  7. qosClass: BestEffort

删除 Pod:

  1. kubectl delete pod qos-demo-3 --namespace=qos-example

创建包含两个容器的 Pod

下面是包含两个容器的 Pod 配置文件。 一个容器指定了内存请求 200 MiB。 另外一个容器没有指定任何请求和限制。

pods/qos/qos-pod-4.yaml 配置 Pod 的服务质量 - 图4

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: qos-demo-4
  5. namespace: qos-example
  6. spec:
  7. containers:
  8. - name: qos-demo-4-ctr-1
  9. image: nginx
  10. resources:
  11. requests:
  12. memory: "200Mi"
  13. - name: qos-demo-4-ctr-2
  14. image: redis

注意此 Pod 满足 Burstable QoS 类的标准。 也就是说它不满足 Guaranteed QoS 类标准,因为它的一个容器设有内存请求。

创建 Pod:

  1. kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-4.yaml --namespace=qos-example

查看 Pod 详情:

  1. kubectl get pod qos-demo-4 --namespace=qos-example --output=yaml

结果表明 Kubernetes 为 Pod 配置的 QoS 类为 Burstable:

  1. spec:
  2. containers:
  3. ...
  4. name: qos-demo-4-ctr-1
  5. resources:
  6. requests:
  7. memory: 200Mi
  8. ...
  9. name: qos-demo-4-ctr-2
  10. resources: {}
  11. ...
  12. status:
  13. qosClass: Burstable

删除 Pod:

  1. kubectl delete pod qos-demo-4 --namespace=qos-example

环境清理

删除命名空间:

  1. kubectl delete namespace qos-example

接下来

应用开发者参考

集群管理员参考