4.9. 使用 descheduler 驱除 pod

调度程序(scheduler)被用来决定最适合托管新 pod 的节点,而 descheduler 可以用来驱除正在运行的 pod,从而使 pod 能够重新调度到更合适的节点上。

4.9.1. 关于 descheduler

您可以使用 descheduler 根据特定策略驱除 pod,以便可将 pod 重新调度到更合适的节点上。

descheduler 适合于在以下情况下 处理运行的 pod:

  • 节点使用不足或过度使用。
  • Pod 和节点关联性要求(如污点或标签)已更改,并且原始的调度不再适合于某些节点。
  • 节点失败需要移动 pod。
  • 集群中添加了新节点。
  • Pod 重启的次数太多。
重要

descheduler 不调度被驱除的 pod。调度被驱除 pod 的任务由调度程序(scheduler)执行。

当 descheduler 决定从节点驱除 pod 时,它会使用以下机制:

  • openshift-*kube-system 命名空间中的 Pod 不会被驱除。
  • priorityClassName 被设置为 system-cluster-criticalsystem-node-critical 的关键 pod 不会被驱除。
  • 不属于复制控制器、副本集、部署或作业一部分的静态、镜像或独立 pod 不会被驱除,因为这些 pod 不会被重新创建。
  • 与守护进程集关联的 pod 不会被驱除。
  • 具有本地存储的 Pod 不会被驱除。
  • BestEffort pod 会在 Burstable 和 Guaranteed pod 之前被驱除。
  • 具有 descheduler.alpha.kubernetes.io/evict 注解的所有 pod 类型都可以被驱除。此注解用于覆盖防止驱除的检查,用户可以选择驱除哪些 pod。用户应该知道如何创建 pod 以及是否重新创建 pod。
  • 对于受 Pod Disruption Budget (PDB) 限制的 pod,如果进行 deschedule 会违反 Pod disruption budget (PDB),则 pod 不会被驱除。通过使用驱除子资源来处理 PDB 来驱除 pod 。

4.9.2. Descheduler 配置集

以下 descheduler 配置集可用:

AffinityAndTaints

此配置集驱除违反了 pod 间的反关联性、节点关联性和节点污点的 pod。

它启用了以下策略:

  • RemovePodsViolatingInterPodAntiAffinity:删除违反了 pod 间的反关联性的 pod。
  • RemovePodsViolatingNodeAffinity:移除违反了节点关联性的 pod。
  • RemovePodsViolatingNodeTaints:移除违反了节点上的 NoSchedule 污点的 pod。

    移除具有节点关联性类型 requiredDuringSchedulingIgnoredDuringExecution的 pod。

TopologyAndDuplicates

此配置集会驱除 pod 以努力在节点间平均分配类似的 pod 或相同拓扑域的 pod。

它启用了以下策略:

  • RemovePodsViolatingTopologySpreadConstraint:找到未平衡的拓扑域,并在 DoNotSchedule 约束被违反时尝试从较大的 pod 驱除 pod。
  • RemoveDuplicates:确保只有一个 pod 与同一节点上运行的副本集、复制控制器、部署或作业相关联。如果存在多个重复的 pod,则这些重复的 pod 会被驱除以更好地在集群中的 pod 分布。
LifecycleAndUtilization

此配置集驱除长时间运行的 pod,并平衡节点之间的资源使用情况。

它启用了以下策略:

  • RemovePodsHavingTooManyRestarts :删除容器重启了多次的 pod。

    在所有容器(包括初始容器)中被重启的总数超过 100 次的 Pod 。

  • LowNodeUtilization:查找使用率不足的节点,并在可能的情况下从其他过度使用的节点中驱除 pod,以希望这些被驱除的 pod 可以在使用率低的节点上被重新创建。

    如果节点的用量低于 20%(CPU、内存和 pod 的数量),则该节点将被视为使用率不足。

    如果节点的用量超过 50%(CPU、内存和 pod 的数量),则该节点将被视为过量使用。

  • PodLifeTime:驱除太老的 pod。

    默认情况下,会删除超过 24 小时的 pod。您可以自定义 pod 生命周期值。

SoftTopologyAndDuplicates

这个配置集与 TopologyAndDuplicates 相同,不同之处在于具有软拓扑约束的 pod(如 whenUnsatisfiable: ScheduleAnyway )也被视为驱除。

注意

不要同时启用 SoftTopologyAndDuplicatesTopologyAndDuplicates。启用两者会导致冲突。

EvictPodsWithLocalStorage
此配置集允许具有本地存储的 pod 有资格被驱除。
EvictPodsWithPVC
此配置集允许带有持久性卷声明的 pod 有资格驱除。如果使用 Kubernetes NFS Subdir External Provisioner,您必须为安装置备程序的命名空间添加排除的命名空间。

4.9.3. 安装 descheduler

