K8S的Qos如何保障重要服务?
什么是Qos众所周知,k8s的资源分配主要基于container的resources进行限制,其中又分为了requests和limits 两个字段,分别表示容器的基本所需资源以及最大限制,该2个字段的最大作用,就是为K8S的调度以及资源回收服务。Qos是啥,假设一条通道只能容纳100人,当我们有120人需要疏散的时候,如何让老人小孩先走,Qos就是将老人小孩的重要级调高,从而保障老人小孩可以在第一
什么是Qos
众所周知,k8s的资源分配主要基于container的resources进行限制,其中又分为了requests和limits 两个字段,分别表示容器的基本所需资源以及最大限制,该2个字段的最大作用,就是为K8S的调度以及资源回收服务。
Qos是啥,假设一条通道只能容纳100人,当我们有120人需要疏散的时候,如何让老人小孩先走,Qos就是将老人小孩的重要级调高,从而保障老人小孩可以在第一批通过。回到K8s,当一台Node的资源即将耗尽,如何保障我们的Node上的系统服务(比如calico的daemonset,prometheus的exporter等等)不会因为资源问题被第一批疏散,limits 和 requests 这2个字段就起到了对应的作用。
Guaranteed, Burstable, Best-Effort
K8S内部基于limits 和 requests的配置方式,对每个pod分配了不同的Qos策略, 具体分为Guaranteed, Burstable, Best-Effort。
另外需要首先搞清楚一个概念,resources是对container进行的限制,是配置在每个pod里不同的container里的,而Guaranteed, Burstable, Best-Effort却是K8S对pod分配的Qos策略。
Guaranteed(必须保障)
- 只有当一个pod内,所有的container都设置了limits,且limits和requests的大小一致, 那么这个pod的Qos就是Guaranteed。
如果一个container只配置了limits而没有配置requests,那么默认requests值等于limits。
Burstable(可超频)
- 在一个pod内,只要有一个container的requests和limits设置不相同,该pod的QoS即为Burstable。
Best-Effort(尽力服务)
- 在一个pod内,所有container的resources来说requests与limits均未设置,该pod的QoS即为Best-Effort。
何时进行pod的疏散?
最开始描述的Qos比较笼统,因为服务器的资源其实也分为2大类,即可压缩资源和不可压缩资源,玩过openstack的都应该清楚openstack的resource ratio, 在配置CPU的时候往往会配置1:3或者1:4, 这就是所谓的超配, 因为CPU就是一个可压缩资源,当资源不够的情况下,K8S只会对pod中的进程限制使用cpu,但不会kill该进程导致pod被疏散。而内存或者磁盘不足的情况下,该类资源是不可压缩的,所以只能将pod疏散到其他node上。
而K8s的Qos策略,其实主要是对当node出现不可压缩资源不足的情况下,基于优先级对pod进行疏散的策略。
默认的资源使用阈值如下:
memory.available<100Mi
nodefs.available<10%
nodefs.inodesFree<5%
imagefs.available<15%
kubelet是cobra框架开发的,所以这些阈值当然可以在kubelet启动的时候直接修改
比如:
kubelet --eviction-hard=imagefs.available<10%,\
memory.available<500Mi,\
nodefs.available<5%,\
nodefs.inodesFree<5% \ --eviction-soft=imagefs.available<30%,nodefs.available<10%\
--eviction-soft-grace-period=imagefs.available=2m,nodefs.available=2m\
--eviction-max-pod-grace-period=600
参数里有–eviction-hard 和 --eviction-soft,hard就是资源不足直接kill,soft就是当某种资源不足时,给一个反应的时间,比如上述提到的2m,再进行关闭,这样的好处在于不会因为某个服务一瞬间的高负载导致没有必要的疏散。
优先级
从名字大概就能看出不同Qos的优先级了。
Guaranteed > Burstable > Best-Effort, 优先级越低,越容易被K8S疏散,具体Qos算法后续分析下源码。
个人公众号, 分享一些日常开发,运维工作中的日常以及一些学习感悟,欢迎大家互相学习,交流
更多推荐
所有评论(0)