目录
配置文件
扩展点
调度插件
多配置文件
应用于多个扩展点的插件
调度程序配置迁移
你可以通过编写配置文件,并将其路径传给 kube-scheduler 的命令行参数,定制 kube-scheduler 的行为。
调度模板(Profile)允许你配置 kube-scheduler 中的不同调度阶段。每个阶段都暴露于某个扩展点中。插件通过实现一个或多个扩展点来提供调度行为。
你可以通过运行 kube-scheduler --config
最简单的配置如下:
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
clientConnection:
kubeconfig: /etc/srv/kubernetes/kube-scheduler/kubeconfig
说明:
KubeSchedulerConfiguration v1beta2 在 v1.25 中已弃用,并将在 v1.28 中移除。 KubeSchedulerConfiguration v1beta3 在 v1.26 中已弃用,并将在 v1.29 中移除。
请将 KubeSchedulerConfiguration 迁移到 v1。
通过调度配置文件,你可以配置 kube-scheduler 在不同阶段的调度行为。 每个阶段都在一个扩展点中公开。 调度插件通过实现一个或多个扩展点,来提供调度行为。
你可以配置同一 kube-scheduler 实例使用多个配置文件。
调度行为发生在一系列阶段中,这些阶段是通过以下扩展点公开的:
对每个扩展点,你可以禁用默认插件或者是启用自己的插件,例如:
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- plugins:
score:
disabled:
- name: PodTopologySpread
enabled:
- name: MyCustomPluginA
weight: 2
- name: MyCustomPluginB
weight: 1
你可以在 disabled 数组中使用 * 禁用该扩展点的所有默认插件。 如果需要,这个字段也可以用来对插件重新顺序。
下面默认启用的插件实现了一个或多个扩展点:
你也可以通过组件配置 API 启用以下插件(默认不启用):
你可以配置 kube-scheduler 运行多个配置文件。 每个配置文件都有一个关联的调度器名称,并且可以在其扩展点中配置一组不同的插件。
使用下面的配置样例,调度器将运行两个配置文件:一个使用默认插件,另一个禁用所有打分插件。
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
- schedulerName: no-scoring-scheduler
plugins:
preScore:
disabled:
- name: '*'
score:
disabled:
- name: '*'
对于那些希望根据特定配置文件来进行调度的 Pod,可以在 .spec.schedulerName 字段指定相应的调度器名称。
默认情况下,将创建一个调度器名为 default-scheduler 的配置文件。 这个配置文件包括上面描述的所有默认插件。 声明多个配置文件时,每个配置文件中调度器名称必须唯一。
如果 Pod 未指定调度器名称,kube-apiserver 将会把调度器名设置为 default-scheduler。 因此,应该存在一个调度器名为 default-scheduler 的配置文件来调度这些 Pod。
说明:
Pod 的调度事件把 .spec.schedulerName 字段值作为 ReportingController。 领导者选举事件使用列表中第一个配置文件的调度器名称。
说明:
所有配置文件必须在 queueSort 扩展点使用相同的插件,并具有相同的配置参数(如果适用)。 这是因为调度器只有一个保存 pending 状态 Pod 的队列。
从 kubescheduler.config.k8s.io/v1beta3 开始,配置文件配置中有一个附加字段 multiPoint,它允许跨多个扩展点轻松启用或禁用插件。 multiPoint 配置的目的是简化用户和管理员在使用自定义配置文件时所需的配置。
考虑一个插件,MyPlugin,它实现了 preScore、score、preFilter 和 filter 扩展点。 要为其所有可用的扩展点启用 MyPlugin,配置文件配置如下所示:
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: multipoint-scheduler
plugins:
multiPoint:
enabled:
- name: MyPlugin
这相当于为所有扩展点手动启用 MyPlugin,如下所示:
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: non-multipoint-scheduler
plugins:
preScore:
enabled:
- name: MyPlugin
score:
enabled:
- name: MyPlugin
preFilter:
enabled:
- name: MyPlugin
filter:
enabled:
- name: MyPlugin
在这里使用 multiPoint 的一个好处是,如果 MyPlugin 将来实现另一个扩展点,multiPoint 配置将自动为新扩展启用它。
可以使用该扩展点的 disabled 字段将特定扩展点从 MultiPoint 扩展中排除。 这适用于禁用默认插件、非默认插件或使用通配符 ('*') 来禁用所有插件。 禁用 Score 和 PreScore 的一个例子是:
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: non-multipoint-scheduler
plugins:
multiPoint:
enabled:
- name: 'MyPlugin'
preScore:
disabled:
- name: '*'
score:
disabled:
- name: '*'
从 kubescheduler.config.k8s.io/v1beta3 开始,所有默认插件都通过 MultiPoint 在内部启用。 但是,仍然可以使用单独的扩展点来灵活地重新配置默认值(例如排序和分数权重)。 例如,考虑两个 Score 插件 DefaultScore1 和 DefaultScore2,每个插件的权重为 1。 它们可以用不同的权重重新排序,如下所示:
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: multipoint-scheduler
plugins:
score:
enabled:
- name: 'DefaultScore2'
weight: 5
在这个例子中,没有必要在 MultiPoint 中明确指定插件,因为它们是默认插件。 Score 中指定的唯一插件是 DefaultScore2。 这是因为通过特定扩展点设置的插件将始终优先于 MultiPoint 插件。 因此,此代码段实质上重新排序了这两个插件,而无需同时指定它们。
配置 MultiPoint 插件时优先级的一般层次结构如下:
为了演示上述层次结构,以下示例基于这些插件:
插件 |
扩展点 |
DefaultQueueSort |
QueueSort |
CustomQueueSort |
QueueSort |
DefaultPlugin1 |
Score, Filter |
DefaultPlugin2 |
Score |
CustomPlugin1 |
Score, Filter |
CustomPlugin2 |
Score, Filter |
这些插件的一个有效示例配置是:
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: multipoint-scheduler
plugins:
multiPoint:
enabled:
- name: 'CustomQueueSort'
- name: 'CustomPlugin1'
weight: 3
- name: 'CustomPlugin2'
disabled:
- name: 'DefaultQueueSort'
filter:
disabled:
- name: 'DefaultPlugin1'
score:
enabled:
- name: 'DefaultPlugin2'
请注意,在特定扩展点中重新声明 MultiPoint 插件不会出错。 重新声明被忽略(并记录),因为特定的扩展点优先。
除了将大部分配置保存在一个位置之外,此示例还做了一些事情:
在 v1beta3 之前的配置版本中,没有 multiPoint,上面的代码片段等同于:
apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: multipoint-scheduler
plugins:
# 禁用默认的 QueueSort 插件
queueSort:
enabled:
- name: 'CustomQueueSort'
disabled:
- name: 'DefaultQueueSort'
# 启用自定义的 Filter 插件
filter:
enabled:
- name: 'CustomPlugin1'
- name: 'CustomPlugin2'
- name: 'DefaultPlugin2'
disabled:
- name: 'DefaultPlugin1'
# 启用并重新排序自定义的打分插件
score:
enabled:
- name: 'DefaultPlugin2'
weight: 1
- name: 'DefaultPlugin1'
weight: 3
虽然这是一个复杂的例子,但它展示了 MultiPoint 配置的灵活性以及它与配置扩展点的现有方法的无缝集成。