$ oc get machine -n openshift-machine-api
您可以删除特定机器。
除非您的集群使用控制平面机器集,否则请勿删除控制平面机器。 |
安装 OpenShift Container Platform 集群。
安装 OpenShift CLI (oc
)。
以具有 cluster-admin
权限的用户身份登录 oc
。
通过运行以下命令查看集群中的机器
$ oc get machine -n openshift-machine-api
命令输出包含集群中机器的列表,格式为 <clusterid>-<role>-<cloud_region>
。
确定要删除的机器。
运行以下命令删除机器
$ oc delete machine <machine> -n openshift-machine-api
默认情况下,机器控制器会尝试排空由机器支持的节点,直到成功为止。在某些情况下,例如 Pod 干扰预算配置错误,排空操作可能无法成功。如果排空操作失败,机器控制器将无法继续删除机器。 您可以通过在特定机器中添加注释 |
如果您删除的机器属于机器集,则会立即创建一台新机器以满足指定的副本数量。
机器生命周期钩子是机器协调生命周期中的某些点,在这些点上,正常的生命周期过程可以被中断。在机器“删除”阶段,这些中断为组件提供了修改机器删除过程的机会。
要了解机器删除阶段的生命周期钩子的行为,您必须了解以下概念
协调是指控制器尝试使集群的实际状态及其包含的对象与对象规范中的要求相匹配的过程。
机器控制器管理机器的协调生命周期。对于云平台上的机器,机器控制器是 OpenShift Container Platform 控制器和云提供商的特定于平台的执行器的组合。
在机器删除的上下文中,机器控制器执行以下操作
排空由机器支持的节点。
从云提供商删除机器实例。
删除Node
对象。
生命周期钩子是对象协调生命周期中的一个定义点,在该点,正常的生命周期过程可以被中断。组件可以使用生命周期钩子将更改注入到过程中以实现预期结果。
机器“删除”阶段有两个生命周期钩子
preDrain
生命周期钩子必须在由机器支持的节点可以被排空之前解析。
preTerminate
生命周期钩子必须在可以从基础架构提供商中删除实例之前解析。
钩子实现控制器是一个控制器(机器控制器除外),它可以与生命周期钩子交互。钩子实现控制器可以执行以下一项或多项操作
添加生命周期钩子。
响应生命周期钩子。
移除生命周期钩子。
每个生命周期钩子都有一个单独的钩子实现控制器,但一个钩子实现控制器可以管理一个或多个钩子。
在 OpenShift Container Platform 4.17 中,机器删除阶段有两个生命周期钩子:preDrain
和 preTerminate
。当给定生命周期点的所有钩子都被移除时,协调将照常继续。
机器Deleting
阶段按以下顺序进行
现有机器因以下原因之一被计划删除
具有cluster-admin
权限的用户使用oc delete machine
命令。
机器获得machine.openshift.io/delete-machine
注释。
管理该机器的机器集将其标记为要删除,以作为协调的一部分减少副本数量。
集群自动伸缩器识别出一个对满足集群部署需求不必要的节点。
配置机器健康检查以替换不健康的机器。
机器进入Deleting
阶段,在这个阶段中,它被标记为要删除,但仍然存在于API中。
如果存在preDrain
生命周期钩子,则管理它的钩子实现控制器将执行指定的动作。
直到所有preDrain
生命周期钩子都满足,机器状态条件Drainable
才设置为False
。
没有未解决的preDrain
生命周期钩子,并且机器状态条件Drainable
设置为True
。
机器控制器尝试清空由机器支持的节点。
如果清空失败,Drained
将设置为False
,并且机器控制器将再次尝试清空节点。
如果清空成功,Drained
将设置为True
。
机器状态条件Drained
设置为True
。
如果存在preTerminate
生命周期钩子,则管理它的钩子实现控制器将执行指定的动作。
直到所有preTerminate
生命周期钩子都满足,机器状态条件Terminable
才设置为False
。
没有未解决的preTerminate
生命周期钩子,并且机器状态条件Terminable
设置为True
。
机器控制器从基础设施提供程序中移除实例。
机器控制器删除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 生命周期钩子:CloudProviderSpecialCase 和WaitForStorageDetach 。 |
运维人员可以使用机器删除阶段的生命周期钩子来修改机器删除过程。以下示例演示了运维人员可以使用此功能的几种可能方式。
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
阶段按以下顺序进行
控制平面机器被计划删除。
控制平面机器进入Deleting
阶段。
为了满足preDrain
生命周期钩子,etcd 运算符执行以下操作
etcd 运算符等待直到第四个控制平面机器作为 etcd 成员添加到集群中。这个新的 etcd 成员的状态为Running
,但在从 etcd leader 接收完整的数据库更新之前,它不是ready
状态。
当新的 etcd 成员接收完完整的数据库更新后,etcd Operator 会将新的 etcd 成员提升为投票成员,并从集群中移除旧的 etcd 成员。
此转换完成后,安全移除旧的 etcd pod 及其数据,因此 preDrain
生命周期钩子将被移除。
控制平面机器状态条件 Drainable
设置为 True
。
机器控制器尝试驱逐由控制平面机器支持的节点。
如果清空失败,Drained
将设置为False
,并且机器控制器将再次尝试清空节点。
如果清空成功,Drained
将设置为True
。
控制平面机器状态条件 Drained
设置为 True
。
如果没有其他 Operator 添加了 preTerminate
生命周期钩子,则控制平面机器状态条件 Terminable
将设置为 True
。
机器控制器从基础设施提供程序中移除实例。
机器控制器删除Node
对象。
preDrain
生命周期钩子的 YAML 代码片段apiVersion: machine.openshift.io/v1beta1
kind: Machine
metadata:
...
spec:
lifecycleHooks:
preDrain:
- name: EtcdQuorumOperator (1)
owner: clusteroperator/etcd (2)
...
1 | preDrain 生命周期钩子的名称。 |
2 | 管理preDrain 生命周期钩子的钩子实现控制器。 |