6.6. 替换没有 BMC 凭证的裸机 control plane 节点失败


如果裸机集群中的 control plane 节点失败且无法恢复,但在没有提供基板管理控制器(BMC)凭证的情况下安装集群,则必须执行额外的步骤来将故障节点替换为新节点。

6.6.1. 先决条件

  • 您已找出不健康的裸机 etcd 成员。
  • 您已确认机器没有运行,或者该节点未就绪。
  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 如果您遇到任何问题,可以进行一个 etcd 备份
  • 您已下载并安装 coreos-installer CLI
  • 您的集群没有 control plane machineset。您可以运行以下命令来检查 machinesets

    $ oc get machinesets,controlplanemachinesets -n openshift-machine-api
    重要

    worker 应该只有一个或者多个 machinesets。如果存在 control plane 的 controlplanemachinesets,请不要使用此流程。

6.6.2. 删除不健康的 etcd 成员

通过首先删除不健康的 etcd 成员来开始删除失败的 control plane 节点。

流程

  1. 运行以下命令列出 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>

  2. 运行以下命令连接到正在运行的 etcd 容器:

    $ oc rsh -n openshift-etcd <etcd_pod>

    <etcd_pod> 替换为与一个健康节点关联的 etcd pod 的名称。

    示例命令

    $ oc rsh -n openshift-etcd etcd-openshift-control-plane-0

  3. 运行以下命令来查看 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 命令将列出已删除的成员,直到完成替换并添加新成员为止。

  4. 运行以下命令来删除不健康的 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

  5. 运行以下命令来再次查看成员列表,并验证成员已被删除:

    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 实例重启时,集群可能无法访问。

  6. 运行以下命令,将 rsh 会话退出到 etcd pod 中:

    sh-4.2# exit
  7. 运行以下命令关闭 etcd 仲裁保护:

    $ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'

    此命令可确保您可以成功重新创建机密并推出静态 pod。

  8. 运行以下命令,列出已删除的不健康 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

  9. 删除与已删除的受影响节点关联的 secret:

    1. 运行以下命令来删除 peer secret:

      $ oc delete secret -n openshift-etcd etcd-peer-<node_name>

      <node_name> 替换为受影响节点的名称。

    2. 运行以下命令来删除 serving secret:

      $ oc delete secret -n openshift-etcd etcd-serving-<node_name>

      <node_name> 替换为受影响节点的名称。

    3. 运行以下命令来删除 metrics secret:

      $ oc delete secret -n openshift-etcd etcd-serving-metrics-<node_name> 
      1

      <node_name> 替换为受影响节点的名称。

6.6.3. 删除不健康 etcd 成员的机器

通过删除不健康 etcd 成员的机器来完成失败的 control plane 节点。

流程

  1. 运行以下命令,确保 Bare Metal Operator 可用:

    $ oc get clusteroperator baremetal

    输出示例

    NAME        VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
    baremetal   4.20.0    True        False         False      3d15h

  2. 运行以下命令,将受影响节点的 BareMetalHost 对象保存到文件中,以便稍后使用:

    $ oc get -n openshift-machine-api bmh <node_name> -o yaml > bmh_affected.yaml

    <node_name> 替换为受影响节点的名称,这通常与关联的 BareMetalHost 名称匹配。

  3. 运行以下命令,查看保存的 BareMetalHost 对象的 YAML 文件,并确保内容正确:

    $ cat bmh_affected.yaml
  4. 运行以下命令来删除受影响的 BareMetalHost 对象:

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

    <node_name> 替换为受影响节点的名称。

  5. 运行以下命令列出所有机器,并识别与受影响节点关联的机器:

    $ 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

  6. 运行以下命令来删除不健康成员的机器:

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

    <machine_name> 替换为与受影响节点关联的机器名称。

    示例命令

    $ oc delete machine -n openshift-machine-api examplecluster-control-plane-2

    注意

    删除 BareMetalHostMachine 对象后,机器控制器会自动删除 Node 对象。

  7. 如果删除机器因任何原因或者命令被移动而延迟而延迟而延迟,可以通过删除机器对象终结器字段来强制删除。

    警告

    不要通过按 Ctrl+c 中断机器删除。您必须允许命令继续完成。打开一个新的终端窗口来编辑并删除 finalizer 字段。

    1. 在新的终端窗口中,运行以下命令来编辑机器配置:

      $ oc edit machine -n openshift-machine-api examplecluster-control-plane-2
    2. 删除 Machine 自定义资源中的以下字段,然后保存更新的文件:

      finalizers:
      - machine.machine.openshift.io

      输出示例

      machine.machine.openshift.io/examplecluster-control-plane-2 edited

6.6.4. 验证失败的节点已被删除