在默认情况下,不提供 descheduler。要启用 descheduler,您必须从 OperatorHub 安装 Kube Descheduler Operator,并启用一个或多个 descheduler 配置集。

默认情况下,descheduler 以预测模式运行,这意味着它只模拟 pod 驱除。您必须将 descheduler 的模式更改为自动进行 pod 驱除。

重要

如果您在集群中启用了托管的 control plane,设置自定义优先级阈值,以降低托管 control plane 命名空间中的 pod 被驱除。将优先级阈值类名称设置为 hypershift-control-plane,因为它有托管的 control plane 优先级类的最低优先级值(100000000)。

先决条件

  • 必须具有集群管理员权限。
  • 访问 OpenShift Container Platform Web 控制台。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. 为 Kube Descheduler Operator 创建所需的命名空间。

    1. 进行 AdministrationNamespaces,点 Create Namespace
    2. Name 字段中输入 openshift-kube-descheduler-operator,在 Labels 字段中输入 openshift.io/cluster-monitoring=true 来启用 descheduler 指标,然后点击 Create
  3. 安装 Kube Descheduler Operator。

    1. 进入 OperatorsOperatorHub
    2. 在过滤框中输入 Kube Descheduler Operator
    3. 选择 Kube Descheduler Operator 并点 Install
    4. Install Operator 页面中,选择 A specific namespace on the cluster。从下拉菜单中选择 openshift-kube-descheduler-operator
    5. Update ChannelApproval Strategy 的值调整为所需的值。
    6. 点击 Install
  4. 创建 descheduler 实例。

    1. OperatorsInstalled Operators 页面中,点 Kube Descheduler Operator
    2. 选择 Kube Descheduler 标签页并点 Create KubeDescheduler
    3. 根据需要编辑设置。

      1. 要驱除 pod 而不是模拟驱除,请将 Mode 字段更改为 Automatic
      2. 展开 Profiles 部分,以选择要启用的一个或多个配置集。AffinityAndTaints 配置集默认为启用。点 Add Profile 选择附加配置集。

        注意

        不要同时启用 TopologyAndDuplicatesSoftTopologyAndDuplicates。启用两者会导致冲突。

      3. 可选:展开 Profile Customizations 部分,设置 descheduler 的可选配置。

        • LifecycleAndUtilization 配置集设置自定义 pod 生命周期值。使用 podLifetime 字段设置数字值和一个有效单元(smh)。默认 pod 生命周期为 24 小时(24h)。
        • 设置自定义优先级阈值,使其仅在优先级低于指定优先级级别时才会考虑 pod 进行驱除。使用 thresholdPriority 字段设置数字优先级阈值,或者使用 thresholdPriorityClassName 字段指定特定的优先级类名称。

          注意

          不要为 descheduler 指定 thresholdPrioritythresholdPriorityClassName

        • 将特定的命名空间设置为包括在或排除在 descheduler 操作中。展开 namespaces 字段,并将命名空间添加到 excludedincluded 列表中。您只能设置要排除的命名空间列表或要包含的命名空间列表。请注意,默认排除受保护的命名空间(openshift-*kube-systemhypershift)。

          重要

          LowNodeUtilization 策略不支持命名空间排除。如果设置了 LifecycleAndUtilization 配置集,它启用了 LowNodeUtilization 策略,则不会排除任何命名空间,即使受保护的命名空间也是如此。为了避免在启用 LowNodeUtilization 策略时从受保护的命名空间中驱除,请将优先级类名称设置为 system-cluster-criticalsystem-node-critical

        • 实验性:为 LowNodeUtilization 策略设置利用不足和过度利用的阈值。使用 devLowNodeUtilizationThresholds 字段设置以下值之一:

          • Low: 10% 低利用,30% 过渡利用
          • Medium: 20% 低利用,50% 过渡利用(默认)
          • High: 40% 低利用,70% 过渡利用
          注意

          这个设置是实验性的,不应在生产环境中使用。

      4. 可选: 使用 Descheduling Interval Seconds 字段更改 descheduler 运行间隔的秒数。默认值为 3600 秒。
    4. Create

您还可以稍后使用 OpenShift CLI(oc)为 descheduler 配置配置集和设置。如果您在从 web 控制台创建 descheduler 实例时没有调整配置集,则默认启用 AffinityAndTaints 配置集。

4.9.4. 配置 descheduler 配置集

您可以配置 descheduler 使用哪些配置集来驱除 pod。

先决条件

  • 集群管理员特权

