×

删除特定机器

您可以删除特定机器。

除非您的集群使用控制平面机器集,否则请勿删除控制平面机器。

先决条件
  • 安装 OpenShift Container Platform 集群。

  • 安装 OpenShift CLI (oc)。

  • 以具有 cluster-admin 权限的用户身份登录 oc

步骤
  1. 通过运行以下命令查看集群中的机器

    $ oc get machine -n openshift-machine-api

    命令输出包含集群中机器的列表,格式为 <clusterid>-<role>-<cloud_region>

  2. 确定要删除的机器。

  3. 运行以下命令删除机器

    $ oc delete machine <machine> -n openshift-machine-api

    默认情况下,机器控制器会尝试排空由机器支持的节点,直到成功为止。在某些情况下,例如 Pod 干扰预算配置错误,排空操作可能无法成功。如果排空操作失败,机器控制器将无法继续删除机器。

    您可以通过在特定机器中添加注释 machine.openshift.io/exclude-node-draining 来跳过排空节点。

    如果您删除的机器属于机器集,则会立即创建一台新机器以满足指定的副本数量。

机器删除阶段的生命周期钩子

机器生命周期钩子是机器协调生命周期中的某些点,在这些点上,正常的生命周期过程可以被中断。在机器“删除”阶段,这些中断为组件提供了修改机器删除过程的机会。

术语和定义

要了解机器删除阶段的生命周期钩子的行为,您必须了解以下概念

协调

协调是指控制器尝试使集群的实际状态及其包含的对象与对象规范中的要求相匹配的过程。

机器控制器

机器控制器管理机器的协调生命周期。对于云平台上的机器,机器控制器是 OpenShift Container Platform 控制器和云提供商的特定于平台的执行器的组合。

在机器删除的上下文中,机器控制器执行以下操作

  • 排空由机器支持的节点。

  • 从云提供商删除机器实例。

  • 删除Node 对象。

生命周期钩子

生命周期钩子是对象协调生命周期中的一个定义点,在该点,正常的生命周期过程可以被中断。组件可以使用生命周期钩子将更改注入到过程中以实现预期结果。

机器“删除”阶段有两个生命周期钩子

  • preDrain 生命周期钩子必须在由机器支持的节点可以被排空之前解析。

  • preTerminate 生命周期钩子必须在可以从基础架构提供商中删除实例之前解析。

钩子实现控制器

钩子实现控制器是一个控制器(机器控制器除外),它可以与生命周期钩子交互。钩子实现控制器可以执行以下一项或多项操作

  • 添加生命周期钩子。

  • 响应生命周期钩子。

  • 移除生命周期钩子。

每个生命周期钩子都有一个单独的钩子实现控制器,但一个钩子实现控制器可以管理一个或多个钩子。

机器删除处理顺序

在 OpenShift Container Platform 4.17 中,机器删除阶段有两个生命周期钩子:preDrainpreTerminate。当给定生命周期点的所有钩子都被移除时,协调将照常继续。

The sequence of events in the machine `Deleting` phase.
图 1. 机器删除流程

机器Deleting阶段按以下顺序进行

  1. 现有机器因以下原因之一被计划删除

    • 具有cluster-admin权限的用户使用oc delete machine命令。

    • 机器获得machine.openshift.io/delete-machine注释。

    • 管理该机器的机器集将其标记为要删除,以作为协调的一部分减少副本数量。

    • 集群自动伸缩器识别出一个对满足集群部署需求不必要的节点。

    • 配置机器健康检查以替换不健康的机器。

  2. 机器进入Deleting阶段,在这个阶段中,它被标记为要删除,但仍然存在于API中。

  3. 如果存在preDrain生命周期钩子,则管理它的钩子实现控制器将执行指定的动作。

    直到所有preDrain生命周期钩子都满足,机器状态条件Drainable才设置为False

  4. 没有未解决的preDrain生命周期钩子,并且机器状态条件Drainable设置为True

  5. 机器控制器尝试清空由机器支持的节点。

    • 如果清空失败,Drained将设置为False,并且机器控制器将再次尝试清空节点。

    • 如果清空成功,Drained将设置为True

  6. 机器状态条件Drained设置为True

  7. 如果存在preTerminate生命周期钩子,则管理它的钩子实现控制器将执行指定的动作。

    直到所有preTerminate生命周期钩子都满足,机器状态条件Terminable才设置为False

  8. 没有未解决的preTerminate生命周期钩子,并且机器状态条件Terminable设置为True

  9. 机器控制器从基础设施提供程序中移除实例。

  10. 机器控制器删除Node对象。

删除生命周期钩子配置

以下 YAML 代码片段演示了在机器集中删除生命周期钩子配置的格式和位置

演示preDrain生命周期钩子的 YAML 代码片段
apiVersion: machine.openshift.io/v1beta1
kind: Machine
metadata:
  ...
spec:
  lifecycleHooks:
    preDrain:
    - name: <hook_name> (1)
      owner: <hook_owner> (2)
  ...
1 preDrain生命周期钩子的名称。
2 管理preDrain生命周期钩子的钩子实现控制器。
演示preTerminate生命周期钩子的 YAML 代码片段
apiVersion: machine.openshift.io/v1beta1
kind: Machine
metadata:
  ...
spec:
  lifecycleHooks:
    preTerminate:
    - name: <hook_name> (1)
      owner: <hook_owner> (2)
  ...
1 preTerminate生命周期钩子的名称。
2 管理preTerminate生命周期钩子的钩子实现控制器。

