Kubernetes之服务质量保证(QoS)

本文讲的是Kubernetes之服务质量保证(QoS)【编者的话】Kubernetes做为目前主流的容器集群管理平台,需要整体统筹平台资源使用情况、公平合理的将资源分配给相关pod容器使用,并且要保证容器生命周期内有足够的资源来保证其运行。 与此同时,由于资源发放的独占性,即资源已经分配给了某容器,同样的资源不会在分配给其他容器,对于资源利用率相对较低的容器来说,占用资源却没有实际使用(比如CPU、内存)造成了严重的资源浪费,Kubernetes需从优先级与公平性等角度提高资源的利用率。为了实现资源被有效调度和分配的同时提高资源利用率,Kubernetes针对不同服务质量的预期,通过QoS(Quality of Service)来对pod进行服务质量管理,提供了个采用requestslimits两种类型对资源进行分配和使用限制。对于一个pod来说,服务质量体现在两个为2个具体的指标: CPU与内存。实际过程中,当NODE节点上内存资源紧张时,kubernetes会根据预先设置的不同QoS类别进行相应处理。

设置资源限制的原因

如果未做过节点 nodeSelector,亲和性(node affinity)或pod亲和、反亲和性(pod affinity/anti-affinity)等Pod高级调度策略设置,我们没有办法指定服务部署到指定机器上,如此可能会造成cpu或内存等密集型的pod同时分配到相同Node,造成资源竞争。另一方面,如果未对资源进行限制,一些关键的服务可能会因为资源竞争因OOM(Out of Memory)等原因被kill掉,或者被限制CPU使用。

资源需求(Requests)和限制( Limits)

对于每一个资源,container可以指定具体的资源需求(requests)和限制(limits),requests申请范围是0到node节点的最大配置,而limits申请范围是requests到无限,即0 <= requests <=Node Allocatable, requests <= limits <= Infinity。
对于CPU,如果pod中服务使用CPU超过设置的limits,pod不会被kill掉但会被限制。如果没有设置limits,pod可以使用全部空闲的cpu资源。
对于内存,当一个pod使用内存超过了设置的limits,pod中container的进程会被kernel因OOM kill掉。当container因为OOM被kill掉时,系统倾向于在其原所在的机器上重启该container或本机或其他重新创建一个pod。

QoS分类

Kubelet提供QoS服务质量管理,支持系统级别的OOM控制。在Kubernetes中,pod的QoS级别:GuaranteedBurstable与 Best-Effort。下面对各级别分别进行相应说明:

Guaranteed:pod中所有容器都必须统一设置limits,并且设置参数都一致,如果有一个容器要设置requests,那么所有容器都要设置,并设置参数同limits一致,那么这个pod的QoS就是Guaranteed级别。
注:如果一个容器只指明limit而未设定request,则request的值等于limit值。

Guaranteed举例1:容器只指明了limits而未指明requests)。

containers:
name: foo
resources:
  limits:
    cpu: 10m
    memory: 1Gi
name: bar
resources:
  limits:
    cpu: 100m
    memory: 100Mi

Guaranteed举例2:requestslimit均指定且值相等。

containers:
name: foo
resources:
  limits:
    cpu: 10m
    memory: 1Gi
  requests:
    cpu: 10m
    memory: 1Gi

name: bar
resources:
  limits:
    cpu: 100m
    memory: 100Mi
  requests:
    cpu: 100m
    memory: 100Mi

Burstable: pod中只要有一个容器的requestslimits的设置不相同,该pod的QoS即为Burstable。举例如下:

Container bar没有指定resources

containers:
name: foo
resources:
  limits:
    cpu: 10m
    memory: 1Gi
  requests:
    cpu: 10m
    memory: 1Gi

name: bar

Burstable举例2:对Container foo与bar不同的resources(foo为memory,而bar为cpu)设置了limits

containers:
name: foo
resources:
  limits:
    memory: 1Gi

name: bar
resources:
  limits:
    cpu: 100m

Burstable举例3:Container foo没有设置limits,而bar requests与 limits均未设置。

containers:
name: foo
resources:
  requests:
    cpu: 10m
    memory: 1Gi

name: bar

Best-Effort:如果对于全部的resources来说requestslimits均未设置,该pod的QoS即为Best-Effort。举例如下:

containers:
name: foo
resources:
name: bar
resources:

可压缩资源与不可压缩资源

Kubernetes根据资源能否伸缩进行分类,划分为可压缩资源和不可以压缩资源2种。CPU资源是目前支持的一种可压缩资源,而内存资源和磁盘资源为目前所支持的不可压缩资源。

QoS优先级

3种QoS优先级从有低到高(从左向右):

