Pod 可以有优先级。优先级表示一个Pod相对于其他Pod的重要性。如果一个重要性的Pod无法调度(处于Pending状态),调度程序会尝试 抢占(驱逐)较低优先级的 Pod, 以使悬决 Pod 可以被调度。
PriorityClass
PriorityClass 是一个无名称空间对象,它定义了从优先级类名称到优先级整数值的映射值在必填的 。 PriorityClass 对象的名称必须是有效的 DNS 子域 并且它不能以 system-
为前缀。
PriorityClass 对象。 较大的数字是为通常不应被抢占或驱逐的关键的系统 Pod 所保留的。 集群管理员应该为这类映射分别创建独立的 PriorityClass 对象。
注意:
- 如果你升级一个已经存在的但尚未使用此特性的集群,该集群中已经存在Pod的优先级等效于零
- 添加一个 将
globalDefault
设置为true
的 PriorityClass 不会改变现有 Pod 的优先级。 此类 PriorityClass 的值仅用于添加 PriorityClass 后创建的 Pod。 - 如果你删除了某个
- PriorityClass 对象,则使用被删除的 PriorityClass 名称的现有 Pod 保持不变, 但是你不能再创建使用已删除的 PriorityClass 名称的 Pod。
PriorityClass example
首先在Kubernetetes集群中创建一个PriorityClass对象(无需指定namespace)
# cat high-priority.yml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "优先级高"
# kubectl apply -f high-priority.yml
priorityclass.scheduling.k8s.io/high-priority created
字段解释:
-
name
:字段中指定在 PriorityClass 对象元数据的 名称 -
value
字段中指定优先级。值越大,优先级越高,可以设置任何小于或等于 10 亿的 32 位整数值 -
globalDefault
字段表示这个 PriorityClass 的值应该用于没有priorityClassName
的 Pod。 系统中只能存在一个globalDefault
设置为 true 的 PriorityClass,如果不存在设置了globalDefault
的 PriorityClass, 则没有priorityClassName
的 Pod 的优先级为零 -
description
字段是此 PriorityClass的一个描述信息
PriorityClass对象创建完毕后,我们需要创建一个Pod来引用。
# vim nginx.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
priorityClassName: high-priority
# kubectl apply -f nginx.yml
pod/nginx created
字段解释:
- priorityClassName 字段指定引用某个priorityClass对象
非抢占式 PriorityClass
默认创建的PriorityClass是抢占式的如果一个重要性的Pod无法调度(处于Pending状态),调度程序会尝试 抢占(驱逐)较低优先级的 Pod, 而使悬决 Pod 可以被调度。这样在某种应用场景反而不太好。那非抢占式 PriorityClass又是什么呢?
Pod调度的时候将被放置在调度队列 中较低优先级 Pod 之前 但它们不能抢占其他 Pod,而是等待调度的非抢占式 Pod 将留在调度队列中,直到有足够的可用资源, 它才可以被调度。
非抢占式 Pod 仍可能被其他高优先级 Pod 抢占。
PreemptionPolicy
默认为 PreemptLowerPriority
, 这将允许该 PriorityClass 的 Pod 抢占较低优先级的 Pod(现有默认行为也是如此)。 如果 PreemptionPolicy
设置为 Never
,则该 PriorityClass 中的 Pod 将是非抢占式的。
非抢占式 PriorityClass example
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority-nonpreempting
value: 1000000
preemptionPolicy: Never
globalDefault: false
description: "非抢占式 PriorityClass example"
Pod 优先级和服务质量之间的相互作用
Pod 优先级和 QoS 类 是两个正交特征,交互很少,并且对基于 QoS 类设置 Pod 的优先级没有默认限制。 调度器的抢占逻辑在选择抢占目标时不考虑 QoS。 抢占会考虑 Pod 优先级并尝试选择一组优先级最低的目标。 仅当移除优先级最低的 Pod 不足以让调度程序调度抢占式 Pod, 或者最低优先级的 Pod 受 PodDisruptionBudget 保护时,才会考虑优先级较高的 Pod。
kubelet 使用优先级来确定 节点压力驱逐 Pod 的顺序。 你可以使用 QoS 类来估计 Pod 最有可能被驱逐的顺序。kubelet 根据以下因素对 Pod 进行驱逐排名:
- 对紧俏资源的使用是否超过请求值
- Pod 优先级
- 相对于请求的资源使用量
参考文章
https://kubernetes.io/zh/docs/concepts/scheduling-eviction/pod-priority-preemption/
评论区