K8s 调度框架设计与 scheduler plugins 开发部署示例(2024)

K8s 调度框架设计与 scheduler plugins 开发部署示例(2024)

💡 原文中文,约18900字,阅读约需45分钟。
📝

内容提要

本文介绍了Kubernetes调度框架及其扩展插件机制,重点讲解了如何实现固定宿主机调度插件。通过示例代码,展示了在K8s v1.28中注册和使用调度插件,以确保虚拟机在故障恢复后仍能调度到相同节点。

🔎

延伸解读

调度框架扩展点:影响决策与信息传递

K8s调度框架的扩展点分为两类:一类直接影响调度决策,如Filter、Score、Reserve等,插件通过返回状态决定Pod能否调度到某节点;另一类仅传递信息,如PreBind、PostBind,插件无法改变调度结果。理解这一区别有助于正确选择扩展点,避免在信息型扩展点中尝试干预调度。

固定宿主机调度的实现要点

实现固定宿主机调度需在PreFilter、Filter和PostBind三个扩展点注册函数。PreFilter阶段查询Pod关联的VM/VMI,检查VM注解中是否已记录节点;Filter阶段若存在记录节点,则仅允许该节点通过;PostBind阶段将首次调度的节点写入VM注解。这样确保VM故障重建后仍调度到原节点。

Out-of-tree插件的部署与配置

Out-of-tree插件独立于K8s代码库,以普通Pod方式部署,无需修改kube-scheduler。通过KubeSchedulerConfiguration定义调度器配置,可启用或禁用特定插件,并支持多profile启动多个独立调度器。Pod通过schedulerName指定使用哪个调度器,未指定则使用默认调度器。

开发注意事项与依赖管理

开发调度插件时,需注意Golang依赖的版本兼容性,包括K8s、scheduler-plugins、KubeVirt等组件的版本匹配。插件作为长期运行的服务,与CNI插件不同,需以Deployment或二进制方式部署。调试时可使用集群管理员证书快速迭代,但生产环境需配置合适的RBAC。

❓

Q&A

Kubernetes调度框架的主要功能是什么?

Kubernetes调度框架提供了扩展调度功能的插件机制,允许用户实现自定义调度逻辑。

如何在K8s v1.28中实现固定宿主机调度?

在K8s v1.28中,通过注册调度插件实现固定宿主机调度,确保虚拟机在故障恢复后仍能调度到相同节点。

调度过程中的调度周期和绑定周期有什么区别?

调度周期选择节点,绑定周期则在节点上创建持久卷。

用户如何编写自己的调度插件?

用户可以编写内置插件和外部插件,外部插件不需要修改K8s代码,可以独立部署。

实现固定宿主机调度需要注册哪些扩展点?

需要在多个扩展点注册调度函数,包括PreFilter、Filter和PostBind。

StickyVM调度插件的作用是什么?

StickyVM调度插件确保虚拟机在故障后仍能调度到相同节点,保持数据一致性。

🏷️

标签

➡️

继续阅读