×

您可以在集群中启用 Pod 优先级和抢占。Pod 优先级表示 Pod 相对于其他 Pod 的重要性,并根据该优先级对 Pod 进行排队。Pod 抢占允许集群驱逐或抢占低优先级 Pod,以便如果合适的节点上没有可用空间,则可以调度高优先级 Pod。Pod 优先级还会影响 Pod 的调度顺序以及节点上的资源不足驱逐顺序。

要使用优先级和抢占,请在 Pod 规范中引用优先级类以应用该调度权重。

理解 Pod 优先级

使用 Pod 优先级和抢占功能时,调度程序按其优先级对挂起的 Pod 进行排序,并且挂起的 Pod 在调度队列中位于优先级较低的其他挂起 Pod 之前。因此,如果满足其调度要求,则高优先级 Pod 的调度速度可能快于优先级较低的 Pod。如果无法调度 Pod,调度程序将继续调度其他低优先级 Pod。

Pod 优先级类

您可以为 Pod 分配优先级类,这是一个非命名空间对象,它定义了从名称到优先级整数值的映射。值越高,优先级越高。

优先级类对象可以采用任何小于或等于 1000000000(十亿)的 32 位整数值。保留大于或等于十亿的数字,用于必须不抢占或驱逐的关键 Pod。默认情况下,OpenShift Dedicated 为关键系统 Pod 保留了两个优先级类,以确保调度。

$ oc get priorityclasses
示例输出
NAME                      VALUE        GLOBAL-DEFAULT   AGE
system-node-critical      2000001000   false            72m
system-cluster-critical   2000000000   false            72m
openshift-user-critical   1000000000   false            3d13h
cluster-logging           1000000      false            29s
  • system-node-critical - 此优先级类的值为 2000001000,用于所有不应从节点中驱逐的 Pod。具有此优先级类的 Pod 例子包括 ovnkube-node 等。许多关键组件默认包含 system-node-critical 优先级类,例如

    • master-api

    • master-controller

    • master-etcd

    • ovn-kubernetes

    • sync

  • system-cluster-critical - 此优先级类的值为 2000000000(二十亿),用于对集群很重要的 Pod。在某些情况下,可以从节点中驱逐具有此优先级类的 Pod。例如,配置了 system-node-critical 优先级类的 Pod 可以优先。但是,此优先级类确实确保了保证的调度。可以具有此优先级类的 Pod 例子包括 fluentd、附加组件(如 descheduler)等。许多关键组件默认包含 system-cluster-critical 优先级类,例如

    • fluentd

    • metrics-server

    • descheduler

  • openshift-user-critical - 您可以将 `priorityClassName` 字段用于那些无法绑定其资源消耗且资源消耗行为不可预测的重要 Pod。 `openshift-monitoring` 和 `openshift-user-workload-monitoring` 命名空间下的 Prometheus Pod 使用 `openshift-user-critical` `priorityClassName`。监控工作负载使用 `system-critical` 作为其第一个 `priorityClass`,但这会在监控使用过多内存且节点无法驱逐它们时导致问题。结果,监控降低优先级以提高调度程序的灵活性,在节点之间移动繁重的负载以保持关键节点的运行。

  • cluster-logging - Fluentd 使用此优先级来确保 Fluentd Pod 比其他应用程序优先调度到节点上。

Pod 优先级名称

拥有一个或多个优先级类后,您可以创建指定 `Pod` 规范中优先级类名称的 Pod。优先级准入控制器使用优先级类名称字段来填充优先级的整数值。如果未找到指定的优先级类,则会拒绝该 Pod。

了解 Pod 抢占

当开发人员创建 Pod 时,该 Pod 将进入队列。如果开发人员为 Pod 配置了 Pod 优先级或抢占,则调度程序将从队列中选择一个 Pod 并尝试将其调度到节点上。如果调度程序无法在满足 Pod 所有指定要求的合适节点上找到空间,则会为待处理的 Pod 触发抢占逻辑。

