简介
此文讲述如何配置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限制或请求。
来源:https://www.cnblogs.com/mcsiberiawolf/p/12214554.html