生命周期钩子配置示例

以下示例演示了多个虚构的生命周期钩子的实现,这些钩子会中断机器删除过程

生命周期钩子的配置示例
apiVersion: machine.openshift.io/v1beta1
kind: Machine
metadata:
  ...
spec:
  lifecycleHooks:
    preDrain: (1)
    - name: MigrateImportantApp
      owner: my-app-migration-controller
    preTerminate: (2)
    - name: BackupFileSystem
      owner: my-backup-controller
    - name: CloudProviderSpecialCase
      owner: my-custom-storage-detach-controller (3)
    - name: WaitForStorageDetach
      owner: my-custom-storage-detach-controller
  ...
1 包含单个生命周期钩子的preDrain生命周期钩子段。
2 包含三个生命周期钩子的preTerminate生命周期钩子段。
3 一个钩子实现控制器,它管理两个preTerminate生命周期钩子:CloudProviderSpecialCaseWaitForStorageDetach

面向运维人员的机器删除生命周期钩子示例

运维人员可以使用机器删除阶段的生命周期钩子来修改机器删除过程。以下示例演示了运维人员可以使用此功能的几种可能方式。

preDrain生命周期钩子的用例示例

主动替换机器

运维人员可以使用preDrain生命周期钩子来确保在移除已删除机器的实例之前成功创建替换机器并将其加入集群。这可以减轻机器替换期间中断或替换实例未及时初始化的影响。

实现自定义清空逻辑

运维人员可以使用preDrain生命周期钩子将机器控制器清空逻辑替换为不同的清空控制器。通过替换清空逻辑,运维人员可以更灵活地控制每个节点上工作负载的生命周期。

例如,机器控制器清空库不支持排序,但自定义清空提供程序可以提供此功能。通过使用自定义清空提供程序,运维人员可以优先移动关键任务应用程序,然后再清空节点,以确保在集群容量有限的情况下将服务中断降至最低。

preTerminate生命周期钩子的用例示例

验证存储分离

运维人员可以使用preTerminate生命周期钩子来确保在从基础设施提供程序中移除机器之前,分离附加到机器的存储。

提高日志可靠性

节点被清空后,日志导出守护程序需要一些时间才能将日志同步到集中式日志系统。

日志运维人员可以使用preTerminate生命周期钩子在节点清空和从基础设施提供程序中移除机器之间添加延迟。此延迟将为运维人员提供时间来确保主要工作负载已移除,并且不再添加到日志积压中。当没有新数据添加到日志积压中时,日志导出程序可以赶上同步过程,从而确保捕获所有应用程序日志。

使用机器生命周期钩子进行仲裁保护

对于使用机器 API 运算符的 OpenShift Container Platform 集群,etcd 运算符使用机器删除阶段的生命周期钩子来实现仲裁保护机制。

通过使用preDrain生命周期钩子,etcd 运算符可以控制何时清空和移除控制平面机器上的 Pod。为了保护 etcd 仲裁,etcd 运算符会阻止移除 etcd 成员,直到它将该成员迁移到集群中的新节点。

此机制允许 etcd 运算符精确控制 etcd 仲裁的成员,并允许机器 API 运算符在没有 etcd 集群的特定操作知识的情况下安全地创建和移除控制平面机器。

带有仲裁保护处理顺序的控制平面删除

当在使用控制平面机器集的集群上替换控制平面机器时,集群暂时具有四个控制平面机器。当第四个控制平面节点加入集群时,etcd 运算符会在替换节点上启动一个新的 etcd 成员。当 etcd 运算符观察到旧的控制平面机器被标记为要删除时,它会停止旧节点上的 etcd 成员,并提升替换的 etcd 成员以加入集群的仲裁。

控制平面机器Deleting阶段按以下顺序进行

  1. 控制平面机器被计划删除。

  2. 控制平面机器进入Deleting阶段。

  3. 为了满足preDrain生命周期钩子,etcd 运算符执行以下操作

    1. etcd 运算符等待直到第四个控制平面机器作为 etcd 成员添加到集群中。这个新的 etcd 成员的状态为Running,但在从 etcd leader 接收完整的数据库更新之前,它不是ready状态。

    2. 当新的 etcd 成员接收完完整的数据库更新后,etcd Operator 会将新的 etcd 成员提升为投票成员,并从集群中移除旧的 etcd 成员。

    此转换完成后,安全移除旧的 etcd pod 及其数据,因此 preDrain 生命周期钩子将被移除。

  4. 控制平面机器状态条件 Drainable 设置为 True

  5. 机器控制器尝试驱逐由控制平面机器支持的节点。

    • 如果清空失败,Drained将设置为False,并且机器控制器将再次尝试清空节点。

    • 如果清空成功,Drained将设置为True

  6. 控制平面机器状态条件 Drained 设置为 True

  7. 如果没有其他 Operator 添加了 preTerminate 生命周期钩子,则控制平面机器状态条件 Terminable 将设置为 True

  8. 机器控制器从基础设施提供程序中移除实例。

  9. 机器控制器删除Node对象。

演示 etcd 仲裁保护 preDrain 生命周期钩子的 YAML 代码片段
apiVersion: machine.openshift.io/v1beta1
kind: Machine
metadata:
  ...
spec:
  lifecycleHooks:
    preDrain:
    - name: EtcdQuorumOperator (1)
      owner: clusteroperator/etcd (2)
  ...
1 preDrain生命周期钩子的名称。
2 管理preDrain生命周期钩子的钩子实现控制器。