介绍
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.qosClass
为 Guaranteed
。
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.qosClass
为 Burstable
。
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.qosClass
为 BestEffort
。
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