在 Kubernetes 集群中,当资源存在竞争时,如何确保核心系统组件和关键业务优先获得资源?

PriorityClass 作为 Kubernetes 调度系统的 “优先级标签”,通过定义 Pod 的相对重要性及资源抢占机制,为这一问题提供了标准化解决方案。

一、PriorityClass 的核心定位与核心特性

1. 本质定义

    PriorityClass 是 Kubernetes 中的集群级非命名空间资源,用于为 Pod 分配 “优先级数值”,数值越高表示 Pod 重要性越高。当集群资源不足时,调度器会依据 PriorityClass 决定 “优先调度哪些 Pod”,以及 “优先终止哪些 Pod 以释放资源”,避免核心服务因资源短缺被意外中断。

2. 关键特性

  • 集群级可见性:PriorityClass 不归属任何命名空间,在整个集群内可见,所有命名空间的 Pod 均可引用,适合统一管理跨环境的资源优先级策略。

  • 数值优先级体系:优先级数值范围通常为 0 - 10000000(1000 万),建议:

    • 系统核心组件(如 etcd、kube-apiserver)优先级 ≥ 1000000(100 万);

    • 关键业务应用优先级不超过 5000000(500 万);

    • 后台非关键任务(如数据导出、日志归档)优先级可设为 100000(10 万)以下。

  • 非配额机制:PriorityClass 仅定义 “优先级顺序”,不替代 ResourceQuota 的资源限制功能,无法保证高优先级 Pod 一定能获得资源,需与资源配额配合使用以实现精细化管控。

二、PriorityClass 的配置与分类实践

1. 核心配置结构

PriorityClass 的 YAML 配置包含三个核心字段:

  • value:优先级数值(必填),决定 Pod 相对重要性;

  • name:PriorityClass 名称(必填),供 Pod 引用;

  • description:描述信息(可选),用于说明该优先级的适用场景,提升可维护性。

2. 三类典型 PriorityClass 配置示例

定义三组优先级,分别对应核心系统、关键业务、后台任务,配置如下:

yaml

# 1. 核心系统组件(必须保证运行,优先级最高)
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: sys-essential
  description: "核心系统组件,必须保证运行"
value: 10000000  # 1000万,系统级优先级

# 2. 关键业务应用(高优先级,保障业务连续性)
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: business-critical
  description: "关键业务应用"
value: 8000000  # 800万,业务级优先级

# 3. 后台非关键任务(低优先级,资源不足时可终止)
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: best-effort
  description: "尽力而为的后台任务"
value: 100000  # 10万,任务级优先级

3. Pod 引用 PriorityClass

Pod 通过 spec.priorityClassName 字段引用已创建的 PriorityClass,示例如下(关键业务应用 Pod):

yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service  # 订单服务(关键业务)
spec:
  replicas: 2
  selector:
    matchLabels:
      app: order-service
  template:
    metadata:
      labels:
        app: order-service
    spec:
      priorityClassName: business-critical  # 引用关键业务优先级
      containers:
      - name: order-processor
        image: nginx
        resources:
          requests:
            cpu: "800m"  # 申请0.8核CPU
            memory: "500Mi"  # 申请500Mi内存
          limits:
            cpu: "800m"
            memory: "500Mi"

三、PriorityClass 的实践注意事项

使用 PriorityClass 时需规避以下常见问题:

  1. 避免 “优先级倒挂”:不要为非核心组件设置过高优先级(如后台任务设为 1000 万),否则可能导致系统组件因资源被抢占而故障;

  2. 配合资源请求配置:所有引用 PriorityClass 的 Pod 必须设置 resources.requests(CPU / 内存),否则调度器无法计算资源需求,可能导致抢占逻辑失效;

  3. 监控抢占事件:通过 kubectl get events --field-selector involvedObject.kind=Pod 查看资源抢占事件,及时发现异常抢占(如关键业务被意外终止);

  4. 清理无用优先级:实验或业务下线后,需通过 kubectl delete priorityclass <name> 删除无用 PriorityClass,避免冗余配置干扰调度。

总结

    PriorityClass 是 Kubernetes 构建 “生产级高可用集群” 的关键组件,其核心价值在于通过 “数值优先级 + 资源抢占” 机制,保障核心系统与关键业务的资源优先性。掌握 PriorityClass 的配置与抢占逻辑,能有效提升集群在资源竞争场景下的稳定性。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