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

相关推荐
瀚高PG实验室3 小时前
连接指定数据库时提示not currently accepting connections
运维·数据库
QQ2740287563 小时前
Soundness Gitpod 部署教程
linux·运维·服务器·前端·chrome·web3
淡忘_cx3 小时前
【frp XTCP 穿透配置教程
运维
南方以南_3 小时前
Ubuntu操作合集
linux·运维·ubuntu
爱吃芝麻汤圆3 小时前
k8s之Kubebuilder 的设计哲学
云原生·容器·kubernetes
裁二尺秋风5 小时前
k8s(12) — 版本控制和滚动更新(金丝雀部署理念)
云原生·容器·kubernetes
项目題供诗5 小时前
黑马k8s(六)
云原生·容器·kubernetes
爱莉希雅&&&5 小时前
shell脚本之条件判断,循环控制,exit详解
linux·运维·服务器·ssh
Sylvan Ding6 小时前
远程主机状态监控-GPU服务器状态监控-深度学习服务器状态监控
运维·服务器·深度学习·监控·远程·gpu状态
北漂老男孩7 小时前
在 Linux 上安装 MATLAB:完整指南与疑难解决方案
linux·运维·matlab