简介
此文讲述如何配置Pod的QoS(Quality of Service)即服务质量。Kubernetes使用QoS类来做出有关调度和驱逐Pod的决策。
备注:此文档参考官方文档,并加以自己的理解。如有误导性的内容,请批评指正。
QoS类
当Kubernetes创建Pod时,它将为这些Pod分配以下QoS类之一:
- Guaranteed
- Burstable
- BestEffort
创建一个分配了QoS类Guaranteed的Pod
创建namespace
# kubectl create namespace qos-example
为Pod提供QoS类为Guaranteed的条件:
- Pod中的每个容器必须有内存请求和内存限制,而且它们的值必须相同
- Pod中的每个容器必须有CPU请求和CPU限制,而且它们的值必须相同
创建一个Pod,该Pod中只有一个容器。该容器中自定义了内存请求和内寸限制,均等于200MiB
,CPU请求和CPU限制均等于 700 milli
CPU。文件名:qos-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:
memory: "200Mi"
cpu: "700m"
# kubectl apply -f /root/k8s-example/pods/qos-pod.yaml --namespace=qos-example
查看Pod资源详情
# kubectl get pod qos-demo --namespace=qos-example --output=yaml
从输出结果看出,Kubernetes为Pod提供了QoS类的Guaranteed。输出还验证Pod容器的内存请求与其内存限制相匹配,并且其CPU请求与其CPU限制相匹配。
spec:
containers:
...
resources:
limits:
cpu: 700m
memory: 200Mi
requests:
cpu: 700m
memory: 200Mi
...
qosClass: Guaranteed
备注:如果容器自定义了自己的内存限制,但是没有定义内存请求,Kubernetes自动将默认的内存限制数设置为改容器的内存请求数;如果容器自定义了CPU限制,但是没有定义CPU请求,Kubernetes自动将默认的CPU限制数设置为该容器的CPU请求数。
删除改Pod
# kubectl delete pod qos-demo --namespace=qos-example
创建一个分配了QoS级Burstable的Pod
如果满足以下条件,则为Pod提供burstable
的QoS类:
- Pod不符合QoS类别保证的标准。
- Pod中至少有一个容器具有内存或CPU请求。
创建一个Pod,该Pod中只有一个容器,容器的内存限制数为200 MiB
,内存请求数为100 MiB
。文件名:qos-pod-2.yaml
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"
# kubectl apply -f /root/k8s-example/pods/qos-pod-2.yaml --namespace=qos-example
查看Pod资源详情
# kubectl get pod qos-demo-2 --namespace=qos-example --output=yaml
输出显示Kubernetes为Pod提供了burstable的QoS类
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
创建一个分配了BestEffort QoS类的Pod
为了使Pod获得BestEffort的QoS类,Pod中的容器不得具有任何内存或CPU限制或请求。
创建一个Pod,Pod中只有一个容器。容器没有内存或CPU限制和请求
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-3
namespace: qos-example
spec:
containers:
- name: qos-demo-3-ctr
image: nginx
# kubectl apply -f /root/k8s-example/pods/qos-pod-3.yaml --namespace=qos-example
查看Pod资源详情
# kubectl get pod qos-demo-3 --namespace=qos-example --output=yaml
输出显示Kubernetes为Pod提供了BestEffort
的QoS类。
spec:
containers:
...
resources: {}
...
qosClass: BestEffort
删除Pod
# kubectl delete pod qos-demo-3 --namespace=qos-example
在一个Pod中创建两个容器
创建包含两个容器的Pod。一个容器自定义内存请求 200 MiB
。另一个容器不定义资源任何请求或限制。文件名:qos-pod-4.yaml
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
# kubectl apply -f /root/k8s-example/pods/qos-pod-4.yaml --namespace=qos-example
查看Pod资源详情
# kubectl get pod qos-demo-4 --namespace=qos-example --output=yaml
注意,此Pod符合QoS类别Burstable
的标准。也就是说,它不符合Guaranteed的QoS
类别的标准,并且其“容器”之一具有内存请求。
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
总结
1、Pod的QoS类有三种Guaranteed
、Burstable
、BestEffort
。
2、为Pod提供QoS类为Guaranteed的条件:
- Pod中的每个容器必须有内存请求和内存限制,而且它们的值必须相同
- Pod中的每个容器必须有CPU请求和CPU限制,而且它们的值必须相同
3、为Pod提供burstable
的QoS类的条件:
- Pod不符合QoS类别Guaranteed的标准。
- Pod中至少有一个容器具有内存或CPU请求。
4、为Pod提供BestEffort
的QoS类的条件:Pod中的容器不得具有任何内存或CPU限制或请求。