为 Pod 配置服务质量
本页面介绍如何配置 Pod,以便它们将被分配特定的服务质量 (QoS) 类。Kubernetes 使用 QoS 类来决定在节点资源超出时驱逐哪些 Pod。
当 Kubernetes 创建 Pod 时,它会将以下 QoS 类之一分配给 Pod
开始之前
您需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点的集群上运行本教程,这些节点不充当控制平面主机。如果您还没有集群,可以使用minikube创建一个集群,或者可以使用以下 Kubernetes 游乐场之一
您还需要能够创建和删除命名空间。
创建命名空间
创建一个命名空间,以便在本练习中创建的资源与集群中的其他资源隔离。
kubectl create namespace qos-example
创建一个被分配 QoS 类为保证的 Pod
为了使 Pod 被分配 QoS 类为保证
- Pod 中的每个容器都必须具有内存限制和内存请求。
- 对于 Pod 中的每个容器,内存限制必须等于内存请求。
- Pod 中的每个容器都必须具有 CPU 限制和 CPU 请求。
- 对于 Pod 中的每个容器,CPU 限制必须等于 CPU 请求。
这些限制同样适用于 init 容器和应用程序容器。 短暂容器无法定义资源,因此这些限制不适用。
以下是一个包含一个容器的 Pod 的清单。该容器具有内存限制和内存请求,两者都等于 200 MiB。该容器具有 CPU 限制和 CPU 请求,两者都等于 700 毫 CPU
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:
memory: "200Mi"
cpu: "700m"
创建 Pod
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod.yaml --namespace=qos-example
查看有关 Pod 的详细信息
kubectl get pod qos-demo --namespace=qos-example --output=yaml
输出显示 Kubernetes 为该 Pod 分配了 QoS 类为保证
。输出还验证了 Pod 容器具有与内存限制匹配的内存请求,并且它具有与 CPU 限制匹配的 CPU 请求。
spec:
containers:
...
resources:
limits:
cpu: 700m
memory: 200Mi
requests:
cpu: 700m
memory: 200Mi
...
status:
qosClass: Guaranteed
注意
如果容器指定了自己的内存限制,但未指定内存请求,Kubernetes 将自动分配与限制匹配的内存请求。同样,如果容器指定了自己的 CPU 限制,但未指定 CPU 请求,Kubernetes 将自动分配与限制匹配的 CPU 请求。清理
删除您的 Pod
kubectl delete pod qos-demo --namespace=qos-example
创建一个被分配 QoS 类为可突发的 Pod
如果满足以下条件,则 Pod 将被分配 QoS 类为可突发
- 该 Pod 不符合 QoS 类
保证
的条件。 - Pod 中至少有一个容器具有内存或 CPU 请求或限制。
以下是一个包含一个容器的 Pod 的清单。该容器具有 200 MiB 的内存限制和 100 MiB 的内存请求。
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-2
namespace: qos-example
spec:
containers:
- name: qos-demo-2-ctr
image: nginx
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
创建 Pod
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-2.yaml --namespace=qos-example
查看有关 Pod 的详细信息
kubectl get pod qos-demo-2 --namespace=qos-example --output=yaml
输出显示 Kubernetes 为该 Pod 分配了 QoS 类为可突发
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: qos-demo-2-ctr
resources:
limits:
memory: 200Mi
requests:
memory: 100Mi
...
status:
qosClass: Burstable
清理
删除您的 Pod
kubectl delete pod qos-demo-2 --namespace=qos-example
创建一个被分配 QoS 类为尽力而为的 Pod
为了使 Pod 被分配 QoS 类为尽力而为
,Pod 中的容器不得具有任何内存或 CPU 限制或请求。
以下是一个包含一个容器的 Pod 的清单。该容器没有任何内存或 CPU 限制或请求
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-3
namespace: qos-example
spec:
containers:
- name: qos-demo-3-ctr
image: nginx
创建 Pod
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-3.yaml --namespace=qos-example
查看有关 Pod 的详细信息
kubectl get pod qos-demo-3 --namespace=qos-example --output=yaml
输出显示 Kubernetes 为该 Pod 分配了 QoS 类为尽力而为
spec:
containers:
...
resources: {}
...
status:
qosClass: BestEffort
清理
删除您的 Pod
kubectl delete pod qos-demo-3 --namespace=qos-example
创建一个包含两个容器的 Pod
以下是一个包含两个容器的 Pod 的清单。一个容器指定了 200 MiB 的内存请求。另一个容器未指定任何请求或限制。
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-4
namespace: qos-example
spec:
containers:
- name: qos-demo-4-ctr-1
image: nginx
resources:
requests:
memory: "200Mi"
- name: qos-demo-4-ctr-2
image: redis
请注意,此 Pod 符合 QoS 类可突发
的条件。也就是说,它不符合 QoS 类保证
的条件,并且其中一个容器具有内存请求。
创建 Pod
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-4.yaml --namespace=qos-example
查看有关 Pod 的详细信息
kubectl get pod qos-demo-4 --namespace=qos-example --output=yaml
输出显示 Kubernetes 为该 Pod 分配了 QoS 类为可突发
spec:
containers:
...
name: qos-demo-4-ctr-1
resources:
requests:
memory: 200Mi
...
name: qos-demo-4-ctr-2
resources: {}
...
status:
qosClass: Burstable
检索 Pod 的 QoS 类
您无需查看所有字段,只需查看您需要的字段即可
kubectl --namespace=qos-example get pod qos-demo-4 -o jsonpath='{ .status.qosClass}{"\n"}'
Burstable
清理
删除您的命名空间
kubectl delete namespace qos-example