Kubernetes

K8s 多调度 Profile 完整配置教程

·10 分钟阅读·3904 字
📋 目录

K8s 多调度 Profile 完整配置教程

1. 核心概念

  1. Profile 是什么
    基于调度框架 Scheduling Framework,单个 kube-scheduler 进程内同时运行多套独立调度规则,每套规则绑定唯一 schedulerName
  • 多 Profile 共用同一个 kube-scheduler 二进制、权限、缓存;
  • 不同业务 Pod 通过 spec.schedulerName 指定使用哪一套调度逻辑;
  • 无需部署独立第三方调度器(Volcano/Koordinator 那种),轻量化。
  1. 核心优势
  • 在线业务、离线任务、GPU 任务共用一套调度进程,减少组件;
  • 不同业务自定义预选/打分插件(比如离线禁用拓扑打散、在线增强均衡打分)。
  1. API 版本
    稳定版 kubescheduler.config.k8s.io/v1(1.29+ 废弃 v1beta3/v1beta2)。

2. 完整配置步骤(控制平面 kube-scheduler)

2.1. 步骤1:编写多Profile调度配置文件

文件名为 kube-scheduler-config.yaml,包含两套 Profile:

  1. default-scheduler:默认在线微服务,完整开启拓扑均衡、亲和性;
  2. batch-scheduler:离线批量任务,关闭拓扑打分、开启Gang调度插件。
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
# 连接apiserver凭证
clientConnection:
  kubeconfig: /etc/kubernetes/scheduler.conf
# 领导者选举,多副本高可用
leaderElection:
  leaderElect: true
  resourceNamespace: kube-system
  resourceName: kube-scheduler
# 打分阶段抽样节点比例,优化调度性能
percentageOfNodesToScore: 30

# 多Profile数组(核心)
profiles:
  # Profile1:默认在线业务调度器(原生全套插件)
  - schedulerName: default-scheduler
    plugins:
      # 全部使用默认插件,无需额外声明

  # Profile2:离线批量任务专用调度器
  - schedulerName: batch-scheduler
    plugins:
      score:
        # 禁用PodTopology # 禁用PodTopologySpread拓扑均衡打分(离线不需要多可用区打散)
        disabled:
          - name: PodTopologySpread
        # 优先最少资源节点
        enabled:
          - name: LeastRequestedPriority
            weight: 10
      # 启用批量Gang调度插件(scheduler-plugins)
      multiPoint:
        enabled:
          - name: Coscheduling
# 插件全局参数(可选,给Coscheduling等插件传参)
pluginConfig:
  - name: Coscheduling
    args:
      kind: CoschedulingArgs
      PermitWaitingTimeSeconds: 60

2.2. 步骤2:将配置挂载到 kube-scheduler

集群分两种部署方式:kubeadm 集群 / 二进制自建集群

2.2.1. 方式A:kubeadm 集群(最常用)

  1. 创建 ConfigMap 存放调度配置
kubectl -n kube-system create configmap scheduler-config --from-file=kube-scheduler-config.yaml
  1. 修改 kube-scheduler static pod 清单
    路径:/etc/kubernetes/manifests/kube-scheduler.yaml
  • 增加 volume 挂载配置:
volumes:
- name: scheduler-config
  configMap:
    name: scheduler-config
volumeMounts:
- name: scheduler-config
  mountPath: /etc/kubernetes/scheduler
  • 修改启动命令,加载配置文件:
command:
- kube-scheduler
- --config=/etc/kubernetes/scheduler/kube-scheduler-config.yaml
# 删除旧的一堆--xxx参数,全部迁移到配置文件中
  1. kubelet 自动重建 kube-scheduler Pod,加载多Profile配置。

2.2.2. 方式B:二进制自建集群

直接在 kube-scheduler 启动参数增加:

--config=/etc/kubernetes/scheduler-config.yaml

2.3. 步骤3:验证调度器启动正常

# 查看调度器日志,确认两个profile加载成功
kubectl -n kube-system logs kube-scheduler-xxx
# 关键字日志:Registered profile "default-scheduler" / "batch-scheduler"

3. 业务Pod如何指定不同Profile

通过 spec.schedulerName 匹配配置中 profiles[].schedulerName

3.1. 普通在线Pod(使用默认profile)

apiVersion: v1
kind: Pod
metadata:
  name: web-app
spec:
  schedulerName: default-scheduler
  containers:
  - name: nginx
    image: nginx

3.2. 离线批量Pod(使用batch调度profile)

apiVersion: v1
kind: Pod
metadata:
  name: spark-task
spec:
  schedulerName: batch-scheduler
  containers:
  - name: spark
    image: spark:3.3

3.3. Deployment 模板写法

spec:
  template:
    spec:
      schedulerName: batch-scheduler

4. 常用扩展配置示例(多Profile差异化定制)

4.1. 示例1:GPU专用Profile,只启用节点资源过滤

profiles:
- schedulerName: gpu-scheduler
  plugins:
    filter:
      enabled:
        - name: NodeResourcesFit
        - name: NodeTaintsToleration
    score:
      disabled:
        - name: "*" # 关闭所有打分,仅过滤有GPU的节点

4.2. 示例2:高优核心业务Profile,调高均衡打分权重

- schedulerName: core-scheduler
  plugins:
    score:
      enabled:
        - name: BalancedResourceAllocation
          weight: 30 # 默认10,提高均衡权重

5. 关键规则与踩坑点

  1. schedulerName 必须完全匹配Pod 内 schedulerName 与 Profile 定义名称大小写、字符必须一致,否则 Pod 无人调度,永久 Pending。
  2. 多Profile共享锁与缓存
    同一个 kube-scheduler 内所有 Profile 共用 informer 缓存、领导者锁,性能损耗极低;独立部署多个 kube-scheduler 会重复缓存,占用更多内存。
  3. 插件隔离
    每个 Profile 的插件完全独立:A Profile 禁用的插件,不影响 B Profile。
  4. 绑定插件不可删除
    Bind 系列插件是必需,不能全部禁用,否则无法完成节点绑定。
  5. 区分「多Profile」和「独立调度器」
  • 多Profile:单进程、原生kube-scheduler、轻量化,适合差异化插件;
  • 独立调度器(Volcano/YuniKorn):独立二进制,适合完整全新调度逻辑(队列、资源配额、强Gang)。

6. 高频面试简答

  1. 多调度Profile和部署多个独立kube-scheduler区别?
    多Profile单进程运行,共享缓存与权限,轻量化;独立调度器多进程,资源开销大,用于完整自研调度逻辑。
  2. **如何让Pod使用自定义Profile?**Pod 配置 spec.schedulerName,值与配置中 profiles[].schedulerName 一一对应。
  3. 不同Profile之间插件是否互相影响?
    完全隔离,每个Profile拥有独立预选、打分插件集合。
  4. 多Profile依赖什么技术?
    基于 Scheduling Framework 调度框架,K8s 1.19稳定,1.25正式生产可用。

关联文档