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