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来控制抢占缩容的数量。

相关推荐
Aspiresky34 分钟前
浅析Linux进程信号处理机制:基本原理及应用
linux·运维·信号处理
全栈工程师修炼指南1 小时前
告别手动构建!Jenkins 与 Gitlab 完美协作,根据参数自动化触发CI/CD流水线实践
运维·ci/cd·自动化·gitlab·jenkins
ajassi20001 小时前
linux C 语言开发 (八) 进程基础
linux·运维·服务器
summer_west_fish2 小时前
2023年系统分析师上半年论文试题分析
kubernetes
matlab的学徒2 小时前
Web与Nginx网站服务(改)
linux·运维·前端·nginx·tomcat
LeeZhao@2 小时前
【AI推理部署】Docker篇04—Docker自动构建镜像
人工智能·docker·容器
程思扬2 小时前
利用JSONCrack与cpolar提升数据可视化及跨团队协作效率
网络·人工智能·经验分享·docker·信息可视化·容器·架构
Insist7532 小时前
prometheus安装部署与alertmanager邮箱告警
linux·运维·grafana·prometheus
xqlily3 小时前
Linux操作系统之Ubuntu
linux·运维·ubuntu
落日漫游3 小时前
dockercompose和k8s区别
docker·kubernetes