在继续创建替换 control plane 节点前,请验证失败的节点是否已成功删除。

流程

  1. 运行以下命令验证机器是否已删除:

    $ 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

  2. 运行以下命令验证节点是否已删除:

    $ 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

  3. 等待所有集群 Operator 完成推出更改。运行以下命令来监控进度:

    $ watch oc get co

6.6.5. 创建新的 control plane 节点

通过创建 BareMetalHost 对象和节点开始创建新的 control plane 节点。

流程

  1. 编辑之前保存的 bmh_affected.yaml 文件:

    1. 从文件中删除以下元数据项目:

      • creationTimestamp
      • generation
      • resourceVersion
      • uid
    2. 删除文件的 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

  2. 运行以下命令,使用 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
  3. 运行以下命令来提取 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 行。

  4. 使用以下示例参考,为新节点的网络配置创建一个名为 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
  5. 运行以下命令,创建自定义的 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 的目标设备的路径。

  6. 使用自定义 RHCOS live ISO 引导新的 control plane 节点。
  7. 批准证书签名请求(CSR),将新节点加入到集群中。

6.6.6. 将节点、裸机主机和机器连接在一起

通过创建机器,然后将其链接到新的 BareMetalHost 对象和节点,继续创建新的 control plane 节点。

流程

  1. 运行以下命令,获取 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

  2. 运行以下命令,获取标签的集群信息:

    $ 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

  3. 通过创建一个类似如下的 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
  4. 通过在单个 bash shell 会话中执行以下步骤,将新的 control plane 节点和 Machine 对象链接到 BareMetalHost 对象:

    1. 运行以下命令来定义 NEW_NODE_NAME 变量:

      $ NEW_NODE_NAME=<new_node_name>

      <new_node_name> 替换为新 control plane 节点的名称。

    2. 运行以下命令定义 NEW_MACHINE_NAME 变量:

      $ NEW_MACHINE_NAME=<new_machine_name>

      <new_machine_name> 替换为新机器的名称。

    3. 运行以下命令来定义 BMH_UID,使其从新节点的 BareMetalHost 对象中提取:

      $ BMH_UID=$(oc get -n openshift-machine-api bmh $NEW_NODE_NAME -ojson | jq -r .metadata.uid)
      $ echo $BMH_UID
    4. 运行以下命令,将 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"}}}'
    5. 运行以下命令,将 providerID 值修补到新节点:

      $ oc patch node $NEW_NODE_NAME --type merge --patch '{"spec":{"providerID":"baremetalhost:///openshift-machine-api/'$NEW_NODE_NAME'/'$BMH_UID'"}}'
    6. 运行以下命令,查看 providerID 值:

      $ oc get node -l node-role.kubernetes.io/control-plane -ojson | jq -r '.items[] | .metadata.name + "  " + .spec.providerID'
  5. 运行以下命令,将 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}]'
  6. 运行以下命令,查看 BareMetalHost 对象的 poweredOn 状态:

    $ oc get bmh -n openshift-machine-api -ojson | jq -r '.items[] | .metadata.name + "   PoweredOn:" +  (.status.poweredOn | tostring)'
  7. 运行以下命令,查看 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"}]'
  8. 运行以下命令,将机器的状态设置为 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 节点。

流程

  1. 通过在单个 bash shell 会话中执行以下步骤来在集群中添加新的 etcd 成员:

    1. 运行以下命令,查找新 control plane 节点的 IP:

      $ oc get nodes -owide -l node-role.kubernetes.io/control-plane

      记录下节点的 IP 地址供以后使用。

    2. 运行以下命令列出 etcd pod:

      $ oc get -n openshift-etcd pods -l k8s-app=etcd -o wide
    3. 运行以下命令,连接到正在运行的 etcd pod 之一。新节点上的 etcd pod 应处于 CrashLoopBackOff 状态。

      $ oc rsh -n openshift-etcd <running_pod>

      <running_pod> 替换为上一步中显示的正在运行的 pod 的名称。

    4. 运行以下命令来查看 etcd 成员列表:

      sh-4.2# etcdctl member list -w table
    5. 运行以下命令添加新的 control plane etcd 成员:

      sh-4.2# etcdctl member add <new_node> --peer-urls="https://<ip_address>:2380"

      其中:

      <new_node>
      指定新 control plane 节点的名称
      <ip_address>
      指定新节点的 IP 地址。
    6. 运行以下命令退出 rsh shell:

      sh-4.2# exit
  2. 运行以下命令来强制重新部署 etcd:

    $ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "single-master-recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
  3. 运行以下命令重新打开 etcd 仲裁保护:

    $ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'
  4. 运行以下命令监控集群 Operator 推出部署:

    $ watch oc get co
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部