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 配置集可用:
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
)也被视为驱除。注意不要同时启用
SoftTopologyAndDuplicates
和TopologyAndDuplicates
。启用两者会导致冲突。EvictPodsWithLocalStorage
- 此配置集允许具有本地存储的 pod 有资格被驱除。
EvictPodsWithPVC
-
此配置集允许带有持久性卷声明的 pod 有资格驱除。如果使用
Kubernetes NFS Subdir External Provisioner
,您必须为安装置备程序的命名空间添加排除的命名空间。
4.9.2. Kube Descheduler Operator 发行注记
Kube Descheduler Operator 允许您驱除 pod,以便可以在更合适的节点上重新调度 pod。
本发行注记介绍了 Kube Descheduler Operator 的开发。
如需更多信息,请参阅关于 descheduler。
4.9.2.1. Kube Descheduler Operator 5.0.1 发行注记
发布日期: 2024 年 7 月 1 日
以下公告可用于 Kube Descheduler Operator 5.0.1 :
4.9.2.1.1. 新功能及功能增强
现在,您可以在以 FIPS 模式运行的 OpenShift Container Platform 集群中安装和使用 Kube Descheduler Operator。
重要要为集群启用 FIPS 模式,您必须从配置为以 FIPS 模式操作的 Red Hat Enterprise Linux (RHEL) 计算机运行安装程序。有关在 RHEL 中配置 FIPS 模式的更多信息,请参阅将 RHEL 切换到 FIPS 模式。
当以 FIPS 模式运行 Red Hat Enterprise Linux (RHEL) 或 Red Hat Enterprise Linux CoreOS (RHCOS)时,OpenShift Container Platform 核心组件使用 RHEL 加密库,在 x86_64、ppc64le 和 s390x 架构上提交到 NIST FIPS 140-2/140-3 Validation。
4.9.2.1.2. 程序错误修复
- 此 Kube Descheduler Operator 发行版本解决了几个 CVE。
4.9.2.2. Kube Descheduler Operator 5.0.0 发行注记
发布日期:2024 年 3 月 6 日
以下公告可用于 Kube Descheduler Operator 5.0.0 :
4.9.2.2.1. 主要变化
- 在这个版本中,Kube Descheduler Operator 提供了独立于 OpenShift Container Platform 次版本流的更新。
4.9.2.2.2. 程序错误修复
-
在以前的版本中,descheduler pod 日志显示以下有关 Operator 版本的警告:
failed to convert Descheduler minor version to float
。在这个版本中,不再显示警告。(OCPBUGS-14042)
4.9.3. 使用 descheduler 驱除 pod
您可以通过安装 Kube Descheduler Operator 并设置所需的配置集和其他自定义在 OpenShift Container Platform 中运行 descheduler。
4.9.3.1. 安装 descheduler
在默认情况下,不提供 descheduler。要启用 descheduler,您必须从 OperatorHub 安装 Kube Descheduler Operator,并启用一个或多个 descheduler 配置集。
默认情况下,descheduler 以预测模式运行,这意味着它只模拟 pod 驱除。您必须将 descheduler 的模式更改为自动进行 pod 驱除。
如果您在集群中启用了托管的 control plane,设置自定义优先级阈值,以降低托管 control plane 命名空间中的 pod 被驱除。将优先级阈值类名称设置为 hypershift-control-plane
,因为它有托管的 control plane 优先级类的最低优先级值(100000000
)。
先决条件
-
以具有
cluster-admin
角色的用户身份登录到 OpenShift Container Platform。 - 访问 OpenShift Container Platform Web 控制台。
流程
- 登陆到 OpenShift Container Platform Web 控制台。
为 Kube Descheduler Operator 创建所需的命名空间。
-
进行 Administration
Namespaces,点 Create Namespace。 -
在 Name 字段中输入
openshift-kube-descheduler-operator
,在 Labels 字段中输入openshift.io/cluster-monitoring=true
来启用 descheduler 指标,然后点击 Create。
-
进行 Administration
安装 Kube Descheduler Operator。
-
进入 Operators
OperatorHub。 - 在过滤框中输入 Kube Descheduler Operator。
- 选择 Kube Descheduler Operator 并点 Install。
- 在 Install Operator 页面中,选择 A specific namespace on the cluster。从下拉菜单中选择 openshift-kube-descheduler-operator 。
- 将 Update Channel 和 Approval Strategy 的值调整为所需的值。
- 点击 Install。
-
进入 Operators
创建 descheduler 实例。
-
在 Operators
Installed Operators 页面中,点 Kube Descheduler Operator。 - 选择 Kube Descheduler 标签页并点 Create KubeDescheduler。
根据需要编辑设置。
- 要驱除 pod 而不是模拟驱除,请将 Mode 字段更改为 Automatic。
-
在 Operators
4.9.3.2. 配置 descheduler 配置集
您可以配置 descheduler 使用哪些配置集来驱除 pod。
先决条件
-
以具有
cluster-admin
角色的用户身份登录到 OpenShift Container Platform。
流程
编辑
KubeDescheduler
对象:$ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
在
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-system
、hypershift
)。 - 3
- 可选:为
LifecycleAndUtilization
配置集启用自定义 pod 生命周期值。有效单位是s
、m
或h
。默认 pod 生命周期为 24 小时。 - 4
- 可选:指定优先级阈值,仅在优先级低于指定级别时才会考虑 pod 进行驱除。使用
thresholdPriority
字段设置数字优先级阈值(如10000
)或者使用thresholdPriorityClassName
字段指定特定的优先级类名称(如my-priority-class-name
)。如果指定优先级类名称,则必须已存在它,否则 descheduler 会抛出错误。不要同时设置thresholdPriority
和thresholdPriorityClassName
。 - 5
- 添加一个或多个配置文件以启用。可用配置集:
AffinityAndTaints
、TopologyAndDuplicates
、LifecycleAndUtilization
、SoftTopologyAndDuplicates
、EvictPodsWithLocalStorage
和EvictPodsWithPVC
。 - 6
- 不要同时启用
TopologyAndDuplicates
和SoftTopologyAndDuplicates
。启用两者会导致冲突。
您可以启用多个配置集 ; 指定配置集的顺序并不重要。
- 保存文件以使改变生效。
4.9.3.3. 配置 descheduler 间隔
您可以配置 descheduler 运行之间的时间长度。默认为 3600 秒(一小时)。
先决条件
-
以具有
cluster-admin
角色的用户身份登录到 OpenShift Container Platform。
流程
编辑
KubeDescheduler
对象:$ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
将
deschedulingIntervalSeconds
字段更新为所需的值:apiVersion: operator.openshift.io/v1 kind: KubeDescheduler metadata: name: cluster namespace: openshift-kube-descheduler-operator spec: deschedulingIntervalSeconds: 3600 1 ...
- 1
- 设置 descheduler 运行间隔的秒数。如果设为
0
,则 descheduler 会运行一次并退出。
- 保存文件以使改变生效。
4.9.4. 卸载 Kube Descheduler Operator
您可以通过卸载 Operator 并删除其相关资源,从 OpenShift Container Platform 中删除 Kube Descheduler Operator。
4.9.4.1. 卸载 descheduler
您可以通过删除 descheduler 实例并卸载 Kube Descheduler Operator 从集群中移除 descheduler。此流程还会清理 KubeDescheduler
CRD 和 openshift-kube-descheduler-operator
命名空间。
先决条件
-
以具有
cluster-admin
角色的用户身份登录到 OpenShift Container Platform。 - 访问 OpenShift Container Platform Web 控制台。
流程
- 登陆到 OpenShift Container Platform Web 控制台。
删除 descheduler 实例。
-
在 Operators
Installed Operators 页面中,点 Kube Descheduler Operator。 - 选择 Kube Descheduler 选项卡。
- 点 集群 条目旁的 Options 菜单 并选择 Delete KubeDescheduler。
- 在确认对话框中,点 Delete。
-
在 Operators
卸载 Kube Descheduler Operator。
-
导航到 Operators
Installed Operators。 - 点 Kube Descheduler Operator 条目 旁边的 Options 菜单,然后选择 Uninstall Operator。
- 在确认对话框中,点 Uninstall。
-
导航到 Operators
删除
openshift-kube-descheduler-operator
命名空间。-
导航至 Administration
Namespaces。 -
在过滤器框中输入
openshift-kube-descheduler-operator
。 - 点 openshift-kube-descheduler-operator 条目旁的 Options 菜单 ,然后选择 Delete Namespace。
-
在确认对话框中,输入
openshift-kube-descheduler-operator
并点 Delete。
-
导航至 Administration
删除
KubeDescheduler
CRD。-
进入 Administration
Custom Resource Definitions。 -
在过滤器框中输入
KubeDescheduler
。 - 点 KubeDescheduler 条目旁的 Options 菜单 ,然后选择 Delete CustomResourceDefinition。
- 在确认对话框中,点 Delete。
-
进入 Administration