基于新版API的K8s自定义调度器:能否部署在Pod中运行?
可以在Pod中运行K8s自定义调度器吗?
当然可以,而且这是当前K8s推荐的部署方式之一,完全适配新版API(比如scheduling.k8s.io/v1组下的相关资源,以及核心v1版本的Pod、Node API)。
核心实现要点:
- API版本适配:抛弃旧版
extensions/v1beta1这类废弃API,改用scheduling.k8s.io/v1组注册调度器名称,同时在目标Pod的spec.schedulerName字段指定自定义调度器的名称,即可完成调度请求的定向。 - Pod内运行的关键配置:
- 给调度器Pod绑定ClusterRole,必须包含
nodes(读取节点状态)、pods(获取待调度Pod信息)、bindings(绑定Pod到节点)、events(生成调度事件)等资源的权限,确保能正常调用K8s API。 - 使用K8s内置的ServiceAccount挂载到Pod,自动注入API访问凭证,无需手动维护kubeconfig文件。
- 基于官方
client-go库开发调度器时,直接使用新版scheme(kubernetes/client-go/kubernetes/scheme)就能适配最新API,无需兼容旧版逻辑。
- 给调度器Pod绑定ClusterRole,必须包含
- 部署步骤参考:
- 将自定义调度器二进制打包为容器镜像,编写Deployment部署该镜像。
- 创建ClusterRole定义所需权限,再通过ClusterRoleBinding绑定到调度器使用的ServiceAccount。
- 给需要自定义调度的Pod添加
spec.schedulerName: 你的调度器名称字段,即可让自定义调度器处理它的调度请求。
额外注意点:
- 调度器程序要使用新版Informer机制监听节点和Pod的状态变化,比轮询API高效得多,避免给集群带来额外压力。
- 要实现高可用,直接调整Deployment的副本数即可,K8s会自动把调度请求分发给存活的调度器实例。
内容的提问来源于stack exchange,提问作者Guy-Arieli
相关产品推荐
相关产品推荐

