K8s优先级调度实战:创建高优先级类
K8s 优先级调度实践:创建 high-priority PriorityClass 并配置 Deployment
在 Kubernetes 集群中,优先级调度是保障关键工作负载资源分配的核心能力 —— 通过 PriorityClass 定义 Pod 的优先级,高优先级 Pod 会优先获得调度权,资源不足时低优先级 Pod 会被驱逐,从而确保核心业务稳定运行。本文将结合实操任务,详解如何创建自定义 PriorityClass 并配置 Deployment,帮你掌握 K8s 优先级调度的核心流程。
一、前置知识:理解 PriorityClass
在动手前,先明确 PriorityClass 的核心概念,避免操作踩坑:
1. 什么是 PriorityClass?
PriorityClass 是 K8s 的 “优先级模板”,属于集群级资源(非命名空间隔离),用于定义 Pod 的优先级数值(value)。Pod 通过spec.priorityClassName关联 PriorityClass 后,会继承其优先级,参与调度排序。
2. 关键字段解析
创建 PriorityClass 需关注 4 个核心字段:
字段 | 含义 |
apiVersion | 固定为scheduling.k8s.io/v1(K8s 1.14 + 版本稳定) |
metadata.name | PriorityClass 的名称(需唯一,如high-priority) |
value | 优先级数值(整数,数值越高优先级越高,范围建议 0~1e9,避免与系统冲突) |
globalDefault | 是否作为未指定优先级 Pod 的默认值(建议设为false,避免意外影响) |
description | 优先级用途说明(便于运维理解) |
3. 系统与用户定义的 PriorityClass 区别
K8s 默认内置 2 个高优先级类,用于保障集群核心组件运行,用户定义的优先级需避开其数值范围:
- system-node-critical:value=2000001000(节点关键组件,如 kubelet)
- system-cluster-critical:value=2000000000(集群关键组件,如 kube-dns)
二、任务实操步骤
本次任务目标:创建high-priority优先级类(值为现有用户最高优先级 - 1),并配置priority命名空间下的busybox-logger Deployment。
步骤 1:查看现有 PriorityClass,确定 high-priority 的 value
首先需筛选用户定义的 PriorityClass(排除系统默认的system-*),找到最高优先级数值:
1.1 查看所有 PriorityClass
kubectl get priorityclasses.scheduling.k8s.io -o wide# 简称"pc",可简化命令:kubectl get pc -o wide
1.2 筛选用户定义的最高优先级
通过jsonpath提取名称与数值,排除系统类并按数值倒序排序,取第一行(最高优先级):
# 命令含义:提取所有PC的名称+数值 → 排除system开头 → 按数值倒序 → 取第一行kubectl get pc -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.value}{"\n"}{end}' \| grep -v "system-" \| sort -k2 -nr \| head -n1
1.3 计算 high-priority 的 value
假设上一步输出为user-highest-pc 1000(即现有最高用户优先级为 1000),则:
high-priority的value = 1000 - 1 = 999
若没有用户定义的 PriorityClass:直接设一个合理值(如 1000),确保低于系统默认的 2e9 即可。
步骤 2:创建 high-priority PriorityClass
通过 YAML 文件定义优先级类,便于版本控制与复用:
2.1 编写 YAML 文件(high-priority-pc.yaml)
apiVersion: scheduling.k8s.io/v1kind: PriorityClassmetadata:name: high-priority # 优先级类名称,需与后续Deployment配置一致value: 999 # 替换为步骤1.3计算的数值(如现有最高1000,则填999)globalDefault: false # 禁用默认值,避免影响其他Poddescription: "This priority class is for high-priority user workloads, with value 1 less than the highest existing user-defined priority class."
2.2 应用 YAML 创建 PriorityClass
kubectl apply -f high-priority-pc.yaml
2.3 验证创建结果
kubectl get pc high-priority# 预期输出(确认名称、value、globalDefault正确):NAME VALUE GLOBAL-DEFAULT AGEhigh-priority 999 false 15s
步骤 3:修改 priority 命名空间下的 busybox-logger Deployment
Deployment 的优先级配置需在Pod 模板(spec.template.spec)中添加priorityClassName,修改后会触发滚动更新(新 Pod 用新优先级,旧 Pod 逐步删除)。
方法 1:kubectl edit 直接编辑(可视化)
# 编辑priority命名空间下的busybox-logger Deploymentkubectl edit deployment busybox-logger -n priority
在打开的编辑器中,找到spec.template.spec节点,添加priorityClassName: high-priority:
spec:template:spec:priorityClassName: high-priority # 新增此行,关联high-prioritycontainers:- name: busybox-loggerimage: busybox:1.35 # 示例镜像,以实际为准# ... 其他容器配置
保存退出后,K8s 会自动触发滚动更新。
方法 2:kubectl patch 快速修改(脚本化)
若需批量操作或脚本集成,用patch命令直接修改:
kubectl patch deployment busybox-logger -n priority \--patch '{"spec":{"template":{"spec":{"priorityClassName":"high-priority"}}}'
注意:避免修改其他 Deployment
先确认priority命名空间下的 Deployment 列表,仅操作busybox-logger:
kubectl get deploy -n priority# 仅关注NAME为busybox-logger的资源
步骤 4:验证 Deployment 部署成功
修改后需确认 3 个关键点:滚动更新完成、Pod 正常运行、优先级类已生效。
4.1 检查滚动更新状态
kubectl rollout status deployment busybox-logger -n priority# 预期输出:deployment "busybox-logger" successfully rolled out(更新完成)
4.2 查看新 Pod 状态
# 查看priority命名空间下busybox-logger的Pod(标签以实际为准,通常是app=busybox-logger)kubectl get pods -n priority -l app=busybox-logger# 预期输出:STATUS为Running(无Pending或Error)
4.3 验证 Pod 的优先级类
提取 Pod 的priorityClassName字段,确认已关联high-priority:
# 替换<POD-NAME>为上一步查询到的Pod名称kubectl get pod <POD-NAME> -n priority -o jsonpath='{.spec.priorityClassName}{"\n"}'# 预期输出:high-priority(优先级类已生效)
三、关键注意事项
- 避开系统优先级数值:用户定义的value建议≤1e9(1000000000),避免与system-*类冲突,导致系统组件调度异常。
- globalDefault 禁用:若设为true,所有未指定优先级的 Pod 会默认使用high-priority,可能抢占低优先级业务资源,风险极高。
- 滚动更新兼容性:修改 Pod 模板会重建 Pod,若业务不可中断,需提前配置 Deployment 的滚动策略(如maxUnavailable: 0、minReadySeconds: 30)。
- 资源充足性检查:若新 Pod 处于 Pending 状态,用kubectl describe pod <POD-NAME> -n priority查看事件,通常是资源不足(需扩容节点或调整资源请求)。
四、总结
K8s 优先级调度的核心是通过 PriorityClass 实现 “资源按需分配”,本次任务的核心流程可归纳为:
- 查:筛选现有用户优先级,确定新优先级数值;
- 创:通过 YAML 创建自定义 PriorityClass;
- 改:修改 Deployment 的 Pod 模板,关联新优先级;
- 验:确认更新完成与优先级生效。
在实际生产中,需结合业务重要性划分优先级层级(如高 / 中 / 低),并通过 Prometheus 监控高优先级 Pod 的调度成功率,确保核心业务稳定运行。