侧边栏壁纸
博主头像
船长博主等级

专注于云原生运维,致敬每个爱学习的你

  • 累计撰写 35 篇文章
  • 累计创建 10 个标签
  • 累计收到 9 条评论

Pod 优先权和抢占

船长
2022-01-29 / 0 评论 / 0 点赞 / 322 阅读 / 2,411 字
温馨提示:
本文最后更新于 2022-02-11,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Pod 可以有优先级。优先级表示一个Pod相对于其他Pod的重要性。如果一个重要性的Pod无法调度(处于Pending状态),调度程序会尝试 抢占(驱逐)较低优先级的 Pod, 以使悬决 Pod 可以被调度。

PriorityClass

PriorityClass 是一个无名称空间对象,它定义了从优先级类名称到优先级整数值的映射值在必填的 。 PriorityClass 对象的名称必须是有效的 DNS 子域 并且它不能以 system- 为前缀。

PriorityClass 对象。 较大的数字是为通常不应被抢占或驱逐的关键的系统 Pod 所保留的。 集群管理员应该为这类映射分别创建独立的 PriorityClass 对象。

注意:

  • 如果你升级一个已经存在的但尚未使用此特性的集群,该集群中已经存在Pod的优先级等效于零
  • 添加一个 将 globalDefault 设置为 true 的 PriorityClass 不会改变现有 Pod 的优先级。 此类 PriorityClass 的值仅用于添加 PriorityClass 后创建的 Pod。
  • 如果你删除了某个
  • PriorityClass 对象,则使用被删除的 PriorityClass 名称的现有 Pod 保持不变, 但是你不能再创建使用已删除的 PriorityClass 名称的 Pod。

PriorityClass example

首先在Kubernetetes集群中创建一个PriorityClass对象(无需指定namespace)

# cat high-priority.yml 
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "优先级高"

# kubectl apply -f high-priority.yml 
priorityclass.scheduling.k8s.io/high-priority created

字段解释:

  • name:字段中指定在 PriorityClass 对象元数据的 名称

  • value 字段中指定优先级。值越大,优先级越高,可以设置任何小于或等于 10 亿的 32 位整数值

  • globalDefault 字段表示这个 PriorityClass 的值应该用于没有 priorityClassName 的 Pod。 系统中只能存在一个 globalDefault 设置为 true 的 PriorityClass,如果不存在设置了 globalDefault 的 PriorityClass, 则没有 priorityClassName 的 Pod 的优先级为零

  • description 字段是此 PriorityClass的一个描述信息

PriorityClass对象创建完毕后,我们需要创建一个Pod来引用。

# vim nginx.yml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  priorityClassName: high-priority

# kubectl apply -f nginx.yml 
pod/nginx created

字段解释:

  • priorityClassName 字段指定引用某个priorityClass对象

非抢占式 PriorityClass

默认创建的PriorityClass是抢占式的如果一个重要性的Pod无法调度(处于Pending状态),调度程序会尝试 抢占(驱逐)较低优先级的 Pod, 而使悬决 Pod 可以被调度。这样在某种应用场景反而不太好。那非抢占式 PriorityClass又是什么呢?

Pod调度的时候将被放置在调度队列 中较低优先级 Pod 之前 但它们不能抢占其他 Pod,而是等待调度的非抢占式 Pod 将留在调度队列中,直到有足够的可用资源, 它才可以被调度。

非抢占式 Pod 仍可能被其他高优先级 Pod 抢占。

PreemptionPolicy 默认为 PreemptLowerPriority, 这将允许该 PriorityClass 的 Pod 抢占较低优先级的 Pod(现有默认行为也是如此)。 如果 PreemptionPolicy 设置为 Never,则该 PriorityClass 中的 Pod 将是非抢占式的。

非抢占式 PriorityClass example

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority-nonpreempting
value: 1000000
preemptionPolicy: Never
globalDefault: false
description: "非抢占式 PriorityClass example"

Pod 优先级和服务质量之间的相互作用

Pod 优先级和 QoS 类 是两个正交特征,交互很少,并且对基于 QoS 类设置 Pod 的优先级没有默认限制。 调度器的抢占逻辑在选择抢占目标时不考虑 QoS。 抢占会考虑 Pod 优先级并尝试选择一组优先级最低的目标。 仅当移除优先级最低的 Pod 不足以让调度程序调度抢占式 Pod, 或者最低优先级的 Pod 受 PodDisruptionBudget 保护时,才会考虑优先级较高的 Pod。

kubelet 使用优先级来确定 节点压力驱逐 Pod 的顺序。 你可以使用 QoS 类来估计 Pod 最有可能被驱逐的顺序。kubelet 根据以下因素对 Pod 进行驱逐排名:

  1. 对紧俏资源的使用是否超过请求值
  2. Pod 优先级
  3. 相对于请求的资源使用量

参考文章

https://kubernetes.io/zh/docs/concepts/scheduling-eviction/pod-priority-preemption/

0

评论区