这篇教程指导如何给 Pod 配置特定的服务质量(QoS)等级。Kubernetes 使用 QoS 等级来确定何时调度和终结 Pod 。

Before you begin

You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using Minikube.

QoS 等级

当 Kubernetes 创建一个 Pod 时,它就会给这个 Pod 分配一个 QoS 等级:

  • Guaranteed
  • Burstable
  • BestEffort

创建一个命名空间

创建一个命名空间,以便将我们实验需求的资源与集群其他资源隔离开。

  1. kubectl create namespace qos-example

创建一个 Pod 并分配 QoS 等级为 Guaranteed

想要给 Pod 分配 QoS 等级为 Guaranteed:

  • Pod 里的每个容器都必须有内存限制和请求,而且必须是一样的。
  • Pod 里的每个容器都必须有 CPU 限制和请求,而且必须是一样的。
    这是一个含有一个容器的 Pod 的配置文件。这个容器配置了内存限制和请求,都是200MB。它还有 CPU 限制和请求,都是700 millicpu:
qos-pod.yaml 给 Pod 配置服务质量等级 - 图1
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: qos-demo
  5. spec:
  6. containers:
  7. - name: qos-demo-ctr
  8. image: nginx
  9. resources:
  10. limits:
  11. memory: "200Mi"
  12. cpu: "700m"
  13. requests:
  14. memory: "200Mi"
  15. cpu: "700m"

创建 Pod:

  1. kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/qos-pod.yaml --namespace=qos-example

查看 Pod 的详细信息:

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

输出显示了 Kubernetes 给 Pod 配置的 QoS 等级为 Guaranteed 。也验证了容器的内存和 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. qosClass: Guaranteed

注意: 如果一个容器配置了内存限制,但是没有配置内存申请,那 Kubernetes 会自动给容器分配一个符合内存限制的请求。 类似的,如果容器有 CPU 限制,但是没有 CPU 申请,Kubernetes 也会自动分配一个符合限制的请求。

删除你的 Pod:

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

创建一个 Pod 并分配 QoS 等级为 Burstable

当出现下面的情况时,则是一个 Pod 被分配了 QoS 等级为 Burstable :

  • 该 Pod 不满足 QoS 等级 Guaranteed 的要求。
  • Pod 里至少有一个容器有内存或者 CPU 请求。
    这是 Pod 的配置文件,里面有一个容器。这个容器配置了200MB的内存限制和100MB的内存申请。
qos-pod-2.yaml 给 Pod 配置服务质量等级 - 图2
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: qos-demo-2
  5. spec:
  6. containers:
  7. - name: qos-demo-2-ctr
  8. image: nginx
  9. resources:
  10. limits:
  11. memory: "200Mi"
  12. requests:
  13. memory: "100Mi"

创建 Pod:

  1. kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/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. qosClass: Burstable

删除你的 Pod:

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

创建一个 Pod 并分配 QoS 等级为 BestEffort

要给一个 Pod 配置 BestEffort 的 QoS 等级, Pod 里的容器必须没有任何内存或者 CPU 的限制或请求。

下面是一个 Pod 的配置文件,包含一个容器。这个容器没有内存或者 CPU 的限制或者请求:

qos-pod-3.yaml 给 Pod 配置服务质量等级 - 图3
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: qos-demo-3
  5. spec:
  6. containers:
  7. - name: qos-demo-3-ctr
  8. image: nginx

创建 Pod:

  1. kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/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. qosClass: BestEffort

删除你的 Pod:

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

创建一个拥有两个容器的 Pod

这是一个含有两个容器的 Pod 的配置文件,其中一个容器指定了内存申请为 200MB ,另外一个没有任何申请或限制。

qos-pod-4.yaml 给 Pod 配置服务质量等级 - 图4
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: qos-demo-4
  5. spec:
  6. containers:
  7.  
  8. - name: qos-demo-4-ctr-1
  9. image: nginx
  10. resources:
  11. requests:
  12. memory: "200Mi"
  13.  
  14. - name: qos-demo-4-ctr-2
  15. image: redis

注意到这个 Pod 满足了 QoS 等级 Burstable 的要求. 就是说,它不满足 Guaranteed 的要求,而且其中一个容器有内存请求。

创建 Pod:

  1. kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/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. qosClass: Burstable

删除你的 Pod:

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

清理

删除你的 namespace:

  1. kubectl delete namespace qos-example

What’s next

对于集群管理员

对于应用开发者

K8S中文社区微信公众号

原文: http://docs.kubernetes.org.cn/751.html