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

文章作者: 鲜花的主人
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱吃可爱多
Kubernetes Kubernetes
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