当调度程序抢占节点上的一个或多个 Pod 时,较高优先级 `Pod` 规范的 `nominatedNodeName` 字段将设置为节点的名称,以及 `nodename` 字段。调度程序使用 `nominatedNodeName` 字段来跟踪为 Pod 保留的资源,并向用户提供有关集群中抢占的信息。

调度程序抢占较低优先级的 Pod 后,它会遵守该 Pod 的优雅终止周期。如果在调度程序等待较低优先级 Pod 终止期间另一个节点可用,则调度程序可以在该节点上调度较高优先级的 Pod。结果,`Pod` 规范的 `nominatedNodeName` 字段和 `nodeName` 字段可能不同。

此外,如果调度程序抢占节点上的 Pod 并等待终止,并且需要调度比待处理 Pod 优先级更高的 Pod,则调度程序可以改用调度更高优先级的 Pod。在这种情况下,调度程序将清除待处理 Pod 的 `nominatedNodeName`,使该 Pod 有资格用于另一个节点。

抢占并不一定从节点中删除所有较低优先级的 Pod。调度程序可以通过删除部分较低优先级的 Pod 来调度待处理的 Pod。

只有在待处理的 Pod 可以在节点上调度的情况下,调度程序才会考虑将该节点用于 Pod 抢占。

非抢占式优先级类

抢占策略设置为 `Never` 的 Pod 将放置在调度队列中,优先于较低优先级的 Pod,但它们不能抢占其他 Pod。等待调度的非抢占式 Pod 将保留在调度队列中,直到有足够的资源可用并可以调度它。非抢占式 Pod 与其他 Pod 一样,也受调度程序回退的影响。这意味着如果调度程序尝试调度这些 Pod 未成功,则会以较低的频率重试,从而允许其他优先级较低的 Pod 先于它们被调度。

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

Pod 抢占和其他调度程序设置

如果启用 Pod 优先级和抢占,请考虑您的其他调度程序设置。

Pod 优先级和 Pod 中断预算

Pod 中断预算指定必须同时运行的副本的最小数量或百分比。如果指定了 Pod 中断预算,则 OpenShift Dedicated 会尽力遵守这些预算来抢占 Pod。调度程序尝试在不违反 Pod 中断预算的情况下抢占 Pod。如果没有找到此类 Pod,即使考虑了它们的 Pod 中断预算要求,也可能会抢占较低优先级的 Pod。

Pod 优先级和 Pod 亲和性

Pod 亲和性要求将新的 Pod 调度到与具有相同标签的其他 Pod 相同的节点上。

如果待处理的 Pod 与节点上一个或多个较低优先级的 Pod 具有 Pod 间亲和性,则调度程序无法在不违反亲和性要求的情况下抢占较低优先级的 Pod。在这种情况下,调度程序会查找另一个节点来调度待处理的 Pod。但是,调度程序无法保证能找到合适的节点,并且待处理的 Pod 可能无法调度。

为避免这种情况,请仔细配置具有相同优先级的 Pod 的 Pod 亲和性。

被抢占 Pod 的优雅终止

抢占 Pod 时,调度程序会等待 Pod 的优雅终止周期到期,从而允许 Pod 完成工作并退出。如果 Pod 在该周期后未退出,则调度程序会终止该 Pod。此优雅终止周期会在调度程序抢占 Pod 的时间点与待处理的 Pod 可以在节点上调度的时间点之间产生时间差。

为了最小化此时间差,请为较低优先级的 Pod 配置较短的优雅终止周期。

配置优先级和抢占

您可以通过创建优先级类对象并将 Pod 使用其 Pod 规范中的 `priorityClassName` 与优先级关联来应用 Pod 优先级和抢占。

您不能直接将优先级类添加到现有已调度的 Pod。

步骤

要配置集群以使用优先级和抢占

  1. 定义一个 Pod 规范以包含优先级类的名称,方法是创建一个类似于以下内容的 YAML 文件

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
      priorityClassName: system-cluster-critical (1)
    1 指定要与此 Pod 一起使用的优先级类。
  2. 创建 Pod

    $ oc create -f <file-name>.yaml

    您可以直接将优先级名称添加到 Pod 配置或 Pod 模板中。