pod优先级

参考:https://kubernetes.io/zh/docs/concepts/configuration/pod-priority-preemption/

PriorityClass

PriorityClass 是一种不属于任何名字空间的对象,定义的是从优先级类名向优先级整数值的映射。 优先级类名称用 PriorityClass 对象的元数据的 name 字段指定。 优先级整数值在必须提供的 value 字段中指定。 优先级值越大,优先级越高。 PriorityClass 对象的名称必须是合法的 DNS 子域名 且不可包含 system- 前缀。
PriorityClass 对象还有两个可选字段:globalDefault 和 description。 前者用来表明此 PriorityClass 的数值应该用于未设置 priorityClassName 的 Pod。 系统中只能存在一个 globalDefault 设为真的 PriorityClass 对象。 如果没有 PriorityClass 对象的 globalDefault 被设置,则未设置 priorityClassName 的 Pod 的优先级为 0.

关于 Pod 优先级与现有集群的说明

  • 如果你要升级一个不支持 Pod 优先级的集群,现有 Pod 的有效优先级都被视为 0。
  • 向集群中添加 globalDefault 设置为 true 的 PriorityClass 不会改变现有 Pod 的优先级。新添加的 PriorityClass 值仅适用于 PriorityClass 被添加之后 新建的 Pod。
  • 如果你要删除 PriorityClass,则使用所删除的 PriorityClass 名称的现有 Pod 都 不会受影响,但是你不可以再创建使用该 PriorityClass 名称的新 Pod。

事例

集群中存在两个默认的PriorityClass

[root@dce-10-23-3-119 ~]# kubectl get  PriorityClass system-cluster-critical -oyaml
apiVersion: scheduling.k8s.io/v1
description: Used for system critical pods that must run in the cluster, but can be
  moved to another node if necessary.
kind: PriorityClass
metadata:
  creationTimestamp: "2021-06-21T05:24:10Z"
  generation: 1
  name: system-cluster-critical
  resourceVersion: "42"
  selfLink: /apis/scheduling.k8s.io/v1/priorityclasses/system-cluster-critical
  uid: 36ca8a5b-31e0-489a-bcfa-af8502ef105e
value: 2000000000

pod中使用PriorityClass

如果在pod中需要配置这个PriorityClass,只需要在yaml文件中配置 priorityClassName:system-cluster-critical(与containers同级)即可

非抢占式的 PriorityClass

配置 preemptionPolicy: Never 的 Pod 在调度队列中会被放在低优先级的 Pod 的前面,但是它们不可以抢占其他 Pod。 非抢占 Pod 会在调度队列中等待调度,直到有足够空闲资源时才被调度。 非抢占 Pod 与其他 Pod 一样,也受调度器回退(Back-off)机制影响。 换言之,如果调度器尝试调度这些 Pod 时发现它们无法调度,它们会被再次尝试,并且 重试的频率会被降低,这样可以使得其他优先级较低的 Pod 有机会在它们之前被调度。
非抢占 Pod 仍有可能被其他高优先级的 Pod 抢占。
preemptionPolicy 默认取值为 PreemptLowerPriority,这会使得该 PriorityClass 的 Pod 能够抢占低优先级的 Pod(这也是当前的默认行为)。 如果 preemptionPolicy 被设置为 Never,则该 PriorityClass 下的 Pod 都是非抢占的。
使用 preemptionPolicy 字段要求启用 NonPreemptingPriority 特性门控。

事例:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority-nonpreempting
value: 1000000
preemptionPolicy: Never
globalDefault: false
description: "This priority class will not cause other pods to be preempted."

暴露给用户的信息

当 Pod P 在节点 N 上抢占了一个或多个 Pod 时,Pod P 的状态中的nominatedNodeName 字段 会被设置为节点 N 的名字。此字段有助于调度器跟踪为 P 所预留的资源,同时也给用户提供了其集群中发生的抢占的信息。

请注意,Pod P 不一定会被调度到其 "nominated node(提名节点)"。 当选定的 Pod 被抢占时,它们都会有其体面终止时限(Graceful Termination Period)。 如果在调度器等待选定的(被牺牲的)Pod 终止期间有新的节点可用,调度器会使用其他 节点来调度 Pod P。因此,Pod 中的 nominatedNodeName nodeName 并不总是相同。 此外,如果调度器抢占了节点 N 上的 Pod,但接下来出现优先级比 P 还高的 Pod 要被 调度,则调度器会把节点 N 让给新的优先级更高的 Pod。如果发生了这种情况,调度器 会清除 Pod P 的 nominatedNodeName。通过清除操作,调度器使得 Pod P 可以尝试 抢占别的节点上的 Pod。

critical pod

除了在主机上运行的 Kubernetes 核心组件(如 api-server 、scheduler 、controller-manager)之外,还有许多插件,由于各种原因, 必须在常规集群节点(而不是 Kubernetes 主节点)上运行。 其中一些插件对于功能完备的群集至关重要,例如 Heapster、DNS 和 UI。 如果关键插件被逐出(手动或作为升级等其他操作的副作用)或者变成挂起状态,群集可能会停止正常工作。 关键插件进入挂起状态的例子有:集群利用率过高;被逐出的关键插件 Pod 释放了空间,但该空间被之前悬决的 Pod 占用;由于其它原因导致节点上可用资源的总量发生变化。

标记关键pod

要将 pod 标记为关键性(critical),pod 必须在 kube-system 命名空间中运行(可通过参数配置)。 同时,需要将 priorityClassName 设置为 system-cluster-critical system-node-critical ,后者是整个群集的最高级别。

posted @ 2021-07-26 22:08  lttL  阅读(324)  评论(0)    收藏  举报