Kubernetes服务质量Qos
QoS(Quality of Service) 即服务质量,QoS 是一种控制机制,它提供了针对不同用户或者不同数据流采用相应不同的优先级,或者是根据应用程序的要求,保证数据流的性能达到一定的水准。kubernetes 中有三种 Qos,分别为:
- Guaranteed:pod 的 requests 与 limits 设定的值相等
- Burstable:pod requests 小于 limits 的值且不为 0
- BestEffort:pod 的 requests 与 limits 均为 0
三者的优先级依次递增:BestEffort -> Burstable -> Guaranteed
Guaranteed(有保证的)
- pod中的所有容器都且仅设置了 CPU 和内存的 limits
- pod中的所有容器都设置了 CPU 和内存的 requests 和 limits ,且单个容器内的requests=limits(requests不等于0)
pod中的所有容器都且仅设置了limits
containers:
name: test1
resources:
limits:
cpu: 10m
memory: 1Gi
name: test2
resources:
limits:
cpu: 100m
memory: 100Mi
pod 中的所有容器都设置了 requests 和 limits,且单个容器内的requests==limits:
containers:
name: test1
resources:
limits:
cpu: 10m
memory: 1Gi
requests:
cpu: 10m
memory: 1Gi
name: test2
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 100m
memory: 100Mi
容器test1和test2内resources的requests和limits均相等,该pod的QoS级别属于Guaranteed
Burstable(不稳定的)
pod中只要有一个容器的requests和limits的设置不相同,该pod的QoS即为Burstable
容器test1指定了resource,而容器test2未指定:
containers:
name: test1
resources:
limits:
cpu: 10m
memory: 1Gi
requests:
cpu: 10m
memory: 1Gi
name: test2
...
容器test1设置了内存limits,而容器test2设置了CPU limits:
containers:
name: test1
resources:
limits:
memory: 1Gi
name: test2
resources:
limits:
cpu: 100m
注意:若容器指定了requests而未指定limits,则limits的值等于节点resource的最大值;若容器指定了limits而未指定requests,则requests的值等于limits
Best-Effort(尽最大努力)
如果Pod中所有容器的resources均未设置requests与limits,该pod的QoS即为Best-Effort
容器test1和容器test2均未设置requests和limits:
containers:
name: test1
resources:
name: test2
resources:
根据QoS进行资源回收策略
Kubernetes通过cgroup给pod设置QoS级别,当资源不足时先kill优先级低的 pod,在实际使用过程中,通过OOM分数值来实现,OOM分数值范围为0-1000。OOM 分数值根据OOM_ADJ参数计算得出
对于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掉。OOM_ADJ参数设置的越大,计算出来的OOM分数越高,表明该pod优先级就越低,当出现资源竞争时会越早被kill掉,对于OOM_ADJ参数是-999的表示kubernetes永远不会因为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 掉
QoS使用建议
如果资源充足,可将 QoS pods 类型均设置为Guaranteed,用计算资源换业务性能和稳定性,减少排查问题时间和成本。如果想更好的提高资源利用率,业务服务可以设置为Guaranteed,而其他服务根据重要程度可分别设置为Burstable或Best-Effort