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 从启动到加载配置的完整流程:

kube-scheduler 配置加载流程 kube-scheduler 配置加载流程 kube-scheduler 启动 解析 CLI 参数(--config 等) --config 指定? 是 加载 KubeSchedulerConfiguration 否 使用 CLI 默认值 + 遗留参数 构建调度器实例并启动

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 配置验证与调试

在将配置应用到生产环境前,建议通过以下方式验证配置正确性:

  1. Schema 校验:使用 kube-scheduler --config /path/to/config.yaml --v=6 启动,观察日志中是否有解析错误
  2. Dry-run 模式:Kubernetes v1.24+ 支持 --dry-run 参数,模拟调度但不实际绑定
  3. Metrics 监控:通过 /metrics 端点观察 scheduler_plugin_* 指标,确认插件加载正常
  4. 事件审计:查看调度失败 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"