2.8. 使用 descheduler 驱除 pod
调度程序(scheduler)被用来决定最适合托管新 pod 的节点,而 descheduler 可以用来驱除正在运行的 pod,从而使 pod 能够重新调度到更合适的节点上。
descheduler 只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/。
2.8.1. 关于 descheduler
您可以使用 descheduler 根据特定策略驱除 pod,以便可将 pod 重新调度到更合适的节点上。
descheduler 适合于在以下情况下 处理运行的 pod:
- 节点使用不足或过度使用。
- Pod 和节点关联性要求(如污点或标签)已更改,并且原始的调度不再适合于某些节点。
- 节点失败需要移动 pod。
- 集群中添加了新节点。
descheduler 不调度被驱除的 pod。调度被驱除 pod 的任务由调度程序(scheduler)执行。
当 descheduler 决定从节点驱除 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 。
2.8.2. Descheduler 策略
descheduler 可以使用以下策略:
- 低节点使用率
LowNodeUtilization
策略会查找使用率不足的节点,并在可能的情况下从其他节点中驱除 pod,以希望这些被驱除的 pod 可以在使用率低的节点上被重新创建。节点使用率是否不足是由以下可配置的阈值参数决定的: CPU 、内存和 pod 的数量。如果节点的使用情况低于所有参数的配置阈值(CPU 、内存和 pod 的数量),则该节点将被视为使用不足。
您还可以为 CPU、内存和 pod 数量设置目标阈值。如果节点用量超过任何参数配置的目标阈值,则节点的 pod 可能会被考虑被驱除。
另外,还可以使用
nodes
参数设置一个值,仅当使用率低的节点数超过这个配置的值时才会激活相关策略。这对大型集群非常有用,因为大型集群可能会有少数节点经常处于低利用率的情况,或在一个短时间段内出现低利用率的情况。- 重复的 pod
RemoveDuplicates
策略确保只有一个 pod 关联在同一节点上运行的副本集、复制控制器、部署或作业。如果存在多个相关的节点,则这些重复的 pod 会被驱除以更好地在集群中分散 pod。当节点失败后,pod 移到另一个节点时会出现这种情况,导致与副本集、复制控制器、部署或作业关联的多个 pod。当出现故障的节点重新就绪后,此策略会驱除重复的 pod。
- 违反 pod 间的反关联性
RemovePodsViolatingInterPodAntiAffinity
策略确保违反了 pod 间的反关联性的 pod 被从节点中驱除。当为已在同一节点上运行的 pod 创建反关联性规则时,可能会发生这种情况。
- 违反节点关联性
RemovePodsViolatingNodeAffinity
策略确保违反了节点关联性的 pod 被从节点中驱除。当节点不再满足 pod 的关联性规则,会出现这种情况。如果存在另外一个节点可以满足关联性规则,则 pod 会被驱除。
- 违反节点污点
RemovePodsViolatingNodeTaints
策略确保违反了节点上的NoSchedule
污点的 pod 会被驱除。如果 pod 被设置为容忍 taint
key=value:NoSchedule
,并在污点节点上运行时,会出现这种情况。如果节点的污点被更新或删除,污点不再满足 pod 的容限,则 pod 会被驱除。
2.8.3. 安装 descheduler
在默认情况下,不提供 descheduler。要启用 descheduler,您必须从 OperatorHub 安装 Kube Descheduler Operator。安装 Kube Descheduler Operator 后,您可以配置驱除策略。
先决条件
- 必须具有集群管理员权限。
- 访问 OpenShift Container Platform Web 控制台。
流程
- 登陆到 OpenShift Container Platform Web 控制台。
为 Kube Descheduler Operator 创建所需的命名空间。
-
进行 Administration
Namespaces,点 Create Namespace。 -
在 Name 字段中输入
openshift-kube-descheduler-operator
,点 Create。
-
进行 Administration
安装 Kube Descheduler Operator。
-
进入 Operators
OperatorHub。 - 在过滤框中输入 Kube Descheduler Operator。
- 选择 Kube Descheduler Operator 并点 Install。
- 在 Create Operator Subscription 页面中,选择 A specific namespace on the cluster。从下拉菜单中选择 openshift-kube-descheduler-operator 。
- 将 Update Channel 和 Approval Strategy 的值调整为所需的值。
- 点 Subscribe.
-
进入 Operators
创建 descheduler 实例。
-
在 Operators
Installed Operators 页面中,点 Kube Descheduler Operator。 - 选择 Kube Descheduler 标签页并点 Create KubeDescheduler。
- 根据需要编辑设置并点 Create。
-
在 Operators
现在,您可以为 descheduler 配置策略。在默认情况下,不启用任何策略。
2.8.4. 配置 descheduler 策略
您可以配置 descheduler 使用什么策略来驱除 pod。
先决条件
- 必须具有集群管理员权限。
流程
编辑
KubeDescheduler
对象:$ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
在
spec.strategies
部分中指定一个或多个策略 。apiVersion: operator.openshift.io/v1beta1 kind: KubeDescheduler metadata: name: cluster namespace: openshift-kube-descheduler-operator spec: deschedulingIntervalSeconds: 3600 strategies: - name: "LowNodeUtilization" 1 params: - name: "cputhreshold" value: "10" - name: "memorythreshold" value: "20" - name: "podsthreshold" value: "30" - name: "memorytargetthreshold" value: "40" - name: "cputargetthreshold" value: "50" - name: "podstargetthreshold" value: "60" - name: "nodes" value: "3" - name: "RemoveDuplicates" 2
您可以启用多个策略,且指定策略的顺序并不重要。
- 保存文件以应用更改。
2.8.5. 配置额外的 descheduler 设置
您可以为 descheduler 配置额外的设置,如其运行的频率。
先决条件
- 必须具有集群管理员权限。
流程
编辑
KubeDescheduler
对象:$ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
根据需要配置其他设置:
apiVersion: operator.openshift.io/v1beta1 kind: KubeDescheduler metadata: name: cluster namespace: openshift-kube-descheduler-operator spec: deschedulingIntervalSeconds: 3600 1 flags: - --dry-run 2 image: quay.io/openshift/origin-descheduler:4.4 3 ...
- 保存文件以使改变生效。
2.8.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