背景
升级集群之后,没有创建PriorityClass资源,于是扩容实例的时候,提示如下错误: 看这个报错,提示很明显,PriorityClass资源没有创建,于是按照如下模板创建资源:
yaml
apiVersion: scheduling.k8s.io/v1
description: hke-priority-test
kind: PriorityClass
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"scheduling.k8s.io/v1","description":"hke-priority-test","kind":"PriorityClass","metadata":{"annotations":{},"name":"hke-priority-test"},"value":500000}
creationTimestamp: "2024-03-11T06:47:32Z"
generation: 1
name: hke-priority-test
resourceVersion: "64525928"
uid: e6adfcc8-2038-4d0a-935d-e960a4b2390b
preemptionPolicy: PreemptLowerPriority
value: 500000
此时,如果不重新创建之前的资源,这个策略是不会生效的。需要重新创建服务资源,此时新启动的实例可以查询到PriorityClass资源,会使用PreemptLowerPriority规则进行pod抢占策略。之前对于PriorityClass资源只是知道,但是并没有了解过,趁此机会好好学习下:
PriorityClass
官网开头就写了如果要使用优先级和抢占,需要先新增一个或多个 PriorityClass,之后创建pod,将其 priorityClassName
设置为新增的 PriorityClass,一般我们会把这个设置集合到deployment或者cloneset等模板中。
PriorityClass资源的几个知识点:
- PriorityClass是一个无命名空间对象,定义的是优先级名称到优先级整数的映射,数值越大,优先级越高;
- PriorityClass的名称不能以system-为前缀;
- PriorityClass 对象可以设置任何小于或等于 10 亿的 32 位整数值;
- PriorityClass 还有两个可选字段:
globalDefault
和description
。globalDefault
字段表示这个 PriorityClass 的值应该用于没有priorityClassName
的 Pod。 系统中只能存在一个globalDefault
设置为 true 的 PriorityClass。 如果不存在设置了globalDefault
的 PriorityClass, 则没有priorityClassName
的 Pod 的优先级为零。description
字段是一个任意字符串。 它用来告诉集群用户何时应该使用此 PriorityClass。 - 删除了某个 PriorityClass 对象,则使用被删除的 PriorityClass 名称的现有 Pod 保持不变, 但是不能再创建使用已删除的 PriorityClass 名称的 Pod。
官网给的模板
yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
//是否非抢占式,never表示非抢占式,优先级低
reemptionPolicy: Never
globalDefault: false
description: "此优先级类应仅用于 XYZ 服务 Pod。"
pod的优先级和抢占原理
在创建一个或者多个PriorityClass 对象后,在创建pod时可以通过priorityClassName
字段填充PriorityClass对象
定义的优先级整数值。较高优先级的pod会比较低优先级的pod早调度。
当pod被创建后会进入队列等待调度,调度器从队列中挑选一个pod并尝试将它调度到node上,如果没有找到满足要求的node,则触发对悬决pod
的抢占逻辑。我们假设悬决 Pod 为P,抢占逻辑试图找到一个节点,在该节点中删除一个或多个优先级低于 P 的 Pod,则可以将 P 调度到该节点上。 如果找到这样的节点,一个或多个优先级较低的 Pod 会被从节点中驱逐。 被驱逐的 Pod 消失后,P 可以被调度到该节点上。可以通过设置"优雅退出时间"即graceful termination period来实现延迟抢占,也可以设置PodDisruptionBudget来控制抢占缩容的数量。