4.10. 使用 descheduler 驱除 pod
调度程序(scheduler)被用来决定最适合托管新 pod 的节点,而 descheduler 可以用来驱除正在运行的 pod,从而使 pod 能够重新调度到更合适的节点上。
4.10.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.10.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 有资格驱除。
4.10.3. 安装 descheduler
在默认情况下,不提供 descheduler。要启用 descheduler,您必须从 OperatorHub 安装 Kube Descheduler Operator,并启用一个或多个 descheduler 配置集。
先决条件
- 必须具有集群管理员权限。
- 访问 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。
根据需要编辑设置。
展开 Profiles 部分,以选择要启用的一个或多个配置集。
AffinityAndTaints
配置集默认为启用。点 Add Profile 选择附加配置集。注意不要同时启用
TopologyAndDuplicates
和SoftTopologyAndDuplicates
。启用两者会导致冲突。-
可选:扩展 Profile Customizations 部分,以便为
LifecycleAndUtilization
配置集设置自定义 pod 生命周期值。有效单位是s
、m
或h
。默认 pod 生命周期为 24 小时。 -
可选: 使用 Descheduling Interval Seconds 字段更改 descheduler 运行间隔的秒数。默认值为
3600
秒。
- 点 Create。
-
在 Operators
您还可以稍后使用 OpenShift CLI(oc
)为 descheduler 配置配置集和设置。如果您在从 web 控制台创建 descheduler 实例时没有调整配置集,则默认启用 AffinityAndTaints
配置集。
4.10.4. 配置 descheduler 配置集
您可以配置 descheduler 使用哪些配置集来驱除 pod。
先决条件
- 集群管理员特权
流程
编辑
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 profileCustomizations: podLifetime: 48h 1 profiles: 2 - AffinityAndTaints - TopologyAndDuplicates 3 - LifecycleAndUtilization - EvictPodsWithLocalStorage - EvictPodsWithPVC
- 1
- 可选:为
LifecycleAndUtilization
配置集启用自定义 pod 生命周期值。有效单位是s
、m
或h
。默认 pod 生命周期为 24 小时。 - 2
- 添加一个或多个配置文件以启用。可用配置集:
AffinityAndTaints
、TopologyAndDuplicates
、LifecycleAndUtilization
、SoftTopologyAndDuplicates
、EvictPodsWithLocalStorage
和EvictPodsWithPVC
。 - 3
- 不要同时启用
TopologyAndDuplicates
和SoftTopologyAndDuplicates
。启用两者会导致冲突。
您可以启用多个配置集 ; 指定配置集的顺序并不重要。
- 保存文件以使改变生效。
4.10.5. 配置 descheduler 间隔
您可以配置 descheduler 运行之间的时间长度。默认为 3600 秒(一小时)。
先决条件
- 集群管理员特权
流程
编辑
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.10.6. 卸载 descheduler
您可以通过删除 descheduler 实例并卸载 Kube Descheduler Operator 从集群中移除 descheduler。此流程还会清理 KubeDescheduler
CRD 和 openshift-kube-descheduler-operator
命名空间。
先决条件
- 必须具有集群管理员权限。
- 访问 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