4.9. Descheduler
4.9.1. Descheduler 概述 复制链接链接已复制到粘贴板!
调度程序(scheduler)被用来决定最适合托管新 pod 的节点,而 descheduler 可以用来驱除正在运行的 pod,从而使 pod 能够重新调度到更合适的节点上。
4.9.1.1. 关于 descheduler 复制链接链接已复制到粘贴板!
您可以使用 descheduler 根据特定策略驱除 pod,以便 pod 重新调度到更合适的节点上。
descheduler 适合于在以下情况下 处理运行的 pod:
- 节点使用不足或过度使用。
- Pod 和节点关联性要求(如污点或标签)已更改,并且原始的调度不再适合于某些节点。
- 节点失败需要移动 pod。
- 集群中添加了新节点。
- Pod 重启的次数太多。
descheduler 不调度被驱除的 pod。调度被驱除 pod 的任务由调度程序(scheduler)执行。
当 descheduler 决定从节点驱除 pod 时,它会使用以下机制:
-
openshift-*和kube-system命名空间中的 Pod 不会被驱除。 -
priorityClassName被设置为system-cluster-critical或system-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.1.2. Descheduler 配置集 复制链接链接已复制到粘贴板!
使用 descheduler 配置集启用根据 pod 生命周期或节点使用率等标准重新平衡集群的特定驱除策略。
以下 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 分布。
警告不要使用以下配置集启用
TopologyAndDuplicates:SoftTopologyAndDuplicates或CompactAndScale。将这些配置集启用在一起会导致冲突。-
LifecycleAndUtilization此配置集驱除长时间运行的 pod,并平衡节点之间的资源使用情况。
它启用了以下策略:
RemovePodsHavingTooManyRestarts:删除容器重启了多次的 pod。在所有容器(包括初始容器)中被重启的总数超过 100 次的 Pod 。
LowNodeUtilization:查找使用率不足的节点,并在可能的情况下从其他过度使用的节点中驱除 pod,以希望这些被驱除的 pod 可以在使用率低的节点上被重新创建。- 如果节点的用量低于 20%(CPU、内存和 pod 的数量),则该节点将被视为使用率不足。
- 如果节点的用量超过 50%(CPU、内存和 pod 的数量),则该节点将被视为过量使用。
另外,您可以通过将技术预览字段
devLowNodeUtilizationThresholds设置为以下值来调整这些使用率使用率/过量使用阈值百分比:Low为 10%/30%,Medium为 20%/50%,或High为 40%/70%。默认值为Medium。PodLifeTime:驱除太老的 pod。默认情况下,会删除超过 24 小时的 pod。您可以自定义 pod 生命周期值。
警告不要启用带有以下任意配置集的
LifecycleAndUtilization:LongLifecycle或CompactAndScale。将这些配置集启用在一起会导致冲突。SoftTopologyAndDuplicates这个配置集与
TopologyAndDuplicates相同,不同之处在于具有软拓扑约束的 pod(如whenUnsatisfiable: ScheduleAnyway)也被视为驱除。警告不要同时启用
SoftTopologyAndDuplicates和TopologyAndDuplicates。启用两者会导致冲突。EvictPodsWithLocalStorage- 此配置集允许具有本地存储的 pod 有资格被驱除。
EvictPodsWithPVC-
此配置集允许带有持久性卷声明的 pod 有资格驱除。如果使用
Kubernetes NFS Subdir External Provisioner,您必须为安装置备程序的命名空间添加排除的命名空间。 CompactAndScale此配置集启用了
HighNodeUtilization策略,它尝试从使用率低的节点驱除 pod,以允许工作负载在较小的一组节点上运行。如果节点的用量低于 20%(CPU、内存和 pod 的数量),则该节点将被视为使用率不足。另外,您可以通过将技术预览字段
devHighNodeUtilizationThresholds设置为以下值来调整使用率不足的百分比:Minimal为 10%,Modest为 20%,或Moderate代表 30%。默认值为Modest。警告不要启用
CompactAndScale,包含以下配置集:LifecycleAndUtilization,LongLifecycle, 或TopologyAndDuplicates。将这些配置集启用在一起会导致冲突。KubeVirtRelieveAndMigrate这个配置集是
LongLifeCycle配置集的一个增强版本。KubeVirtRelieveAndMigrate配置集从高成本节点驱除 pod,以减少整体资源费用并启用工作负载迁移。它还定期重新平衡工作负载,以帮助在节点间维护类似的备用容量,从而更好地处理突然负载激增。节点可能会遇到以下成本:- 资源利用率 :增加资源压力会导致运行应用程序的开销增加。
- 节点维护 :节点上的容器数量更多,会增加资源消耗和维护成本。
该配置集启用了
LowNodeUtilization策略,它带有EvictionsInBackgroundalpha 功能。该配置集还会公开以下自定义字段:-
devActualUtilizationProfile: 启用负载均衡的取消调度。 -
devLowNodeUtilizationThresholds:为LowNodeUtilization策略设置实验性阈值。不要将此字段与devDeviationThresholds搭配使用。 -
devDeviationThresholds:以低量资源使用率为低等资源的节点,以帮助从过度利用的节点重新分发工作负载。不要将此字段与devLowNodeUtilizationThresholds搭配使用。支持的值是:Low(10%:10%),Medium(20%:20%),High(30%:30%),AsymmetricLow(0%:10%),AsymmetricMedium(0%:20%),AsymmetricHigh(0%:30%). -
devEnableSoftTainter:启用软包含组件,以动态应用或删除软污点作为调度提示。
配置示例
apiVersion: operator.openshift.io/v1 kind: KubeDescheduler metadata: name: cluster namespace: openshift-kube-descheduler-operator spec: managementState: Managed deschedulingIntervalSeconds: 30 mode: "Automatic" profiles: - KubeVirtRelieveAndMigrate profileCustomizations: devEnableSoftTainter: true devDeviationThresholds: AsymmetricLow devActualUtilizationProfile: PrometheusCPUCombinedKubeVirtRelieveAndMigrate配置集要求在所有 worker 节点上启用 PSI 指标。您可以通过应用以下MachineConfig自定义资源 (CR) 来启用此项:MachineConfigCR 示例apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 99-openshift-machineconfig-worker-psi-karg spec: kernelArguments: - psi=1注意MachineConfig对象的名称非常重要,因为机器配置以字典顺序处理。默认情况下,以98-开头的配置会禁用 PSI。要确保启用了 PSI,请将您的配置命名为具有更高前缀,如99-openshift-machineconfig-worker-psi-karg。您可以将这个配置集与
SoftTopologyAndDuplicates配置集一起使用,以根据软拓扑约束重新平衡 pod,这在托管 control plane 环境中很有用。
LongLifecycle此配置集在节点间平衡资源使用量并启用以下策略:
-
RemovePodsHavingTooManyRestarts:删除其容器重启次数太多的 pod,以及其中所有容器(包括 Init 容器)重启的总数超过 100 的 pod。重启虚拟机客户端操作系统不会增加这个计数。 LowNodeUtilization:在存在没有被充分利用的节点时,将 pod 从过度使用的节点上驱除。被驱除的 pod 的目标节点将由调度程序决定。- 如果节点的用量低于 20%(CPU、内存和 pod 的数量),则该节点将被视为使用率不足。
- 如果节点的用量超过 50%(CPU、内存和 pod 的数量),则该节点将被视为过量使用。
警告不要启用带有以下任意配置集的
LongLifecycle:LifecycleAndUtilization或CompactAndScale。将这些配置集启用在一起会导致冲突。-