k8s系列之二 服务质量
一、Qos类等级
Kubernetes 使用 QoS 类来决定 Pod 的调度和驱逐策略。
Kubernetes 中如果一个 Node 节点上的 Pod 占用资源过多并且不断飙升导致 Node 节点资源(内存)不足,可能会导致为了保证节点可用,将容器杀掉。在遇见这种情况时候,我们希望先杀掉那些不太重要的容器,确保核心容器不会首先被杀掉。为了衡量先杀掉哪个程序,所以推出了优先级机制 QoS (Quality of Service)来做判断,Kubernetes 将容器划分为三种 QoS 等级:
- Guaranteed
- Burstable
- BestEffort
二、Guaranteed
QoS 为 Guaranteed 的 Pod 需要满足以下条件:
- Pod 中的每个容器必须指定内存限制和内存请求,且两者必须相等
- Pod 中的每个容器必须指定 CPU 限制和 CPU 请求,且两者必须相等
eg:容器设置了内存请求和内存限制,值都是 200 MiB。 容器设置了 CPU 请求和 CPU 限制,值都是 300 milliCPU
apiVersion: v1 kind: Pod metadata: name: guaranteed-pod spec: containers: - name: nginx image: nginx:1.7.9 resources: limits: memory: "200Mi" cpu: "300m" requests: memory: "200Mi" cpu: "300m"
服务启动之后,可通过下面的命令查看
$ kubectl describe pods guaranteed-pod | grep "QoS Class" QoS Class: Guaranteed
如果容器指定了自己的内存限制,但没有指定内存请求,Kubernetes 会自动为它指定与内存限制匹配的内存请求。
如果容器指定了自己的 CPU 限制,但没有指定 CPU 请求,Kubernetes 会自动为它指定与 CPU 限制匹配的 CPU 请求。
三、Burstable
QoS 为 Burstable的 Pod 需要满足以下条件:
- Pod 不符合 Guaranteed QoS 类标准
- Pod 中至少一个有容器具备内存或 CPU 请求
eg:容器设置了内存限制 200 MiB 和内存请求 200 MiB
apiVersion: v1 kind: Pod metadata: name: burstable-pod spec: containers: - name: nginx image: nginx:1.7.9 resources: limits: memory: "200Mi" requests: memory: "200Mi"
服务启动之后,可通过下面的命令查看
$ kubectl describe pod burstable-pod | grep "QoS Class" QoS Class: Burstable
四、BestEffort
QoS 为 BestEffort的 Pod 需要满足以下条件:
- Pod 中的容器不得设置任何内存、CPU 限制或请求
eg:容器没有设置内存和 CPU 限制或请求
apiVersion: v1
kind: Pod
metadata:
name: besteffort-pod
spec:
containers:
- name: nginx
image: nginx:1.7.9
服务启动之后,可通过下面的命令查看
$ kubectl describe pods besteffort-pod | grep "QoS Class" QoS Class: BestEffort
五、QoS优先级
3种QoS优先级从有低到高(从左向右):
Best-Effort pods -> Burstable pods -> Guaranteed pods
他们之间的区别主要体现在两个指标上:内存、CPU
可压缩资源:CPU
当pod使用超过设置的limits值,pod中进程使用cpu会被限制,但不会被kill。
不可压缩资源:内存
当节点开始耗尽计算资源时,由Kubelet启动Pod驱逐,以避免发生系统内存不足(OOM)事件。
官方文档链接:https://kubernetes.io/zh/docs/tasks/configure-pod-container/quality-service-pod/

浙公网安备 33010602011771号