Best-Effort pods -> Burstable pods -> Guaranteed pods

静态pod

在Kubernetes中有一种DaemonSet类型pod,此类型pod可以常驻某个Node运行,由该Node上kubelet服务直接管理而无需api server介入。静态pod也无需关联任何RC,完全由kubelet服务来监控,当kubelet发现静态pod停止时,kubelet会重新启动静态pod。

资源回收策略

当kubernetes集群中某个节点上可用资源比较小时,kubernetes提供了资源回收策略保证被调度到该节点pod服务正常运行。当节点上的内存或者CPU资源耗尽时,可能会造成该节点上正在运行的pod服务不稳定。Kubernetes通过kubelet来进行回收策略控制,保证节点上pod在节点资源比较小时可以稳定运行。

可压缩资源:CPU
在压缩资源部分已经提到CPU属于可压缩资源,当pod使用超过设置的limits值,pod中进程使用cpu会被限制,但不会被kill。

不可压缩资源:内存
Kubernetes通过cgroup给pod设置QoS级别,当资源不足时先kill优先级低的pod,在实际使用过程中,通过OOM分数值来实现,OOM分数值从0-1000。

OOM分数值根据OOM_ADJ参数计算得出,对于Guaranteed级别的pod,OOM_ADJ参数设置成了-998,对于BestEffort级别的pod,OOM_ADJ参数设置成了1000,对于Burstable级别的POD,OOM_ADJ参数取值从2到999。对于kuberntes保留资源,比如kubelet,docker,OOM_ADJ参数设置成了-999,表示不会被OOM kill掉。OOM_ADJ参数设置的越大,通过OOM_ADJ参数计算出来OOM分数越高,表明该pod优先级就越低,当出现资源竞争时会越早被kill掉,对于OOM_ADJ参数是-999的表示kubernetes永远不会因为OOM而被kill掉。

QoS pods被kill掉场景与顺序 

  • Best-Effort 类型的pods:系统用完了全部内存时,该类型pods会最先被kill掉。
  • Burstable类型pods:系统用完了全部内存,且没有Best-Effort container可以被kill时,该类型pods会被kill掉。
  • Guaranteed pods:系统用完了全部内存、且没有Burstable与Best-Effort container可以被kill,该类型的pods会被kill掉。
    注:如果pod进程因使用超过预先设定的limites而非Node资源紧张情况,系统倾向于在其原所在的机器上重启该container或本机或其他重新创建一个pod。

    使用建议

  • 如果资源充足,可将QoS pods类型均设置为Guaranteed。用计算资源换业务性能和稳定性,减少排查问题时间和成本。
  • 如果想更好的提高资源利用率,业务服务可以设置为Guaranteed,而其他服务根据重要程度可分别设置为BurstableBest-Effort,例如filebeat。

已知问题

不支持swap,当前的QoS策略假设swap已被禁止。

参考资料

Resource Quality of Service in Kubernetes: https://github.com/kubernetes/ ... os.md

Introduction to Quality Of Service and Service Level Agreement: http://www.loriotpro.com/Produ ... N.htm

Kubelet pod level resource management: https://github.com/kubernetes/ ... nt.md

Kubelet - Eviction Policy: https://github.com/kubernetes/ ... on.md

欢迎转载,请注明作者出处:张夏,FreeWheel Lead Engineer,DockOne社区

原文发布时间为:2017-08-16

本文作者:张夏

本文来自合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:Kubernetes之服务质量保证(QoS)

时间: 2024-12-27 02:01:28

Kubernetes之服务质量保证(QoS)的相关文章

DockOne微信分享(一四三):FreeWheel基于Kubernetes容器云构建与实践:应用编排与服务质量保证

本文讲的是DockOne微信分享(一四三):FreeWheel基于Kubernetes容器云构建与实践:应用编排与服务质量保证[编者的话]随着公司业务不断发展以及逐渐向微服务的转变,我们借助于Kubernetes容器化解决方案来标准化和简化应用发布的整个流程,使原来需要大量人工维护和干预的工作变为自动化.本次内容主要是FreeWheel现阶段基于Kubernetes容器化经验和实践的总结,目标是提供一个持续.稳定.高效的容器云平台. 服务健康检查与自我恢复 对线上业务来说,保证服务的正常稳定是重

低带宽情况下使用Hyper-V副本时的注意事项

  Hyper-V副本提供了一种可以在灾难恢复站点实时创建虚拟机副本的简单和经济方式.因为复制是一种灾难恢复特性,所以通常管理员会询问Hyper-V是否能够通过低带宽链路(比如数据中心间的广域网络)来复制虚拟机. 通常来讲,Hyper-V副本可以在低带宽链路上正常工作,但是有几个方面需要考虑. 首次复制过程 首先需要考虑的因素之一是第一次复制过程.在这个过程当中,Hyper-V将虚拟硬盘复制到副本服务器上. 在低带宽环境中,应该避免进行跨网络的首次复制过程.首先,这个过程可能需要花费很长时间才能

