3、默认调度器配置:kube-scheduler的启动参数、配置文件结构(KubeSchedulerConfiguration)
Kubernetes 默认调度器 kube-scheduler 的配置方式经历了从“纯命令行参数”到“配置文件 + 命令行参数”的演进。在 v1.23+ 版本中,KubeSchedulerConfiguration 已成为主流配置形态,支持更精细的调度策略、插件开关、资源绑定与评分权重调整。
3.1 启动参数概览
kube-scheduler 的启动参数分为三类:通用服务参数、鉴权与安全参数、配置加载参数。下表列出最核心的启动参数:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--config |
string | "" | 指向 KubeSchedulerConfiguration YAML 文件的路径;指定后大部分 CLI 参数被忽略 |
--kubeconfig |
string | "" | 用于连接 API Server 的 kubeconfig 路径 |
--master |
string | "" | API Server 地址(不推荐,优先使用 kubeconfig) |
--port |
int | 10259 | HTTPS 安全端口(v1.23+ 默认 10259) |
--secure-port |
int | 10259 | 安全端口,替代旧版 --port |
--leader-elect |
bool | true | 启用 Leader Election,高可用部署时必开 |
--v |
int | 0 | 日志级别,调优时建议设为 4~5 观察调度决策 |
--profiling |
bool | true | 启用 pprof 性能分析端点 |
最佳实践:生产环境始终使用
--config 指向配置文件,而非在 CLI 中散落参数。配置文件支持版本化、审计和 GitOps 管理。
3.2 KubeSchedulerConfiguration 配置文件结构
KubeSchedulerConfiguration 是调度器的声明式配置对象,定义在 kubescheduler.config.k8s.io API 组中。其顶层结构包含以下核心字段:
- apiVersion:固定为
kubescheduler.config.k8s.io/v1(v1.23+) - kind:固定为
KubeSchedulerConfiguration - profiles:调度器配置文件列表,支持多调度器实例
- extenders:调度扩展器配置(用于对接外部调度逻辑)
- leaderElection:Leader Election 配置
- clientConnection:与 API Server 的连接参数
- percentageOfNodesToScore:调度时评估的节点百分比(调优关键参数)
- podInitialBackoffSeconds / podMaxBackoffSeconds:Pod 调度重试退避时间
核心概念:一个
profile 对应一个调度器实例,包含调度算法、插件集、评分权重等完整配置。默认调度器使用名为 "default-scheduler" 的 profile。
3.3 配置文件完整示例
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
clientConnection:
kubeconfig: "/etc/kubernetes/scheduler.kubeconfig"
leaderElection:
leaderElect: true
resourceNamespace: "kube-system"
resourceName: "kube-scheduler"
profiles:
- schedulerName: default-scheduler
plugins:
queueSort:
enabled:
- name: PrioritySort
preFilter:
enabled:
- name: NodeResourcesFit
- name: NodePorts
filter:
enabled:
- name: NodeUnschedulable
- name: NodeResourcesFit
- name: NodeName
- name: PodTopologySpread
postFilter:
enabled:
- name: DefaultPreemption
preScore:
enabled:
- name: InterPodAffinity
- name: PodTopologySpread
score:
enabled:
- name: NodeResourcesBalancedAllocation
weight: 1
- name: ImageLocality
weight: 1
- name: InterPodAffinity
weight: 2
- name: NodeResourcesFit
weight: 1
- name: PodTopologySpread
weight: 2
reserve:
enabled:
- name: VolumeBinding
permit:
enabled: []
preBind:
enabled:
- name: VolumeBinding
bind:
enabled:
- name: DefaultBinder
percentageOfNodesToScore: 50
podInitialBackoffSeconds: 1
podMaxBackoffSeconds: 10
注意:插件名称区分大小写,且必须与内置插件注册名完全一致。自定义插件需在编译期注册或通过调度器扩展机制加载。
3.4 配置文件核心字段详解
下表对配置文件中的关键字段进行深度说明:
| 字段路径 | 类型 | 调优意义 |
|---|---|---|
profiles[].plugins |
PluginSet | 控制调度各阶段启用的插件,可禁用默认插件或调整顺序 |
profiles[].plugins.score[].weight |
int32 | 评分权重,直接影响节点优先级排序,是资源均衡的核心杠杆 |
percentageOfNodesToScore |
int32 | 控制调度器评估的节点比例,默认 50%;集群规模 > 100 节点时建议调低 |
podInitialBackoffSeconds |
int64 | 调度失败后首次重试等待时间,默认 1s |
podMaxBackoffSeconds |
int64 | 调度失败后最大重试等待时间,默认 10s |
extenders |
[]Extender | 对接外部调度器,用于实现自定义过滤/评分逻辑 |
3.5 调度器配置加载流程
下图展示了 kube-scheduler 从启动到加载配置的完整流程:
3.6 多 Profile 配置与调度器命名
KubeSchedulerConfiguration 支持在 profiles 列表中定义多个调度器实例。每个 profile 通过 schedulerName 字段标识,Pod 通过 spec.schedulerName 选择使用哪个调度器。
profiles:
- schedulerName: default-scheduler
plugins:
score:
enabled:
- name: NodeResourcesBalancedAllocation
weight: 3
- schedulerName: high-priority-scheduler
plugins:
score:
enabled:
- name: NodeResourcesFit
weight: 5
- name: PodTopologySpread
weight: 3
- schedulerName: gpu-scheduler
plugins:
filter:
enabled:
- name: NodeResourcesFit
- name: NodeName
score:
enabled:
- name: NodeResourcesBalancedAllocation
weight: 1
多调度器场景:当集群中存在不同优先级或资源需求的 Workload 时,可定义多个 profile 实现差异化调度策略。例如:批处理作业使用高吞吐调度器,GPU 任务使用专用过滤调度器。
3.7 配置热加载与版本兼容
kube-scheduler 不支持配置热加载。修改配置文件后必须重启调度器 Pod 或进程。配置 API 版本与 Kubernetes 版本的对应关系如下:
| Kubernetes 版本 | KubeSchedulerConfiguration 版本 | 关键变更 |
|---|---|---|
| v1.19 - v1.22 | kubescheduler.config.k8s.io/v1beta2 |
引入 profiles 和 plugins 结构 |
| v1.23+ | kubescheduler.config.k8s.io/v1 |
GA 稳定版,移除 beta API |
| v1.25+ | kubescheduler.config.k8s.io/v1 |
新增 podInitialBackoffSeconds 等字段 |
兼容性提示:使用
v1beta2 版本的配置在 v1.23+ 中仍可工作,但会触发弃用警告。建议所有新集群统一使用 v1 版本。
3.8 配置验证与调试
在将配置应用到生产环境前,建议通过以下方式验证配置正确性:
- Schema 校验:使用
kube-scheduler --config /path/to/config.yaml --v=6启动,观察日志中是否有解析错误 - Dry-run 模式:Kubernetes v1.24+ 支持
--dry-run参数,模拟调度但不实际绑定 - Metrics 监控:通过
/metrics端点观察scheduler_plugin_*指标,确认插件加载正常 - 事件审计:查看调度失败 Pod 的 Events,确认配置是否按预期生效
# 验证配置语法(kube-scheduler 二进制需与集群版本匹配)
kube-scheduler --config scheduler-config.yaml --v=6 2>&1 | grep -i "configuration"
# 预期输出示例:
# I0115 10:23:45.678901 12345 configfile.go:120] "Loaded configuration file" config="scheduler-config.yaml"
# I0115 10:23:45.678912 12345 configfile.go:130] "Using component config version" version="kubescheduler.config.k8s.io/v1"