6.6. 替换没有 BMC 凭证的裸机 control plane 节点失败
如果裸机集群中的 control plane 节点失败且无法恢复,但在没有提供基板管理控制器(BMC)凭证的情况下安装集群,则必须执行额外的步骤来将故障节点替换为新节点。
6.6.1. 先决条件 复制链接链接已复制到粘贴板!
- 您已找出不健康的裸机 etcd 成员。
- 您已确认机器没有运行,或者该节点未就绪。
-
您可以使用具有
cluster-admin角色的用户访问集群。 - 如果您遇到任何问题,可以进行一个 etcd 备份。
-
您已下载并安装
coreos-installerCLI。 您的集群没有 control plane
machineset。您可以运行以下命令来检查machinesets:$ oc get machinesets,controlplanemachinesets -n openshift-machine-api重要worker 应该只有一个或者多个
machinesets。如果存在 control plane 的controlplanemachinesets,请不要使用此流程。
6.6.2. 删除不健康的 etcd 成员 复制链接链接已复制到粘贴板!
通过首先删除不健康的 etcd 成员来开始删除失败的 control plane 节点。
流程
运行以下命令列出 etcd pod,并记录下没有受影响节点上的 pod:
$ oc -n openshift-etcd get pods -l k8s-app=etcd -o wide输出示例
etcd-openshift-control-plane-0 5/5 Running 11 3h56m 192.168.10.9 openshift-control-plane-0 <none> <none> etcd-openshift-control-plane-1 5/5 Running 0 3h54m 192.168.10.10 openshift-control-plane-1 <none> <none> etcd-openshift-control-plane-2 5/5 Running 0 3h58m 192.168.10.11 openshift-control-plane-2 <none> <none>运行以下命令连接到正在运行的 etcd 容器:
$ oc rsh -n openshift-etcd <etcd_pod>将
<etcd_pod>替换为与一个健康节点关联的 etcd pod 的名称。示例命令
$ oc rsh -n openshift-etcd etcd-openshift-control-plane-0运行以下命令来查看 etcd 成员列表。记录不健康的 etcd 成员的 ID 和名称,稍后会需要这些值。
sh-4.2# etcdctl member list -w table输出示例
+------------------+---------+------------------------------+---------------------------+---------------------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | +------------------+---------+------------------------------+---------------------------+---------------------------+ | 6fc1e7c9db35841d | started | openshift-control-plane-2 | https://10.0.131.183:2380 | https://10.0.131.183:2379 | | 757b6793e2408b6c | started | openshift-control-plane-1 | https://10.0.164.97:2380 | https://10.0.164.97:2379 | | ca8c2990a0aa29d1 | started | openshift-control-plane-0 | https://10.0.154.204:2380 | https://10.0.154.204:2379 | +------------------+---------+------------------------------+---------------------------+---------------------------+重要etcdctl endpoint health命令将列出已删除的成员,直到完成替换并添加新成员为止。运行以下命令来删除不健康的 etcd 成员:
sh-4.2# etcdctl member remove <unhealthy_member_id>将
<unhealthy_member_id>替换为不健康节点上的 etcd 成员的 ID。示例命令
sh-4.2# etcdctl member remove 6fc1e7c9db35841d输出示例
Member 6fc1e7c9db35841d removed from cluster b23536c33f2cdd1b运行以下命令来再次查看成员列表,并验证成员已被删除:
sh-4.2# etcdctl member list -w table输出示例
+------------------+---------+------------------------------+---------------------------+---------------------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | +------------------+---------+------------------------------+---------------------------+---------------------------+ | 757b6793e2408b6c | started | openshift-control-plane-1 | https://10.0.164.97:2380 | https://10.0.164.97:2379 | | ca8c2990a0aa29d1 | started | openshift-control-plane-0 | https://10.0.154.204:2380 | https://10.0.154.204:2379 | +------------------+---------+------------------------------+---------------------------+---------------------------+重要删除成员后,在剩余的 etcd 实例重启时,集群可能无法访问。
运行以下命令,将 rsh 会话退出到 etcd pod 中:
sh-4.2# exit运行以下命令关闭 etcd 仲裁保护:
$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'此命令可确保您可以成功重新创建机密并推出静态 pod。
运行以下命令,列出已删除的不健康 etcd 成员的 secret:
$ oc get secrets -n openshift-etcd | grep <node_name>将
<node_name>替换为您删除的 etcd 成员的故障节点的名称。示例命令
$ oc get secrets -n openshift-etcd | grep openshift-control-plane-2输出示例
etcd-peer-openshift-control-plane-2 kubernetes.io/tls 2 134m etcd-serving-metrics-openshift-control-plane-2 kubernetes.io/tls 2 134m etcd-serving-openshift-control-plane-2 kubernetes.io/tls 2 134m删除与已删除的受影响节点关联的 secret:
运行以下命令来删除 peer secret:
$ oc delete secret -n openshift-etcd etcd-peer-<node_name>将
<node_name>替换为受影响节点的名称。运行以下命令来删除 serving secret:
$ oc delete secret -n openshift-etcd etcd-serving-<node_name>将
<node_name>替换为受影响节点的名称。运行以下命令来删除 metrics secret:
$ oc delete secret -n openshift-etcd etcd-serving-metrics-<node_name>1 将
<node_name>替换为受影响节点的名称。
6.6.3. 删除不健康 etcd 成员的机器 复制链接链接已复制到粘贴板!
通过删除不健康 etcd 成员的机器来完成失败的 control plane 节点。
流程
运行以下命令,确保 Bare Metal Operator 可用:
$ oc get clusteroperator baremetal输出示例
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE baremetal 4.20.0 True False False 3d15h运行以下命令,将受影响节点的
BareMetalHost对象保存到文件中,以便稍后使用:$ oc get -n openshift-machine-api bmh <node_name> -o yaml > bmh_affected.yaml将
<node_name>替换为受影响节点的名称,这通常与关联的BareMetalHost名称匹配。运行以下命令,查看保存的
BareMetalHost对象的 YAML 文件,并确保内容正确:$ cat bmh_affected.yaml运行以下命令来删除受影响的
BareMetalHost对象:$ oc delete -n openshift-machine-api bmh <node_name>将
<node_name>替换为受影响节点的名称。运行以下命令列出所有机器,并识别与受影响节点关联的机器:
$ oc get machines -n openshift-machine-api -o wide输出示例
NAME PHASE TYPE REGION ZONE AGE NODE PROVIDERID STATE examplecluster-control-plane-0 Running 3h11m openshift-control-plane-0 baremetalhost:///openshift-machine-api/openshift-control-plane-0/da1ebe11-3ff2-41c5-b099-0aa41222964e externally provisioned examplecluster-control-plane-1 Running 3h11m openshift-control-plane-1 baremetalhost:///openshift-machine-api/openshift-control-plane-1/d9f9acbc-329c-475e-8d81-03b20280a3e1 externally provisioned examplecluster-control-plane-2 Running 3h11m openshift-control-plane-2 baremetalhost:///openshift-machine-api/openshift-control-plane-2/3354bdac-61d8-410f-be5b-6a395b056135 externally provisioned examplecluster-compute-0 Running 165m openshift-compute-0 baremetalhost:///openshift-machine-api/openshift-compute-0/3d685b81-7410-4bb3-80ec-13a31858241f provisioned examplecluster-compute-1 Running 165m openshift-compute-1 baremetalhost:///openshift-machine-api/openshift-compute-1/0fdae6eb-2066-4241-91dc-e7ea72ab13b9 provisioned运行以下命令来删除不健康成员的机器:
$ oc delete machine -n openshift-machine-api <machine_name>将
<machine_name>替换为与受影响节点关联的机器名称。示例命令
$ oc delete machine -n openshift-machine-api examplecluster-control-plane-2注意删除
BareMetalHost和Machine对象后,机器控制器会自动删除Node对象。如果删除机器因任何原因或者命令被移动而延迟而延迟而延迟,可以通过删除机器对象终结器字段来强制删除。
警告不要通过按
Ctrl+c中断机器删除。您必须允许命令继续完成。打开一个新的终端窗口来编辑并删除 finalizer 字段。在新的终端窗口中,运行以下命令来编辑机器配置:
$ oc edit machine -n openshift-machine-api examplecluster-control-plane-2删除
Machine自定义资源中的以下字段,然后保存更新的文件:finalizers: - machine.machine.openshift.io输出示例
machine.machine.openshift.io/examplecluster-control-plane-2 edited
6.6.4. 验证失败的节点已被删除 复制链接链接已复制到粘贴板!
在继续创建替换 control plane 节点前,请验证失败的节点是否已成功删除。
流程
运行以下命令验证机器是否已删除:
$ oc get machines -n openshift-machine-api -o wide输出示例
NAME PHASE TYPE REGION ZONE AGE NODE PROVIDERID STATE examplecluster-control-plane-0 Running 3h11m openshift-control-plane-0 baremetalhost:///openshift-machine-api/openshift-control-plane-0/da1ebe11-3ff2-41c5-b099-0aa41222964e externally provisioned examplecluster-control-plane-1 Running 3h11m openshift-control-plane-1 baremetalhost:///openshift-machine-api/openshift-control-plane-1/d9f9acbc-329c-475e-8d81-03b20280a3e1 externally provisioned examplecluster-compute-0 Running 165m openshift-compute-0 baremetalhost:///openshift-machine-api/openshift-compute-0/3d685b81-7410-4bb3-80ec-13a31858241f provisioned examplecluster-compute-1 Running 165m openshift-compute-1 baremetalhost:///openshift-machine-api/openshift-compute-1/0fdae6eb-2066-4241-91dc-e7ea72ab13b9 provisioned运行以下命令验证节点是否已删除:
$ oc get nodes输出示例
NAME STATUS ROLES AGE VERSION openshift-control-plane-0 Ready master 3h24m v1.33.4 openshift-control-plane-1 Ready master 3h24m v1.33.4 openshift-compute-0 Ready worker 176m v1.33.4 openshift-compute-1 Ready worker 176m v1.33.4等待所有集群 Operator 完成推出更改。运行以下命令来监控进度:
$ watch oc get co
6.6.5. 创建新的 control plane 节点 复制链接链接已复制到粘贴板!
通过创建 BareMetalHost 对象和节点开始创建新的 control plane 节点。
流程
编辑之前保存的
bmh_affected.yaml文件:从文件中删除以下元数据项目:
-
creationTimestamp -
generation -
resourceVersion -
uid
-
-
删除文件的
status部分。
生成的文件应类似以下示例:
bmh_affected.yaml文件示例apiVersion: metal3.io/v1alpha1 kind: BareMetalHost metadata: labels: installer.openshift.io/role: control-plane name: openshift-control-plane-2 namespace: openshift-machine-api spec: automatedCleaningMode: disabled bmc: address: credentialsName: disableCertificateVerification: true bootMACAddress: ab:cd:ef:ab:cd:ef bootMode: UEFI externallyProvisioned: true online: true rootDeviceHints: deviceName: /dev/disk/by-path/pci-0000:04:00.0-nvme-1 userData: name: master-user-data-managed namespace: openshift-machine-api运行以下命令,使用
bmh_affected.yaml文件创建BareMetalHost对象:$ oc create -f bmh_affected.yaml在创建
BareMetalHost对象时会出现以下警告:Warning: metadata.finalizers: "baremetalhost.metal3.io": prefer a domain-qualified finalizer name to avoid accidental conflicts with other finalizer writers运行以下命令来提取 control plane ignition secret:
$ oc extract secret/master-user-data-managed \ -n openshift-machine-api \ --keys=userData \ --to=- \ | sed '/^userData/d' > new_controlplane.ign此命令还会删除 ignition secret 的起始
userData行。使用以下示例参考,为新节点的网络配置创建一个名为
new_controlplane_nmstate.yaml的 Nmstate YAML 文件:Nmstate YAML 文件示例
interfaces: - name: eno1 type: ethernet state: up mac-address: "ab:cd:ef:01:02:03" ipv4: enabled: true address: - ip: 192.168.20.11 prefix-length: 24 dhcp: false ipv6: enabled: false dns-resolver: config: search: - iso.sterling.home server: - 192.168.20.8 routes: config: - destination: 0.0.0.0/0 metric: 100 next-hop-address: 192.168.20.1 next-hop-interface: eno1 table-id: 254注意如果使用基于代理的安装程序安装集群,您可以使用原始集群部署的
agent-config.yaml文件中的故障节点的networkConfig部分作为新 control plane 节点的 Nmstate 文件的起点。例如,以下命令提取第一个 control plane 节点的networkConfig部分:$ cat agent-config-iso.yaml | yq .hosts[0].networkConfig > new_controlplane_nmstate.yaml运行以下命令,创建自定义的 Red Hat Enterprise Linux CoreOS (RHCOS) live ISO:
$ coreos-installer iso customize rhcos-live.86_64.iso \ --dest-ignition new_controlplane.ign \ --network-nmstate new_controlplane_nmstate.yaml \ --dest-device /dev/disk/by-path/<device_path> \ -f将
<device_path>替换为生成 ISO 的目标设备的路径。- 使用自定义 RHCOS live ISO 引导新的 control plane 节点。
- 批准证书签名请求(CSR),将新节点加入到集群中。
6.6.6. 将节点、裸机主机和机器连接在一起 复制链接链接已复制到粘贴板!
通过创建机器,然后将其链接到新的 BareMetalHost 对象和节点,继续创建新的 control plane 节点。
流程
运行以下命令,获取 control plane 节点的
providerID:$ oc get -n openshift-machine-api baremetalhost -l installer.openshift.io/role=control-plane -ojson | jq -r '.items[] | "baremetalhost:///openshift-machine-api/" + .metadata.name + "/" + .metadata.uid'输出示例
baremetalhost:///openshift-machine-api/master-00/6214c5cf-c798-4168-8c78-1ff1a3cd2cb4 baremetalhost:///openshift-machine-api/master-01/58fb60bd-b2a6-4ff3-a88d-208c33abf954 baremetalhost:///openshift-machine-api/master-02/dc5a94f3-625b-43f6-ab5a-7cc4fc79f105运行以下命令,获取标签的集群信息:
$ oc get machine -n openshift-machine-api \ -l machine.openshift.io/cluster-api-machine-role=master \ -L machine.openshift.io/cluster-api-cluster输出示例
NAME PHASE TYPE REGION ZONE AGE CLUSTER-API-CLUSTER ci-op-jcp3s7wx-ng5sd-master-0 Running 10h ci-op-jcp3s7wx-ng5sd ci-op-jcp3s7wx-ng5sd-master-1 Running 10h ci-op-jcp3s7wx-ng5sd ci-op-jcp3s7wx-ng5sd-master-2 Running 10h ci-op-jcp3s7wx-ng5sd通过创建一个类似如下的 yaml 文件,为新 control plane 节点创建
Machine对象:apiVersion: machine.openshift.io/v1beta1 kind: Machine metadata: annotations: metal3.io/BareMetalHost: openshift-machine-api/<new_control_plane_machine>1 finalizers: - machine.machine.openshift.io labels: machine.openshift.io/cluster-api-cluster: <cluster_api_cluster>2 machine.openshift.io/cluster-api-machine-role: master machine.openshift.io/cluster-api-machine-type: master name: <new_control_plane_machine>3 namespace: openshift-machine-api spec: metadata: {} providerID: <provider_id>4 providerSpec: value: apiVersion: baremetal.cluster.k8s.io/v1alpha1 hostSelector: {} image: checksum: "" url: "" kind: BareMetalMachineProviderSpec userData: name: master-user-data-managed其中:
<new_control_plane_machine>- 指定新机器的名称,可以与之前删除的机器名称相同。
<cluster_api_cluster>-
为其他 control plane 机器指定
CLUSTER-API-CLUSTER值,如上一步的输出中所示。 <provider_id>-
指定新裸机主机的
providerID值,如前一步的输出中所示。
应该会发出以下警告:
Warning: metadata.finalizers: "machine.machine.openshift.io": prefer a domain-qualified finalizer name to avoid accidental conflicts with other finalizer writers通过在单个 bash shell 会话中执行以下步骤,将新的 control plane 节点和
Machine对象链接到BareMetalHost对象:运行以下命令来定义
NEW_NODE_NAME变量:$ NEW_NODE_NAME=<new_node_name>将
<new_node_name>替换为新 control plane 节点的名称。运行以下命令定义
NEW_MACHINE_NAME变量:$ NEW_MACHINE_NAME=<new_machine_name>将
<new_machine_name>替换为新机器的名称。运行以下命令来定义
BMH_UID,使其从新节点的BareMetalHost对象中提取:$ BMH_UID=$(oc get -n openshift-machine-api bmh $NEW_NODE_NAME -ojson | jq -r .metadata.uid)$ echo $BMH_UID运行以下命令,将
consumerRef对象修补到裸机主机中:$ oc patch -n openshift-machine-api bmh $NEW_NODE_NAME --type merge --patch '{"spec":{"consumerRef":{"apiVersion":"machine.openshift.io/v1beta1","kind":"Machine","name":"'$NEW_MACHINE_NAME'","namespace":"openshift-machine-api"}}}'运行以下命令,将
providerID值修补到新节点:$ oc patch node $NEW_NODE_NAME --type merge --patch '{"spec":{"providerID":"baremetalhost:///openshift-machine-api/'$NEW_NODE_NAME'/'$BMH_UID'"}}'运行以下命令,查看
providerID值:$ oc get node -l node-role.kubernetes.io/control-plane -ojson | jq -r '.items[] | .metadata.name + " " + .spec.providerID'
运行以下命令,将
BareMetalHost对象的poweredOn状态设置为true:$ oc patch -n openshift-machine-api bmh $NEW_NODE_NAME --subresource status --type json -p '[{"op":"replace","path":"/status/poweredOn","value":true}]'运行以下命令,查看
BareMetalHost对象的poweredOn状态:$ oc get bmh -n openshift-machine-api -ojson | jq -r '.items[] | .metadata.name + " PoweredOn:" + (.status.poweredOn | tostring)'运行以下命令,查看
BareMetalHost对象的置备状态:$ oc get bmh -n openshift-machine-api -ojson | jq -r '.items[] | .metadata.name + " ProvisioningState:" + .status.provisioning.state'重要如果置备状态不是
unmanaged,请运行以下命令来更改置备状态:$ oc patch -n openshift-machine-api bmh $NEW_NODE_NAME --subresource status --type json -p '[{"op":"replace","path":"/status/provisioning/state","value":"unmanaged"}]'运行以下命令,将机器的状态设置为
Provisioned:$ oc patch -n openshift-machine-api machines $NEW_MACHINE_NAME -n openshift-machine-api --subresource status --type json -p '[{"op":"replace","path":"/status/phase","value":"Provisioned"}]'
6.6.7. 添加新 etcd 成员 复制链接链接已复制到粘贴板!
通过向集群添加新 etcd 成员,完成添加新的 control plane 节点。
流程
通过在单个 bash shell 会话中执行以下步骤来在集群中添加新的 etcd 成员:
运行以下命令,查找新 control plane 节点的 IP:
$ oc get nodes -owide -l node-role.kubernetes.io/control-plane记录下节点的 IP 地址供以后使用。
运行以下命令列出 etcd pod:
$ oc get -n openshift-etcd pods -l k8s-app=etcd -o wide运行以下命令,连接到正在运行的 etcd pod 之一。新节点上的 etcd pod 应处于
CrashLoopBackOff状态。$ oc rsh -n openshift-etcd <running_pod>将
<running_pod>替换为上一步中显示的正在运行的 pod 的名称。运行以下命令来查看 etcd 成员列表:
sh-4.2# etcdctl member list -w table运行以下命令添加新的 control plane etcd 成员:
sh-4.2# etcdctl member add <new_node> --peer-urls="https://<ip_address>:2380"其中:
<new_node>- 指定新 control plane 节点的名称
<ip_address>- 指定新节点的 IP 地址。
运行以下命令退出 rsh shell:
sh-4.2# exit
运行以下命令来强制重新部署 etcd:
$ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "single-master-recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge运行以下命令重新打开 etcd 仲裁保护:
$ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'运行以下命令监控集群 Operator 推出部署:
$ watch oc get co