IEEE 802.11协议族总结及相关标准

IEEE 802.111990年IEEE 802标准化委员会成立IEEE 802.11无线局域网标准工作组.该标准定义物理层和媒体访问控制(MAC)规范.物理层定义了 数据传输的信号特征和调制,工作在2.4000-2.4835GHz频段.IEEE 802.11是IEEE最初制定的一个无线局域网标准,主要用于难于布线的环境或移动环境中计算机的无线接入,由于传输速率最高只能达到2Mbps, 所以,业务主要被用于数据的存取.IEEE 802.11a1999年,IEEE 802.11a标准制定完成,该标

Kubernetes服务目录的设计

本文讲的是Kubernetes服务目录的设计[编者的话]OpenShift 3.6新版本包括新的服务目录和服务中介技术预演版.它们是基于Kubernetes的孵化项目Kubernetes Service Catalog project.服务目录通过Open Service Broker API集成服务中介,由服务中介管理服务的创建和管理:这篇文章将深入介绍服务目录的设计. [3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站]本次培训围绕基于Docker的CI/CD实战展开,具体内容

使用NGINX Plus负载均衡Kubernetes服务

本文讲的是使用NGINX Plus负载均衡Kubernetes服务,[编者的话]此篇文章是Nginx的Michael Pleshakov发表在Nginx官方博客的一篇博文,通过这篇文章概括回顾了Kubernetes暴露服务相关的解决方案,并对最新的Ingreess API进行了说明,最后给出了Kubernetes通过集成NGINX Plus来暴露服务到互联网的解决方案.这个方案解决了目前Kubernetes暴露服务的短板,整个实现过程也比较简单,步骤清晰,具有很强的参考性.我们华三目前也在调研这

第四层交换技术-向服务要质量的典型

随着宽带的普及,各种网络应用的深入,我们的局域网络正在承担着繁重的业务流量.网络系统中的音频.视频.数据等信息的传输量充斥着占用带宽,我们不得不为这些数据流量提供差别化的服务,让时延敏感性的和重要的数据优先通过,这就不得不考虑第四层交换,以满足基于策略调度.QoS(Quality of Service:服务质量)以及安全服务的需求. 二.三.四层交换的区别 第二层交换实现局域网内主机间的快速信息交流,第三层交换可以说是交换技术与路由技术的完美结合,而第四层交换技术则可以为网络应用资源提供最优分配

DockOne微信分享(九十六):爱油科技基于SpringCloud的微服务实践

本文讲的是DockOne微信分享(九十六):爱油科技基于SpringCloud的微服务实践[编者的话]本次分享主要介绍了爱油科技基于Docker和Spring Cloud将整体业务微服务化的一些实践经验,主要包括: 微服务架构的分层和框架选型 服务发现和配置管理 服务集成和服务质量保证 基于领域驱动设计 实施DevOps 从单体应用到微服务 单体应用 对于单体应用来说,优点很多,例如: 小而美,结构简单易于开发实现 部署门槛低,单个Jar包或者网站打包即可部署 可快速实现多实例部署 然而随着业务

DockOne微信分享(一二〇):基于Kubernetes的私有容器云建设实践

本文讲的是DockOne微信分享(一二〇):基于Kubernetes的私有容器云建设实践[编者的话]本次分享将为大家介绍易宝支付私有容器云从0到1的建设之路.包括技术选型.理论基础.基于Kubernetes的容器云和CI/CD落地过程中的挑战和踩过的坑. 建设背景及目标 在Docker技术流行开来之前,保证软件交付的质量和速度对于大多数企业来说都是困难的.业务的复杂性带来了应用的复杂性,面对成千上万的不同应用,运维部门需要时刻应对来自不同应用.不同环境的挑战.特别是在自动化运维程度不高的企业,"

(祈福九寨)网易蜂巢基于容器和微服务加快迭代速度实践

题图:Afterquake by Angelo Giordano@pixabay 编辑:冷锋 文章转自网易云(微信公众号Netease_cloud) 刘超 网易云首席解决方案架构师,代码级略懂OpenStack.Hadoop.Docker.Lucene.Mesos等开源软件,10多年的云计 算架构与开发经历,积累了丰富的企业级应用的微服务化,容器化实战经验,曾出版<Lucene应用开发揭秘>,个 人博客可搜索popsuper1982. 刘超在分享了题为"网易蜂巢基于容器和微服务加快迭