×

虽然 调度器 用于确定托管新 Pod 的最合适的节点,但 descheduler 可用于驱逐正在运行的 Pod,以便可以将 Pod 调度到更合适的节点。

关于 descheduler

您可以使用 descheduler 根据特定策略驱逐 Pod,以便可以将 Pod 调度到更合适的节点。

在以下情况下,您可以从 descheduler 驱逐正在运行的 Pod 中受益

  • 节点利用不足或利用过度。

  • Pod 和节点亲和性要求(例如污点或标签)已更改,并且原始调度决策不再适用于某些节点。

  • 节点故障需要移动 Pod。

  • 将新节点添加到集群。

  • Pod 重启次数过多。

descheduler 不会安排驱逐 Pod 的替换。调度器会自动为驱逐的 Pod 执行此任务。

当 descheduler 决定从节点驱逐 Pod 时,它采用以下通用机制

  • openshift-*kube-system 命名空间中的 Pod 永远不会被驱逐。

  • priorityClassName 设置为system-cluster-criticalsystem-node-critical 的关键 Pod 永远不会被驱逐。

  • 不属于副本控制器、副本集、部署或作业的静态、镜像或独立 Pod 永远不会被驱逐,因为这些 Pod 不会被重新创建。

  • 与守护程序集关联的 Pod 永远不会被驱逐。

  • 具有本地存储的 Pod 永远不会被驱逐。

  • 在可突发和保证的 Pod 之前驱逐尽力而为的 Pod。

  • 所有带有descheduler.alpha.kubernetes.io/evict 注解的 Pod 类型都符合驱逐条件。此注解用于覆盖阻止驱逐的检查,用户可以选择要驱逐哪个 Pod。用户应了解 Pod 将如何以及是否被重新创建。

  • 如果驱逐操作违反了其 Pod Disruption Budget (PDB),则不会驱逐受 Pod Disruption Budget (PDB) 约束的 Pod。使用驱逐子资源来处理 PDB,从而驱逐 Pod。

驱逐器配置文件

以下驱逐器配置文件可用:

AffinityAndTaints

此配置文件驱逐违反 Pod 间反亲和性、节点亲和性和节点污点的 Pod。

它启用以下策略:

  • RemovePodsViolatingInterPodAntiAffinity:移除违反 Pod 间反亲和性的 Pod。

  • RemovePodsViolatingNodeAffinity:移除违反节点亲和性的 Pod。

  • RemovePodsViolatingNodeTaints:移除违反节点上NoSchedule污点的 Pod。

    具有requiredDuringSchedulingIgnoredDuringExecution类型节点亲和性的 Pod 将被移除。

TopologyAndDuplicates

此配置文件驱逐 Pod,以努力在节点之间均匀分布类似的 Pod 或相同拓扑域的 Pod。

它启用以下策略:

  • RemovePodsViolatingTopologySpreadConstraint:查找不平衡的拓扑域,并在违反DoNotSchedule约束时尝试从较大的拓扑域中驱逐 Pod。

  • RemoveDuplicates:确保在同一节点上只运行一个与副本集、复制控制器、部署或作业关联的 Pod。如果有多个,则为了更好地在集群中分配 Pod,这些重复的 Pod 将被驱逐。

不要与以下任何配置文件一起启用TopologyAndDuplicatesSoftTopologyAndDuplicatesCompactAndScale。同时启用这些配置文件会导致冲突。

LifecycleAndUtilization

此配置文件驱逐长期运行的 Pod 并平衡节点之间的资源使用情况。

它启用以下策略:

  • RemovePodsHavingTooManyRestarts:移除其容器重启次数过多的 Pod。

    所有容器(包括 Init 容器)的重启总次数超过 100 次的 Pod。

  • LowNodeUtilization:查找资源利用率低的节点,并尝试从资源利用率高的节点驱逐 Pod,希望能将驱逐的 Pod 重新调度到这些资源利用率低的节点上。

    • 如果节点的所有阈值(CPU、内存和 Pod 数量)的使用率低于 20%,则认为该节点资源利用率低。

    • 如果节点的任何阈值(CPU、内存和 Pod 数量)的使用率高于 50%,则认为该节点资源利用率高。

    可以选择通过将技术预览字段devLowNodeUtilizationThresholds设置为以下值之一来调整这些资源利用率低/高的阈值百分比:Low 为 10%/30%,Medium 为 20%/50%,或High 为 40%/70%。默认值为Medium

  • PodLifeTime:驱逐过旧的 Pod。

    默认情况下,超过 24 小时的 Pod 将被移除。您可以自定义 Pod 生命周期值。

不要与以下任何配置文件一起启用LifecycleAndUtilizationLongLifecycleCompactAndScale。同时启用这些配置文件会导致冲突。

SoftTopologyAndDuplicates

此配置文件与TopologyAndDuplicates相同,只是还会考虑具有软拓扑约束(例如whenUnsatisfiable: ScheduleAnyway)的 Pod 进行驱逐。

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

EvictPodsWithLocalStorage

此配置文件允许具有本地存储的 Pod 符合驱逐条件。

EvictPodsWithPVC

此配置文件允许具有持久卷声明的 Pod 符合驱逐条件。如果您使用的是Kubernetes NFS Subdir External Provisioner,则必须为安装 provisioner 的命名空间添加一个排除的命名空间。

CompactAndScale

此配置文件启用HighNodeUtilization策略,该策略尝试从资源利用率低的节点驱逐 Pod,以允许工作负载在一组较小的节点上运行。如果节点的所有阈值(CPU、内存和 Pod 数量)的使用率低于 20%,则认为该节点资源利用率低。

可以选择通过将技术预览字段devHighNodeUtilizationThresholds设置为以下值之一来调整资源利用率低的百分比:Minimal 为 10%,Modest 为 20%,或Moderate 为 30%。默认值为Modest

不要与以下任何配置文件一起启用CompactAndScaleLifecycleAndUtilizationLongLifecycleTopologyAndDuplicates。同时启用这些配置文件会导致冲突。

LongLifecycle

此配置文件平衡节点之间的资源使用情况,并启用以下策略:

  • RemovePodsHavingTooManyRestarts:移除其容器重启次数过多的 Pod,以及所有容器(包括 Init 容器)的重启总次数超过 100 次的 Pod。重新启动虚拟机客户操作系统不会增加此计数。

  • LowNodeUtilization:当存在任何资源利用率低的节点时,从资源利用率高的节点驱逐 Pod。驱逐 Pod 的目标节点将由调度程序确定。

    • 如果节点的所有阈值(CPU、内存和 Pod 数量)的使用率低于 20%,则认为该节点资源利用率低。

    • 如果节点的任何阈值(CPU、内存和 Pod 数量)的使用率高于 50%,则认为该节点资源利用率高。

不要与以下任何配置文件一起启用LongLifecycleLifecycleAndUtilizationCompactAndScale。同时启用这些配置文件会导致冲突。