自定义kube-scheduler

调度器介绍

scheduler 是k8s master的一部分

自定义调度器方式

  • 添加功能重新编译

  • 实现自己的调度器(multi-scheduler)

  • scheduler调用扩展程序实现最终调度(Kubernetes scheduler extender)

添加调度功能

k8s中的调度算法介绍

预选 优选

实现自己的调度器(配置多个scheduler)

scheduler以插件形式存在,集群中可以存在多个scheduler,可以显式指定scheduler

配置pod使用自己的调度器

下面pod显式指定使用my-scheduler调度器

官方给出的shell版本scheduler示例

影响pod调度的因素

https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/

预选

过滤不符合运行条件的node

优选

对node进行打分

抢占

Kubernetes 1.8 及其以后的版本中可以指定 Pod 的优先级。优先级表明了一个 Pod 相对于其它 Pod 的重要性。 当 Pod 无法被调度时,scheduler 会尝试抢占(驱逐)低优先级的 Pod,使得这些挂起的 pod 可以被调度。 在 Kubernetes 未来的发布版本中,优先级也会影响节点上资源回收的排序。

1.9+支持pdb,优先支持PDB策略,但在无法抢占其他pod的情况下,配置pdb策略的pod依旧会被抢占

Kubernetes scheduler extender

scheduler策略配置

包含extender的配置

通过k8s predicates和pod过滤的节点集传递给扩展器上的FilterVerb端点的参数。 通过k8s predicates和扩展predicates以及pod过滤的节点集传递给扩展器上的PrioritizeVerb端点的参数。

"filter"被调用时返回节点列表(schedulerapi.ExtenderFilterResult), "prioritize"返回节点的优先级(schedulerapi.HostPriorityList).

"filter"可以根据对应动作对节点列表进行剪裁,"prioritize"返回的分数将添加到k8s最终分数(通过其优先函数进行计算),用于最终宿主选择。

“bind”调用用于将pod绑定到节点的代理绑定到扩展器。它可以选择由扩展器实现。当它被实现时, 它是向apiserver发出绑定调用的扩展器的响应。 Pod名称,名称空间,UID和节点名称被传递给扩展器

ExtenderBindingArgs表示将pod绑定到节点的扩展器的参数

实现

参考: https://github.com/kubernetes/community/blob/master/contributors/devel/scheduler.md https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/scheduler_extender.md https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/ https://github.com/kubernetes/kubernetes-docs-cn/blob/master/docs/concepts/overview/extending.md

Last updated

Was this helpful?