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-criticalsystem-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 控制台。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. 为 Kube Descheduler Operator 创建所需的命名空间。

    1. 进行 Administration Namespaces,点 Create Namespace
    2. Name 字段中输入 openshift-kube-descheduler-operator,点 Create
  3. 安装 Kube Descheduler Operator。

    1. 进入 Operators OperatorHub
    2. 在过滤框中输入 Kube Descheduler Operator
    3. 选择 Kube Descheduler Operator 并点 Install
    4. Create Operator Subscription 页面中,选择 A specific namespace on the cluster。从下拉菜单中选择 openshift-kube-descheduler-operator
    5. Update ChannelApproval Strategy 的值调整为所需的值。
    6. Subscribe.
  4. 创建 descheduler 实例。

    1. Operators Installed Operators 页面中,点 Kube Descheduler Operator
    2. 选择 Kube Descheduler 标签页并点 Create KubeDescheduler
    3. 根据需要编辑设置并点 Create

现在,您可以为 descheduler 配置策略。在默认情况下,不启用任何策略。

2.8.4. 配置 descheduler 策略

您可以配置 descheduler 使用什么策略来驱除 pod。

先决条件

  • 必须具有集群管理员权限。

流程

  1. 编辑 KubeDescheduler 对象:

    $ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
  2. 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
    1
    LowNodeUtilization 策略提供额外的参数,如 cputhresholdmemorythreshold,您可以选择进行配置。
    2
    RemoveDuplicatesRemovePodsViolatingInterPodAntiAffinityRemovePodsViolatingNodeAffinityRemovePodsViolatingNodeTaints 策略没有可以配置的额外参数。

    您可以启用多个策略,且指定策略的顺序并不重要。

  3. 保存文件以应用更改。

2.8.5. 配置额外的 descheduler 设置

您可以为 descheduler 配置额外的设置,如其运行的频率。

先决条件

  • 必须具有集群管理员权限。

流程

  1. 编辑 KubeDescheduler 对象:

    $ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
  2. 根据需要配置其他设置:

    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
    ...
    1
    设定 descheduler 运行间隔的秒数。如果设为 0,则 descheduler 会运行一次并退出。
    2
    设置一个或多个附加到 descheduler pod 的标记(flag)。这个标记的格式必须可以被传递给二进制文件。
    3
    设置要部署的 descheduler 容器镜像。
  3. 保存文件以使改变生效。

2.8.6. 卸载 descheduler

您可以通过删除 descheduler 实例并卸载 Kube Descheduler Operator 从集群中移除 descheduler。此流程还会清理 KubeDescheduler CRD 和 openshift-kube-descheduler-operator 命名空间。

先决条件

  • 必须具有集群管理员权限。
  • 访问 OpenShift Container Platform Web 控制台。

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. 删除 descheduler 实例。

    1. Operators Installed Operators 页面中,点 Kube Descheduler Operator
    2. 选择 Kube Descheduler 选项卡。
    3. 集群 条目旁的 Options 菜单 kebab 并选择 Delete KubeDescheduler
    4. 在确认对话框中,点 Delete
  3. 卸载 Kube Descheduler Operator。

    1. 导航到 Operators Installed Operators
    2. Kube Descheduler Operator 条目 kebab 旁边的 Options 菜单,然后选择 Uninstall Operator
    3. 在确认对话框中,点 Uninstall
  4. 删除 openshift-kube-descheduler-operator 命名空间。

    1. 导航至 Administration Namespaces
    2. 在过滤器框中输入 openshift-kube-descheduler-operator
    3. openshift-kube-descheduler-operator 条目旁的 Options 菜单 kebab ,然后选择 Delete Namespace
    4. 在确认对话框中,输入 openshift-kube-descheduler-operator 并点 Delete
  5. 删除 KubeDescheduler CRD。

    1. 进入 Administration Custom Resource Definitions
    2. 在过滤器框中输入 KubeDescheduler
    3. KubeDescheduler 条目旁的 Options 菜单 kebab ,然后选择 Delete CustomResourceDefinition
    4. 在确认对话框中,点 Delete
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.