流程

  1. 编辑 KubeDescheduler 对象:

    $ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
  2. spec.profiles 部分指定一个或多个配置集。

    apiVersion: operator.openshift.io/v1
    kind: KubeDescheduler
    metadata:
      name: cluster
      namespace: openshift-kube-descheduler-operator
    spec:
      deschedulingIntervalSeconds: 3600
      logLevel: Normal
      managementState: Managed
      operatorLogLevel: Normal
      mode: Predictive                                     1
      profileCustomizations:
        namespaces:                                        2
          excluded:
          - my-namespace
        podLifetime: 48h                                   3
        thresholdPriorityClassName: my-priority-class-name 4
      profiles:                                            5
      - AffinityAndTaints
      - TopologyAndDuplicates                              6
      - LifecycleAndUtilization
      - EvictPodsWithLocalStorage
      - EvictPodsWithPVC
    1
    可选:默认情况下,descheduler 不会驱除 pod。要驱除 pod,请将 mode 设置为 Automatic
    2
    可选:设置用户创建命名空间列表,以便从 descheduler 操作中包含或排除。使用 exclude 设置要排除的命名空间列表,或者使用 included 来设置要包含的命名空间列表。请注意,默认排除受保护的命名空间(openshift-*kube-systemhypershift)。
    重要

    LowNodeUtilization 策略不支持命名空间排除。如果设置了 LifecycleAndUtilization 配置集,它启用了 LowNodeUtilization 策略,则不会排除任何命名空间,即使受保护的命名空间也是如此。为了避免在启用 LowNodeUtilization 策略时从受保护的命名空间中驱除,请将优先级类名称设置为 system-cluster-criticalsystem-node-critical

    3
    可选:为 LifecycleAndUtilization 配置集启用自定义 pod 生命周期值。有效单位是 smh。默认 pod 生命周期为 24 小时。
    4
    可选:指定优先级阈值,仅在优先级低于指定级别时才会考虑 pod 进行驱除。使用 thresholdPriority 字段设置数字优先级阈值(如 10000)或者使用 thresholdPriorityClassName 字段指定特定的优先级类名称(如 my-priority-class-name)。如果指定优先级类名称,则必须已存在它,否则 descheduler 会抛出错误。不要同时设置 thresholdPrioritythresholdPriorityClassName
    5
    添加一个或多个配置文件以启用。可用配置集:AffinityAndTaintsTopologyAndDuplicatesLifecycleAndUtilizationSoftTopologyAndDuplicatesEvictPodsWithLocalStorageEvictPodsWithPVC
    6
    不要同时启用 TopologyAndDuplicatesSoftTopologyAndDuplicates。启用两者会导致冲突。

    您可以启用多个配置集 ; 指定配置集的顺序并不重要。

  3. 保存文件以使改变生效。

4.9.5. 配置 descheduler 间隔

您可以配置 descheduler 运行之间的时间长度。默认为 3600 秒(一小时)。

先决条件

  • 集群管理员特权

流程

  1. 编辑 KubeDescheduler 对象:

    $ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
  2. deschedulingIntervalSeconds 字段更新为所需的值:

    apiVersion: operator.openshift.io/v1
    kind: KubeDescheduler
    metadata:
      name: cluster
      namespace: openshift-kube-descheduler-operator
    spec:
      deschedulingIntervalSeconds: 3600 1
    ...
    1
    设置 descheduler 运行间隔的秒数。如果设为 0,则 descheduler 会运行一次并退出。
  3. 保存文件以使改变生效。

4.9.6. 卸载 descheduler

您可以通过删除 descheduler 实例并卸载 Kube Descheduler Operator 从集群中移除 descheduler。此流程还会清理 KubeDescheduler CRD 和 openshift-kube-descheduler-operator 命名空间。

先决条件

  • 必须具有集群管理员权限。
  • 访问 OpenShift Container Platform Web 控制台。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. 删除 descheduler 实例。

    1. OperatorsInstalled Operators 页面中,点 Kube Descheduler Operator
    2. 选择 Kube Descheduler 选项卡。
    3. 集群 条目旁的 Options 菜单 kebab 并选择 Delete KubeDescheduler
    4. 在确认对话框中,点 Delete
  3. 卸载 Kube Descheduler Operator。

    1. 导航到 OperatorsInstalled Operators
    2. Kube Descheduler Operator 条目 kebab 旁边的 Options 菜单,然后选择 Uninstall Operator
    3. 在确认对话框中,点 Uninstall
  4. 删除 openshift-kube-descheduler-operator 命名空间。

    1. 导航至 AdministrationNamespaces
    2. 在过滤器框中输入 openshift-kube-descheduler-operator
    3. openshift-kube-descheduler-operator 条目旁的 Options 菜单 kebab ,然后选择 Delete Namespace
    4. 在确认对话框中,输入 openshift-kube-descheduler-operator 并点 Delete
  5. 删除 KubeDescheduler CRD。

    1. 进入 AdministrationCustom Resource Definitions
    2. 在过滤器框中输入 KubeDescheduler
    3. KubeDescheduler 条目旁的 Options 菜单 kebab ,然后选择 Delete CustomResourceDefinition
    4. 在确认对话框中,点 Delete