# k8s 给 Pod 配置服务质量等级
这篇教程指导如何给 Pod 配置特定的服务质量(QoS)等级。k8s 使用 QoS 等级来确定何时调度和终结 Pod。
# 开始之前
您需要有一个 k8s 集群,并且必须配置 kubectl 命令行工具以与集群通信。如果您还没有集群,可以使用 Minikube 创建一个集群。
# QoS 等级
当 k8s 创建一个 Pod 时,它就会给这个 Pod 分配一个 QoS 等级:
- Guaranteed
- Burstable
- BestEffort
# 创建一个命名空间
创建一个命名空间,以便将我们实验需求的资源与集群其他资源隔离开。
kubectl create namespace qos-example
# 创建一个 Pod 并分配 QoS 等级为 Guaranteed
想要给 Pod 分配 QoS 等级为 Guaranteed:
- Pod 里的每个容器都必须有内存限制和请求,而且必须是一样的。
- Pod 里的每个容器都必须有 CPU 限制和请求,而且必须是一样的。
这是一个含有一个容器的 Pod 的配置文件。这个容器配置了内存限制和请求,都是 200MB。它还有 CPU 限制和请求,都是 700 millicpu:
qos-pod.yaml |
---|
apiVersion: v1 kind: Pod metadata: name: qos-demo spec: containers: - name: qos-demo-ctr image: nginx resources: limits: memory: "200Mi" cpu: "700m" requests: memory: "200Mi" cpu: "700m" |
创建 Pod:
kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/qos-pod.yaml --namespace=qos-example
查看 Pod 的详细信息:
kubectl get pod qos-demo --namespace=qos-example --output=yaml
输出显示了 k8s 给 Pod 配置的 QoS 等级为 Guaranteed。也验证了容器的内存和 CPU 的限制都满足了它的请求。
spec:
containers:
...
resources:
limits:
cpu: 700m
memory: 200Mi
requests:
cpu: 700m
memory: 200Mi
...
qosClass: Guaranteed
注意: 如果一个容器配置了内存限制,但是没有配置内存申请,那 k8s 会自动给容器分配一个符合内存限制的请求。 类似的,如果容器有 CPU 限制,但是没有 CPU 申请,k8s 也会自动分配一个符合限制的请求。
删除你的 Pod:
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 |
---|
apiVersion: v1 kind: Pod metadata: name: qos-demo-2 spec: containers: - name: qos-demo-2-ctr image: nginx resources: limits: memory: "200Mi" requests: memory: "100Mi" |
创建 Pod:
kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/qos-pod-2.yaml --namespace=qos-example
查看 Pod 的详细信息:
kubectl get pod qos-demo-2 --namespace=qos-example --output=yaml
输出显示了 k8s 给这个 Pod 配置了 QoS 等级为 Burstable.
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: qos-demo-2-ctr
resources:
limits:
memory: 200Mi
requests:
memory: 100Mi
...
qosClass: Burstable
删除你的 Pod:
kubectl delete pod qos-demo-2 --namespace=qos-example
# 创建一个 Pod 并分配 QoS 等级为 BestEffort
要给一个 Pod 配置 BestEffort 的 QoS 等级, Pod 里的容器必须没有任何内存或者 CPU 的限制或请求。
下面是一个 Pod 的配置文件,包含一个容器。这个容器没有内存或者 CPU 的限制或者请求:
qos-pod-3.yaml |
---|
apiVersion: v1 kind: Pod metadata: name: qos-demo-3 spec: containers: - name: qos-demo-3-ctr image: nginx |
创建 Pod:
kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/qos-pod-3.yaml --namespace=qos-example
查看 Pod 的详细信息:
kubectl get pod qos-demo-3 --namespace=qos-example --output=yaml
输出显示了 k8s 给 Pod 配置的 QoS 等级是 BestEffort.
spec:
containers:
...
resources: {}
...
qosClass: BestEffort
删除你的 Pod:
kubectl delete pod qos-demo-3 --namespace=qos-example
# 创建一个拥有两个容器的 Pod
这是一个含有两个容器的 Pod 的配置文件,其中一个容器指定了内存申请为 200MB,另外一个没有任何申请或限制。
qos-pod-4.yaml |
---|
apiVersion: v1 kind: Pod metadata: name: qos-demo-4 spec: containers: - name: qos-demo-4-ctr-1 image: nginx resources: requests: memory: "200Mi" - name: qos-demo-4-ctr-2 image: redis |
注意到这个 Pod 满足了 QoS 等级 Burstable 的要求. 就是说,它不满足 Guaranteed 的要求,而且其中一个容器有内存请求。
创建 Pod:
kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/qos-pod-4.yaml --namespace=qos-example
查看 Pod 的详细信息:
kubectl get pod qos-demo-4 --namespace=qos-example --output=yaml
输出显示了 k8s 给 Pod 配置的 QoS 等级是 Burstable:
spec:
containers:
...
name: qos-demo-4-ctr-1
resources:
requests:
memory: 200Mi
...
name: qos-demo-4-ctr-2
resources: {}
...
qosClass: Burstable
删除你的 Pod:
kubectl delete pod qos-demo-4 --namespace=qos-example
# 清理
删除你的 namespace:
kubectl delete namespace qos-example