面试常被追问k8s调度器工作原理,一图胜千言,收藏 == 学废。
kube-scheduler负责将k8s pod调度到worker节点上。
当你部署pod时,manifest文件pod规格会指定cpu、memory、亲和性affinity、污点taints、优先级、持久盘等。
调度器的主要工作是识别create request然后选择满足要求的最佳节点。

分步解释:
Pod Create Request: 外部系统(kubectl、cicd)发出了创建一个新pod的请求。kube-api server收到请求,然后将pod状态保存到etcd(集群的分布式kv存储)。kube scheduler持续监听unassignedods (使用watch机制),注意到新的pod。4.1. scheduler会根据pod的规格(cpu、memory、亲和性)决定pod应在哪个节点上运行,并创建pod-node binding,它会将此绑定决定通知api server (调度的核心看下文)。
kubelet, 也会持续监听新pod分配(使用watch机制),侦测到最新的已经分配的pod。kubelet从api server拉取pod manifest信息, 内容包含启动需要的镜像、volume、网络配置。在k8s集群,会存在不止一个节点,scheduler是如何从所有worker节点中选中节点。
scheduler一般包含两阶段:

在这个时期,kueb-scheduler使用过滤和打分策略选择最佳节点。
从本质上讲,它会利用pod规格(cpu、memory、亲和性、污点、持久盘)过滤掉不适合运行特定pod的节点。
对于大集群, 预选Predicates之后, 也不会对剩下的所有节点都做打分。
scheduler有一个配置参数percentageOfNodesToScore决定了参与打分的节点比例。 默认值取值参考集群大小:小集群50%--->大集群5%
即使这个百分比被设置的很小,scheduler会持续搜索直到找到了𝗺𝗶𝗻𝗙𝗲𝗮𝘀𝗶𝗯𝗹𝗲𝗡𝗼𝗱𝗲𝘀𝗧𝗼𝗙𝗶𝗻𝗱数量。
k8s使用Priorities(Scorers)来给节点打分,打分机制通过各种scheduling 插件来实现。
scheduler通过调用多个调度插件给节点打分, 每个插件都会根据特定标准对节点进行评估,并累计到最终得分。
最后,排名最高的worker节点会被选中调度pod。如果所有节点的排名相同,则会随机选择一个节点。
一旦节点被选中,调度器在api server创建了binding event(pod+node)。
4.1.2 绑定期
scheduler尝试将pod绑定到得分最高的节点,如果绑定失败,scheduler一般会选用次高得分的节点。
开发者可以创建自定义scheduler,在集群内和原生调度器一起运行。
当部署pod时,可以在pod manifest文件指定自定义的Scheduler, 这样调度器的调度决定就会基于你自定义的调度逻辑。
调度器有一个可插拔的调度框架,这意味着开发者可以在调度工作流中添加自定义的插件。
参考资料
[1]
kube-scheduler是如何选中节点?: https://blog.techiescamp.com/docs/kubernetes-scheduler-chooses-a-node/