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

相关推荐
--运维实习生--39 分钟前
shell脚本第二阶段-----选择结构
linux·运维·shell编程
plusplus1681 小时前
Kubernetes“城市规划”指南:告别资源拥堵与预算超支,打造高效云原生都市
云原生·容器·kubernetes
果子⌂2 小时前
Git+Jenkins实战(一)
运维·git·jenkins
chenglin0162 小时前
Logstash——输出(Output)
运维·jenkins
苦逼IT运维2 小时前
Jenkins + SonarQube 从原理到实战四:Jenkins 与 Gerrit 集成并实现自动任务
运维·git·测试工具·ci/cd·jenkins
qq_312920112 小时前
K8s存储类(StorageClass)设计与Ceph集成实战
ceph·容器·kubernetes
Nazi62 小时前
kubeadm部署k8s集群环境搭建
云原生·容器·kubernetes
Brilliantee4042 小时前
藏在 K8s 幕后的记忆中枢(etcd)
容器·kubernetes·etcd
明天见~~3 小时前
Linux下的网络编程
linux·运维·网络
秋天枫叶354 小时前
【AI应用】修改向量数据库Milvus默认密码
运维·服务器·数据库·ubuntu·milvus·milvus_cli