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/v1

kind: PriorityClass

metadata:

name: high-priority # 优先级类名称,需与后续Deployment配置一致

value: 999 # 替换为步骤1.3计算的数值(如现有最高1000,则填999)

globalDefault: false # 禁用默认值,避免影响其他Pod

description: "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 AGE

high-priority 999 false 15s

步骤 3:修改 priority 命名空间下的 busybox-logger Deployment

Deployment 的优先级配置需在Pod 模板 (spec.template.spec)中添加priorityClassName,修改后会触发滚动更新(新 Pod 用新优先级,旧 Pod 逐步删除)。

方法 1:kubectl edit 直接编辑(可视化)
复制代码
复制代码
# 编辑priority命名空间下的busybox-logger Deployment

kubectl edit deployment busybox-logger -n priority

在打开的编辑器中,找到spec.template.spec节点,添加priorityClassName: high-priority:

复制代码
复制代码
spec:

template:

spec:

priorityClassName: high-priority # 新增此行,关联high-priority

containers:

- name: busybox-logger

image: 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(优先级类已生效)

三、关键注意事项

  1. 避开系统优先级数值:用户定义的value建议≤1e9(1000000000),避免与system-*类冲突,导致系统组件调度异常。
  1. globalDefault 禁用:若设为true,所有未指定优先级的 Pod 会默认使用high-priority,可能抢占低优先级业务资源,风险极高。
  1. 滚动更新兼容性:修改 Pod 模板会重建 Pod,若业务不可中断,需提前配置 Deployment 的滚动策略(如maxUnavailable: 0、minReadySeconds: 30)。
  1. 资源充足性检查:若新 Pod 处于 Pending 状态,用kubectl describe pod <POD-NAME> -n priority查看事件,通常是资源不足(需扩容节点或调整资源请求)。

四、总结

K8s 优先级调度的核心是通过 PriorityClass 实现 "资源按需分配",本次任务的核心流程可归纳为:

  1. :筛选现有用户优先级,确定新优先级数值;
  1. :通过 YAML 创建自定义 PriorityClass;
  1. :修改 Deployment 的 Pod 模板,关联新优先级;
  1. :确认更新完成与优先级生效。

在实际生产中,需结合业务重要性划分优先级层级(如高 / 中 / 低),并通过 Prometheus 监控高优先级 Pod 的调度成功率,确保核心业务稳定运行。

相关推荐
小白不想白a2 小时前
【K8s】K8s的声明式API核心
云原生·容器·kubernetes
卓码软件测评2 小时前
K6的CI/CD集成在云原生应用的性能测试应用
前端·功能测试·测试工具·ci/cd·云原生
Leon_az3 小时前
Docker 容器如何实现隔离
linux·docker·容器
灵雀云4 小时前
灵雀云六度入选 Gartner 中国 ICT 技术成熟度曲线报告,ACP以安全、稳定、智能三大核心能力定义企业级云原生数字底座
安全·云原生
new_daimond4 小时前
Zookeeper 技术详细介绍
分布式·zookeeper·云原生
cpsvps_net4 小时前
多主机Docker Swarm集群网络拓扑可视化监控方案的部署规范
运维·docker·容器
幻灭行度5 小时前
CKAD-CN 考试知识点分享(3) 更新 Deployment 标签,并暴露 Service
kubernetes
灵雀云5 小时前
工业互联网的云原生转型路径
云原生
ccccczy_5 小时前
Java微服务容器化与 Kubernetes 编排实战:从 Docker 多阶段构建到云原生弹性扩展
java·docker·kubernetes·springboot·microservices·cloudnative·containerization