图解Kubernetes Pod 优先级

365 阅读3分钟

优先级表示 Pod 相对于其他 Pod 的重要性。

关键点

  • 启用 Pod 优先级后,调度程序会根据挂起的 Pod 的优先级进行排序,并且挂起的 Pod 会被放置在调度队列中优先级较低的其他挂起的 Pod 之前。因此,如果满足调度要求,较高优先级的 Pod 可能会比较低优先级的 Pod 更早被调度。
  • 如果某个 Pod 无法被调度,调度程序会尝试抢占(驱逐)较低优先级的 Pod,以便能够调度待处理的 Pod。
  • Kubernetes 已经附带了两个 PriorityClass:**system-cluster-critical****system-node-critical**。这些是通用类,用于确保始终首先调度关键组件
  • PriorityClass 是非命名空间对象
  • 优先级类别的值越大,优先级越高
  • PriorityClass 对象可以具有小于或等于10 亿的任何 32 位整数值
  • 较大的数量是为通常不应被抢占或驱逐的关键系统 Pod 保留的
  • **globalDefault=true**字段指示此 PriorityClass 的值应用于没有优先级的 PodpriorityClassName
  • globalDefault系统中只能存在一个设置为 true 的 PriorityClass 。
  • 如果删除 PriorityClass,使用已删除 PriorityClass 名称的现有 Pod 保持不变,但您无法创建更多使用已删除 PriorityClass 名称的 Pod。
  • **非抢占优先级:**具有 的 PodpreemptionPolicy: Never将被放置在优先级较低的 Pod 之前的调度队列中,但它们不能抢占其他 Pod。等待调度的非抢占式 pod 将停留在调度队列中,直到有足够的资源可用,并且可以进行调度。
  • 优先级准入控制器使用该priorityClassName字段并填充优先级的整数值。如果未找到优先级,则 Pod 会被拒绝。

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
   name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for XYZ service pods only."

用例:生产中的某些应用程序应该始终部署并且不想被杀死。例如,指标收集器 Daemonset、日志代理、支付服务等。

为了确保关键任务 Pod 的可用性,您可以创建具有优先级的 Pod 层层次结构;当集群中出现资源紧缩时,kubelet会尝试杀死低优先级的 Pod,以容纳具有较高 PriorityClass 的 Pod。

非抢占式 PriorityClass 示例清单

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
    name: high-priority-nonpreempting
value: 1000000
preemptionPolicy: Never
globalDefault: false
description: "This priority class will not cause other pods to be preempted."

数据科学工作负载用例:用户可能会提交一项他们希望优先于其他工作负载的作业,但不希望通过抢占正在运行的 Pod 来丢弃现有工作。preemptionPolicy: Never一旦有足够的集群资源自然空闲,高优先级作业将先于其他排队的 pod 进行调度。

将 PriorityClass 绑定到 Pod

优先级准入控制器使用该priorityClassName字段并填充优先级的整数值。如果未找到优先级,则 Pod 会被拒绝。


apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  priorityClassName: high-priority

抢占

  1. Pod 创建后,会进入队列并等待调度。
  2. 调度程序从队列中选择一个 Pod 并尝试将其调度到某个 Node 上。
  3. 如果没有找到满足 Pod 所有指定要求的 Node,则会触发对待处理 Pod 的抢占逻辑。
  4. 我们将待处理的 Pod 称为 P。抢占逻辑尝试找到一个节点,在该节点中删除优先级低于 P 的一个或多个 Pod 将使 P 能够在该节点上调度。
  5. 如果找到这样的节点,一个或多个优先级较低的 Pod 将从该节点中逐出。Pod 消失后,可以将 P 调度到 Node 上。
  6. 当 Pod P抢占节点****N上的一个或多个 Pod 时,**nominatedNodeName**Pod P 的状态字段将设置为**节点 N 的名称。**该字段有助于调度程序跟踪为 Pod P 保留的资源,并为用户提供有关其集群中抢占的信息。