k8s从入门到精通(八):Scheduler

Scheduler是负责容器调度组件,每个Pod最终需要在一台node节点上启动,通过scheduler调度组件的筛选、打分可以选择出Pod启动的最佳节点。当Pod创建后Pod的NodeName属性为空,scheduler会查询所有NodeName为空的Pod并执行调度策略,选择最优的放置节点后,调用Apiserver绑定Pod对应的主机(设置Pod NodeName属性)。当绑定过后对应节点的kubelet便可以启动容器。

k8s从入门到精通(八):Scheduler

Scheduler的调度过程分为两个两步,第一步是筛选(Predicate),筛选满足需要的节点。筛选的条件主要包括1)Pod所需的资源(CPU、内存、GPU等);2)端口是否冲突(主要是针对Pod HostPort端口和主机上面已有端口);3)nodeSelector以及亲和性(Pod亲和性和Node亲和性);4)Pod如果使用本地存储,那么在调度时,将只会调度存储绑定的节点;5)节点的驱赶策略,节点可以通过taint(污点)设置驱赶Pod策略,对应的Pod也可以设置Toleration(容忍)。第二步是根据资源分配算法排序打分(Priorities)最终选择得分最高的节点作为最终的调度节点,主要调度策略包括:LeastRequestedPriority最少资源请求算法、BalancedResourceAllocation均衡资源使用算法、ImageLocalityPriority镜像本地优先算法、NodeAffinityPriority主机亲和算法等。为了归一化每种算法的权重,每种算法取值范围都是0-10,最终累加所有算法的总和取得分最大的主机作为Pod的运行主机。为了提高调度的效率,scheduler的Predicate和Priorities采用了并行调度,除此之外scheduler组件本地维护了一个调度队列和本地缓存,调度队列暂存了需要被调度的Pod,还可以调整调度的先后顺序。本地缓存主要是缓存了Pod和Node信息,这样可以避免每次调度时从Apiserver获取主机信息。整个流程如下图所示。

k8s从入门到精通(八):Scheduler

k8s为了增加扩展性,scheduler 整个过程设置了多个扩展点,这些扩展点除了有系统自带的调度算法,用户还可以根据自己的需求,添加自己的plguin,从而实现零代码侵入扩展scheduler的能力。关于如何实现一个自定义的plugin我们放到实战环节再详细介绍。

k8s从入门到精通(八):Scheduler

展开阅读全文

页面更新:2024-04-27

标签:亲和性   队列   节点   缓存   绑定   端口   算法   容器   得分   组件   属性   入门   策略   主机   资源   科技   信息

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top