3. 调度器配置基础:KubeSchedulerConfiguration结构、配置文件格式(YAML/JSON)、版本兼容性
Kubernetes 调度器的行为完全由 KubeSchedulerConfiguration 对象控制。从 v1.23 开始,该配置作为一等 API 资源存在,支持结构化版本管理。理解其结构、文件格式与版本兼容性,是进行调度参数调优和资源碎片治理的前提。
3.1 配置结构总览
KubeSchedulerConfiguration 是调度器的核心配置结构,包含以下关键层级:
| 配置层级 | 字段 | 说明 |
|---|---|---|
| API 版本 | apiVersion |
固定为 kubescheduler.config.k8s.io/v1(v1.23+) |
| 类型标识 | kind |
固定为 KubeSchedulerConfiguration |
| 并行度 | parallelism |
调度器主循环的并行 goroutine 数,默认 16 |
| Leader 选举 | leaderElection |
高可用模式下 Leader 选举配置 |
| 客户端连接 | clientConnection |
kubeconfig 路径、QPS、burst 等 |
| 调试配置 | debuggingConfiguration |
profiling 开关、EnableContentionProfiling |
| 框架扩展点 | profiles |
调度框架插件配置,支持多 profile |
| Pod 抢占 | podMaxInUnschedulablePodsDuration |
Pod 在不可调度队列中的最大停留时间 |
关键理解:
profiles 字段是调度器配置的核心,它定义了调度框架中每个扩展点(QueueSort、PreFilter、Filter、Score 等)启用的插件及其参数。多 profile 支持为不同 Pod 组提供差异化调度策略。
3.2 配置文件格式:YAML 与 JSON
调度器配置文件支持 YAML 和 JSON 两种格式。YAML 是社区推荐的首选格式,因其可读性更高、支持注释。JSON 通常用于程序化生成或与旧工具链集成。
YAML 配置示例(推荐)
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
parallelism: 16
leaderElection:
leaderElect: true
resourceNamespace: kube-system
resourceName: kube-scheduler
clientConnection:
kubeconfig: /etc/kubernetes/scheduler.conf
qps: 100
burst: 200
profiles:
- schedulerName: default-scheduler
plugins:
score:
disabled:
- name: NodeResourcesLeastAllocated
enabled:
- name: NodeResourcesBalancedAllocation
weight: 2
- name: NodeResourcesFit
weight: 1
pluginConfig:
- name: NodeResourcesFit
args:
scoringStrategy:
type: MostAllocated
resources:
- name: cpu
weight: 1
- name: memory
weight: 1
podMaxInUnschedulablePodsDuration: 5m0s
JSON 配置示例
{
"apiVersion": "kubescheduler.config.k8s.io/v1",
"kind": "KubeSchedulerConfiguration",
"parallelism": 16,
"leaderElection": {
"leaderElect": true,
"resourceNamespace": "kube-system",
"resourceName": "kube-scheduler"
},
"clientConnection": {
"kubeconfig": "/etc/kubernetes/scheduler.conf",
"qps": 100,
"burst": 200
},
"profiles": [
{
"schedulerName": "default-scheduler",
"plugins": {
"score": {
"disabled": [
{ "name": "NodeResourcesLeastAllocated" }
],
"enabled": [
{ "name": "NodeResourcesBalancedAllocation", "weight": 2 },
{ "name": "NodeResourcesFit", "weight": 1 }
]
}
}
}
],
"podMaxInUnschedulablePodsDuration": "5m0s"
}
实践建议: 始终使用 YAML 格式编写调度器配置。YAML 支持行内注释,便于团队协作维护。JSON 仅用于自动化工具链或 API 响应解析场景。
3.3 版本兼容性矩阵
KubeSchedulerConfiguration 的 API 版本与 Kubernetes 版本严格对应。不同版本之间可能存在字段增减或行为变更。
| Kubernetes 版本 | 配置 API 版本 | 状态 | 关键变更 |
|---|---|---|---|
| v1.19 - v1.22 | kubescheduler.config.k8s.io/v1beta2 |
已废弃 | 引入 profiles 概念,支持多调度器 |
| v1.23 - v1.24 | kubescheduler.config.k8s.io/v1 |
稳定版 | v1beta2 升级为 v1,字段稳定 |
| v1.25 - v1.27 | kubescheduler.config.k8s.io/v1 |
稳定版 | 新增 podMaxInUnschedulablePodsDuration |
| v1.28+ | kubescheduler.config.k8s.io/v1 |
当前稳定版 | 扩展插件配置,支持更多评分策略 |
版本兼容警告: 不要将 v1beta2 配置直接用于 v1.23+ 集群。虽然 kube-scheduler 可能自动转换,但某些字段(如
extenders)的行为已发生变化。始终使用与集群版本匹配的 API 版本。
3.4 配置加载流程与版本协商
调度器启动时,配置文件的加载遵循以下流程:
- 命令行参数解析: 通过
--config标志指定配置文件路径 - 文件读取与解码: 根据文件扩展名(
.yaml/.yml/.json)选择解码器 - 版本转换: 如果配置的
apiVersion低于当前调度器支持的版本,自动进行内部版本转换 - 默认值注入: 未显式设置的字段使用调度器内置默认值
- 校验: 对配置进行语义校验(如插件名称是否存在、权重是否合法)
- 应用配置: 将校验通过的配置应用到调度器实例
版本协商机制: 调度器内部维护了从旧版本到当前版本的转换函数。例如,v1beta2 配置中的
hardPodAffinitySymmetricWeight 字段在 v1 版本中被合并到 pluginConfig 中。转换过程自动完成,但建议用户始终使用最新稳定版本。
3.5 配置结构关系图
下图展示了 KubeSchedulerConfiguration 的核心结构及其层级关系:
3.6 配置最佳实践
- 版本锁定: 在配置文件中显式声明
apiVersion,不要依赖默认值。这有助于跨版本迁移时快速识别配置来源。 - 最小化配置: 只覆盖需要修改的字段,未指定的字段将使用调度器内置的合理默认值。这降低了配置出错的风险。
- 配置审计: 将调度器配置文件纳入版本控制(Git),每次变更都附带变更说明。使用
kube-scheduler --config启动时,调度器会输出配置校验结果到日志。 - 多 profile 隔离: 当使用多 profile 时,为每个 profile 设置明确的
schedulerName,并在 Pod 的spec.schedulerName中指定。避免不同 profile 之间的插件配置冲突。 - 配置验证: 在部署前使用
kube-scheduler --config /path/to/config --version验证配置文件的语法正确性。该命令会解析配置并输出解析结果,不会启动调度器。
生产环境建议: 在集群升级前,先在新版本的测试环境中验证调度器配置的兼容性。重点关注
profiles 中的插件配置,因为不同版本可能对插件参数有更严格的校验。