K8s 多调度 Profile 完整配置教程
1. 核心概念
- Profile 是什么
基于调度框架 Scheduling Framework,单个kube-scheduler进程内同时运行多套独立调度规则,每套规则绑定唯一schedulerName。
- 多 Profile 共用同一个 kube-scheduler 二进制、权限、缓存;
- 不同业务 Pod 通过
spec.schedulerName指定使用哪一套调度逻辑; - 无需部署独立第三方调度器(Volcano/Koordinator 那种),轻量化。
- 核心优势
- 在线业务、离线任务、GPU 任务共用一套调度进程,减少组件;
- 不同业务自定义预选/打分插件(比如离线禁用拓扑打散、在线增强均衡打分)。
- API 版本
稳定版kubescheduler.config.k8s.io/v1(1.29+ 废弃 v1beta3/v1beta2)。
2. 完整配置步骤(控制平面 kube-scheduler)
2.1. 步骤1:编写多Profile调度配置文件
文件名为 kube-scheduler-config.yaml,包含两套 Profile:
default-scheduler:默认在线微服务,完整开启拓扑均衡、亲和性;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 集群(最常用)
- 创建 ConfigMap 存放调度配置
kubectl -n kube-system create configmap scheduler-config --from-file=kube-scheduler-config.yaml
- 修改 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参数,全部迁移到配置文件中
- 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. 关键规则与踩坑点
- schedulerName 必须完全匹配Pod 内
schedulerName与 Profile 定义名称大小写、字符必须一致,否则 Pod 无人调度,永久 Pending。 - 多Profile共享锁与缓存
同一个 kube-scheduler 内所有 Profile 共用 informer 缓存、领导者锁,性能损耗极低;独立部署多个 kube-scheduler 会重复缓存,占用更多内存。 - 插件隔离
每个 Profile 的插件完全独立:A Profile 禁用的插件,不影响 B Profile。 - 绑定插件不可删除
Bind系列插件是必需,不能全部禁用,否则无法完成节点绑定。 - 区分「多Profile」和「独立调度器」
- 多Profile:单进程、原生kube-scheduler、轻量化,适合差异化插件;
- 独立调度器(Volcano/YuniKorn):独立二进制,适合完整全新调度逻辑(队列、资源配额、强Gang)。
6. 高频面试简答
- 多调度Profile和部署多个独立kube-scheduler区别?
多Profile单进程运行,共享缓存与权限,轻量化;独立调度器多进程,资源开销大,用于完整自研调度逻辑。 - **如何让Pod使用自定义Profile?**Pod 配置
spec.schedulerName,值与配置中profiles[].schedulerName一一对应。 - 不同Profile之间插件是否互相影响?
完全隔离,每个Profile拥有独立预选、打分插件集合。 - 多Profile依赖什么技术?
基于 Scheduling Framework 调度框架,K8s 1.19稳定,1.25正式生产可用。
关联文档
- kube-scheduler 完整工作原理 — 调度框架原理
- Gang 调度(协同调度)完整详解 — Gang 调度配置
- K8s 高阶调度全解 — 亲和与污点调度