k8s学习:了解和使用PriorityClass资源,定义pod优先级和抢占

背景

升级集群之后,没有创建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资源的几个知识点:

  1. PriorityClass是一个无命名空间对象,定义的是优先级名称到优先级整数的映射,数值越大,优先级越高;
  2. PriorityClass的名称不能以system-为前缀;
  3. PriorityClass 对象可以设置任何小于或等于 10 亿的 32 位整数值;
  4. PriorityClass 还有两个可选字段:globalDefaultdescriptionglobalDefault 字段表示这个 PriorityClass 的值应该用于没有 priorityClassName 的 Pod。 系统中只能存在一个 globalDefault 设置为 true 的 PriorityClass。 如果不存在设置了 globalDefault 的 PriorityClass, 则没有 priorityClassName 的 Pod 的优先级为零。description 字段是一个任意字符串。 它用来告诉集群用户何时应该使用此 PriorityClass。
  5. 删除了某个 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来控制抢占缩容的数量。

相关推荐
安审若无17 分钟前
运维知识框架
运维·服务器
苏渡苇2 小时前
Docker 网络完全指南
网络·docker·容器·docker容器·容器通信
风向决定发型丶2 小时前
K8S CPU绑核详解
云原生·容器·kubernetes
Arvin6273 小时前
Nginx 添加账号密码访问验证
运维·服务器·nginx
风曦Kisaki3 小时前
# Linux 磁盘查看命令详解:df 与 du
linux·运维·网络
斯普信云原生组4 小时前
Docker 开源软件应急处理方案及操作手册——镜像管理与构建故障
docker·容器·eureka
攻城狮在此4 小时前
华为交换机Console口密码如何清除
运维·网络·华为
内心的一片海4 小时前
服务器内存异常占用
运维·服务器
亚空间仓鼠5 小时前
OpenEuler系统常用服务(四)
linux·运维·服务器·网络
MichealChen0105086 小时前
Influxdb-cluster使用docker部署
运维·docker·容器