对于一个 pod 来说,服务质量体现在两个具体的指标:CPU 和内存。当节点上内存资源紧张时,kubernetes 会根据预先设置的不同 QoS 类别进行相应处理。
- guaranteed (有保证的)
- burstable (不稳定的)
- Best-Effort (尽力而为)
Guaranteed
- Pod中的所有容器都且仅设置了 CPU 和内存的 limits
- pod中的所有容器都设置了 CPU 和内存的 requests 和 limits ,且单个容器内的requests==limits(requests不等于0)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| containers: name: xiemx1 resources: limits: cpu: "10m" memory: "1Gi" name: xiemx2 resources: limits: cpu: "100m" memory: "100Mi"
containers: name: xiemx1 resources: limits: cpu: "10m" memory: "1Gi" requests: cpu: "10m" memory: "1Gi"
name: xiemx2 resources: limits: cpu: "100m" memory: "100Mi" requests: cpu: "100m" memory: "100Mi"
|
Burstable
- pod中只要有一个容器的requests和limits的设置不相同
- pod中只要有一个容器的cpu or memory 没有设置limits
1 2 3 4 5 6 7 8 9 10
| containers: name: xiemx1 resources: limits: memory: "1Gi"
name: xiemx2 resources: limits: cpu: "100m"
|
Best-Effort
- Pod中所有容器的resources均未设置requests与limits
1 2 3 4 5
| containers: name: xiemx1 resources: name: xiemx2 resources:
|
不同策略的QOS回收策略实现
Kubernetes 通过cgroup给pod设置QoS级别,当资源不足时先kill优先级低的pod,通过OOM_ADJ参数计算分数值来实现,OOM分数值范围为0-1000。计算出来的OOM分数越高,表明该pod优先级就越低,当出现资源竞争时会越早被kill掉
- Guaranteed级别的 Pod,OOM_ADJ参数设置成了-998
- Best-Effort级别的 Pod,OOM_ADJ参数设置成了1000
- 对于Burstable级别的 Pod,OOM_ADJ参数取值从2到999
- kuberntes 保留资源,比如kubelet,docker,OOM_ADJ参数设置成了-999,表示不会被OOM kill掉
QoS pods被kill掉场景与顺序
- Best-Effort pods:系统用完了全部内存时,该类型 pods 会最先被kill掉。
- Burstable pods:系统用完了全部内存,且没有 Best-Effort 类型的容器可以被 kill 时,该类型的 pods 会被 kill 掉。
- Guaranteed pods:系统用完了全部内存,且没有 Burstable 与 Best-Effort 类型的容器可以被 kill 时,该类型的 pods 会被 kill 掉。
参考:https://www.qikqiak.com/post/kubernetes-qos-usage/