0%

十三、k8s资源调度原理

[toc]

资源调度#

1 k8s资源模型#

Node是资源的提供者,Pod是资源的使用者。
Node能提供三方面资源:

  • 计算资源(CPU\GPU\内存)
  • 存储资源(磁盘、其他介质)
  • 网络资源(贷款、网咯地址)

CPU是可压缩资源,资源不足时pod只会变慢
内存是不可压缩资源,资源不足时pod会被杀死。

1Core = 1MillCores, 因此0.5核有时也写成500m

2 服务质量和优先级#

对于资源,k8s中给出了request和limit两个设置下。
request是供调度器使用,k8s选择节点部署pod时,根据request决定
limit是给cgroups使用,k8s向cgroups传递资源配额时,按limit设置

设计理念是 用户提交工作负载设置的资源配额,并不是容器调度必须严格遵守的之,往往实际使用的都远小于所请求的。

但为了避免总是按最大申请, 引入了pod驱逐机制。
如果有多个pod要驱逐掉其中1个, 则需要服务质量等级和优先级。

  • 服务质量等级:Guaranteed(数据库等重要应用)、Burstable、BestEffort。
  • 优先级:管理员自行决定(priorityClass), 多个pod被调度时,高优先级的pod会优先被调度。如果是杀死pod时,从低优先级开始杀

3 驱逐机制#

有两种pod的驱逐机制:

  • 软驱逐:例如低于可用内存20%时,先观察一段时间,如果能恢复说明只是抖动,如果持续低则会进行pod优雅退出(先清理、落盘再结束pod)
  • 硬驱逐:例如低于可用内存10%,则立刻结束pod且不会优雅退出

为了避免重复调度到刚才资源不足的节点上,还会有一个k8s参数用来约束调度器,多久内不能把pod调度到刚才的节点上。

4 调度器原理#

  • informer loop:持续循环监控etcd中关于pod和node的资源变化情况,将资源变化封装后发送给调度队列和调度缓存。
  • scheduler Loop: 不断循环从上面的队列中取数据,并使用过滤代码进行过滤,可根据cpu、磁盘卷、节点状态进行过滤,然后再根据排序策略决定最终可以用哪些节点用来调度最新pod。
    image.png