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

相关推荐
鹏大师运维2 小时前
为什么信创电脑装软件总提示“软件包架构不匹配”?
linux·运维·架构·国产化·麒麟·deb·统信uos
007张三丰2 小时前
软件测试专栏(11/20):测试框架开发:pytest深度解析与插件体系
运维·服务器·自动化测试·pytest·测试框架
weixin_604236673 小时前
华三 路由器 极简核心配置
运维·服务器·网络·h3c·h3c路由器
鹤落晴春4 小时前
【Linux复习】管理SELinux安全性
linux·运维·服务器
AI智图坊4 小时前
多件装组合SKU图的批量生产效率分析:从PS手工到AI自动化的工作流改造
大数据·运维·人工智能·gpt·ai作画·自动化·aigc
鹤落晴春7 小时前
【K8s】Pod调度、configMaps
云原生·容器·kubernetes
张忠琳7 小时前
【runc 1.4.2】(Part 2)runc 1.4.2 超深度分析 — CLI层:main.go、命令文件、runner、信号处理、TTY
云原生·kubernetes·runc
极客先躯8 小时前
高级java每日一道面试题-2026年02月02日-实战篇[Docker]-如何实现容器的持久化存储?
docker·容器·面试宝典·持久化·存储·韵味·java高级面试题
云计算磊哥@8 小时前
运维开发宝典026-MySQL02数据库表操作
运维·数据库·运维开发
天天进步20159 小时前
Tunnelto 源码解析 #9:控制服务器设计:Warp、WebSocket、Ping/Pong 与连接保活
运维·服务器·websocket