2.3. 安装后进行故障排除和恢复
带有隔离的双节点 OpenShift 集群只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅以下链接:
使用以下小节帮助您通过隔离在双节点 OpenShift 集群中恢复问题。
2.3.3. 使用隔离替换双节点 OpenShift 集群中的 control plane 节点 复制链接链接已复制到粘贴板!
您可以替换双节点 OpenShift 集群中失败的 control plane 节点。替换节点必须使用与故障节点相同的主机名和 IP 地址。
先决条件
- 您有一个可正常工作的 survivor control plane 节点。
- 您已确认机器没有运行,或者该节点未就绪。
-
您可以使用具有
cluster-admin角色的用户访问集群。 - 您知道故障节点的主机名和 IP 地址。
在继续操作前进行 etcd 备份,以确保在出现问题时可以恢复集群。
流程
运行以下命令检查仲裁状态:
$ sudo pcs quorum status输出示例
Quorum information ------------------ Date: Fri Oct 3 14:15:31 2025 Quorum provider: corosync_votequorum Nodes: 2 Node ID: 1 Ring ID: 1.16 Quorate: Yes Votequorum information ---------------------- Expected votes: 2 Highest expected: 2 Total votes: 2 Quorum: 1 Flags: 2Node Quorate WaitForAll Membership information ---------------------- Nodeid Votes Qdevice Name 1 1 NR master-0 (local) 2 1 NR master-1如果 quorum 丢失,且一个 control plane 节点仍在运行,请运行以下命令在 survivor 节点上手动恢复仲裁:
$ sudo pcs quorum unblock如果只有一个节点失败,请运行以下命令验证 etcd 是否在 survivor 节点上运行:
$ sudo pcs resource status etcd如果 etcd 没有运行,请运行以下命令重启 etcd:
$ sudo pcs resource cleanup etcd如果 etcd 仍然没有启动,手动在存活的节点上强制启动,跳过隔离:
重要在运行此命令前,请确保被替换的节点无法访问。否则,会面临 etcd 被破坏的风险。
$ sudo pcs resource debug-stop etcd$ sudo OCF_RESKEY_CRM_meta_notify_start_resource='etcd' pcs resource debug-start etcd恢复后,etcd 必须在存活的节点上成功运行。
运行以下命令,为故障节点删除 etcd secret:
$ oc project openshift-etcd$ oc delete secret etcd-peer-<node_name>$ oc delete secret etcd-serving-<node_name>$ oc delete secret etcd-serving-metrics-<node_name>注意要替换失败的节点,需要首先删除其 etcd secret。当 etcd 运行时,API 服务器可能需要一些时间才能响应这些命令。
删除故障节点的资源:
如果您有
BareMetalHost(BMH)对象,请运行以下命令来识别您要替换的主机:$ oc get bmh -n openshift-machine-api运行以下命令,删除故障节点的 BMH 对象:
$ oc delete bmh/<bmh_name> -n openshift-machine-api运行以下命令,列出
Machine对象来识别映射到您要替换的节点的对象:$ oc get machines.machine.openshift.io -n openshift-machine-api运行以下命令,从
Machine对象获取带有机器哈希值的标签:$ oc get machines.machine.openshift.io/<machine_name> -n openshift-machine-api \ -o jsonpath='Machine hash label: {.metadata.labels.machine\.openshift\.io/cluster-api-cluster}{"\n"}'将
<machine_name>替换为集群中的Machine对象的名称。例如:ostest-bfs7w-ctrlplane-0。您需要此标签来置备新的
Machine对象。运行以下命令,删除故障节点的
Machine对象:$ oc delete machines.machine.openshift.io/<machine_name>-<failed nodename> -n openshift-machine-api注意在删除
Machine对象后,节点对象会被自动删除。
使用相同的名称和 IP 地址重新创建失败的主机:
重要只有在使用安装程序置备的基础架构或 Machine API 创建原始节点时,才需要执行此步骤。有关替换失败的裸机 control plane 节点的详情,请参考"在裸机中替换不健康的 etcd 成员"。
-
删除 BMH 和
Machine对象。机器控制器自动删除节点对象。 使用以下示例配置置备新机器:
Machine对象配置示例apiVersion: machine.openshift.io/v1beta1 kind: Machine metadata: annotations: metal3.io/BareMetalHost: openshift-machine-api/{bmh_name} finalizers: - machine.machine.openshift.io labels: machine.openshift.io/cluster-api-cluster: {machine_hash_label} machine.openshift.io/cluster-api-machine-role: master machine.openshift.io/cluster-api-machine-type: master name: {machine_name} namespace: openshift-machine-api spec: authoritativeAPI: MachineAPI metadata: {} providerSpec: value: apiVersion: baremetal.cluster.k8s.io/v1alpha1 customDeploy: method: install_coreos hostSelector: {} image: checksum: "" url: "" kind: BareMetalMachineProviderSpec metadata: creationTimestamp: null userData: name: master-user-data-managed-
metadata.annotations.metal3.io/BareMetalHost: 将{bmh_name}替换为与您要替换的主机关联的 BMH 对象的名称。 -
labels.machine.openshift.io/cluster-api-cluster: 将{machine_hash_label}替换为从您删除的机器中获取的标签。 -
metadata.name:将{machine_name}替换为您删除的机器的名称。
-
运行以下命令,创建新的 BMH 对象和 secret 来存储 BMC 凭证:
cat <<EOF | oc apply -f - apiVersion: v1 kind: Secret metadata: name: <secret_name> namespace: openshift-machine-api data: password: <password> username: <username> type: Opaque --- apiVersion: metal3.io/v1alpha1 kind: BareMetalHost metadata: name: {bmh_name} namespace: openshift-machine-api spec: automatedCleaningMode: disabled bmc: address: <redfish_url>/{uuid} credentialsName: <name> disableCertificateVerification: true bootMACAddress: {boot_mac_address} bootMode: UEFI externallyProvisioned: false online: true rootDeviceHints: deviceName: /dev/disk/by-id/scsi-<serial_number> userData: name: master-user-data-managed namespace: openshift-machine-api EOF-
metadata.name:指定 secret 的名称。 -
metadata.name:将{bmh_name}替换为您删除的 BMH 对象的名称。 -
BMC.address: 将{uuid}替换为您创建的节点的 UUID。 -
BMC.credentialsName:将name替换为您创建的 secret 的名称。 -
bootMACAddress:指定 provisioning 网络接口的 MAC 地址。这是节点在调配期间与 Ironic 通信时使用的 MAC 地址。
-
-
删除 BMH 和
运行以下命令验证新节点是否已达到
Provisioned状态:$ oc get bmh -o wide此命令输出中的
STATUS列的值必须是Provisioned。注意完成置备过程可能需要 10 到 20 分钟。
运行以下命令,验证两个 control plane 节点都处于
Ready状态:$ oc get nodes此命令输出中的
STATUS列值对于两个节点都必须是Ready。运行以下命令,将
detached注解应用到 BMH 对象以防止 Machine API 管理它:$ oc annotate bmh <bmh_name> -n openshift-machine-api baremetalhost.metal3.io/detached='' --overwrite运行以下命令,将替换节点重新加入到 pacemaker 集群中:
注意在存活的 control plane 节点上运行以下命令,而不是被替换的节点。
$ sudo pcs cluster node remove <node_name>$ sudo pcs cluster node add <node_name> addr=<node_ip> --start --enable运行以下命令,删除故障节点的过时作业:
$ oc project openshift-etcd$ oc delete job tnf-auth-job-<node_name>$ oc delete job tnf-after-setup-job-<node_name>
验证
有关验证 control plane 节点和 etcd 是否正常运行的详情,请参考"使用隔离在双节点 OpenShift 集群中验证 etcd 健康状况"。
2.3.5. 在带有隔离的双节点 OpenShift 集群中验证 etcd 健康状况 复制链接链接已复制到粘贴板!
完成节点恢复或维护过程后,验证 control plane 节点和 etcd 是否在正确运行。
先决条件
-
您可以使用具有
cluster-admin权限的用户访问集群。 - 您可以通过 SSH 访问至少一个 control plane 节点。
流程
运行以下命令检查整个节点状态:
$ oc get nodes此命令验证 control plane 节点是否处于
Ready状态,表示它们是否可以接收调度的工作负载。运行以下命令,验证
cluster-etcd-operator的状态:$ oc describe co/etcdcluster-etcd-operator管理并报告 etcd 设置的健康状况。查看其状态可帮助您识别任何持续的问题或降级条件。运行以下命令来查看 etcd 成员列表:
$ oc rsh -n openshift-etcd <etcd_pod> etcdctl member list -w table此命令显示当前的 etcd 成员及其角色。查找标记为
learner的任何节点,这表示它们正在成为投票成员。在 control plane 节点上运行以下命令来查看 Pacemaker 资源状态:
$ sudo pcs status --full此命令提供 Pacemaker 管理的所有资源的详细概述。您必须确保满足以下条件:
- 两个节点都在线。
-
kubelet和etcd资源正在运行。 - 两个节点的隔离都正确配置。