16.5. 扩展集群

部署安装程序置备的 OpenShift Container Platform 集群后,您可以使用以下步骤扩展 worker 节点的数量。确保每个 worker 节点都满足先决条件。

注意

使用 RedFish Virtual Media 扩展集群需要满足最低固件要求。有关使用 RedFish Virtual Media 扩展集群的详情,请参阅先决条件部分中的使用虚拟介质安装的固件要求

16.5.1. 准备裸机节点

要扩展集群,必须为节点提供相关 IP 地址。这可以通过静态配置,或使用 DHCP (动态主机配置协议)服务器来完成。在使用 DHCP 服务器扩展集群时,每个节点都必须有 DHCP 保留。

保留 IP 地址,以便其成为静态 IP 地址

有些管理员更喜欢使用静态 IP 地址,以便在没有 DHCP 服务器时每个节点的 IP 地址保持恒定状态。要使用 NMState 配置静态 IP 地址,请参阅 install-config.yaml 文件中的 "可选:配置主机网络接口,以了解更多详细信息。

准备裸机节点需要从 provisioner 节点执行以下步骤。

流程

  1. 获取 oc 二进制文件:

    $ curl -s https://mirror.openshift.com/pub/openshift-v4/clients/ocp/$VERSION/openshift-client-linux-$VERSION.tar.gz | tar zxvf - oc
    $ sudo cp oc /usr/local/bin
  2. 使用基板管理控制器 (BMC) 关闭裸机节点,并确保它已关闭。
  3. 检索裸机节点基板管理控制器的用户名和密码。然后,从用户名和密码创建 base64 字符串:

    $ echo -ne "root" | base64
    $ echo -ne "password" | base64
  4. 为裸机节点创建配置文件。根据您是否使用静态配置还是 DHCP 服务器,请使用以下示例 bmh.yaml 文件,替换 YAML 中的值以匹配您的环境:

    $ vim bmh.yaml
    • 静态配置 bmh.yaml

      ---
      apiVersion: v1 1
      kind: Secret
      metadata:
       name: openshift-worker-<num>-network-config-secret 2
       namespace: openshift-machine-api
      type: Opaque
      stringData:
       nmstate: | 3
        interfaces: 4
        - name: <nic1_name> 5
          type: ethernet
          state: up
          ipv4:
            address:
            - ip: <ip_address> 6
              prefix-length: 24
            enabled: true
        dns-resolver:
          config:
            server:
            - <dns_ip_address> 7
        routes:
          config:
          - destination: 0.0.0.0/0
            next-hop-address: <next_hop_ip_address> 8
            next-hop-interface: <next_hop_nic1_name> 9
      ---
      apiVersion: v1
      kind: Secret
      metadata:
        name: openshift-worker-<num>-bmc-secret 10
        namespace: openshift-machine-api
      type: Opaque
      data:
        username: <base64_of_uid> 11
        password: <base64_of_pwd> 12
      ---
      apiVersion: metal3.io/v1alpha1
      kind: BareMetalHost
      metadata:
        name: openshift-worker-<num> 13
        namespace: openshift-machine-api
      spec:
        online: True
        bootMACAddress: <nic1_mac_address> 14
        bmc:
          address: <protocol>://<bmc_url> 15
          credentialsName: openshift-worker-<num>-bmc-secret 16
          disableCertificateVerification: True 17
          username: <bmc_username> 18
          password: <bmc_password> 19
        rootDeviceHints:
          deviceName: <root_device_hint> 20
        preprovisioningNetworkDataName: openshift-worker-<num>-network-config-secret 21
      1
      要为新创建的节点配置网络接口,请指定包含网络配置的 secret 的名称。按照 nmstate 语法为节点定义网络配置。有关配置 NMState 语法的详情,请参阅"可选:在 install-config.yaml 文件中配置主机网络接口"。
      2 10 13 16
      namecredentialsName 字段和 preprovisioningNetworkDataName 字段中,使用裸机节点的 worker 数量替换 <num>
      3
      添加 NMState YAML 语法来配置主机接口。
      4
      可选:如果您使用 nmstate 配置网络接口,并且您要禁用接口,请将 state: 设置为 enabled: false,如下所示:
      ---
         interfaces:
         - name: <nic_name>
           type: ethernet
           state: up
           ipv4:
             enabled: false
           ipv6:
             enabled: false
      5 6 7 8 9
      使用适当的值替换 <nic1_name>, <ip_address>, <dns_ip_address>, <next_hop_ip_address><next_hop_nic1_name>
      11 12
      <base64_of_uid><base64_of_pwd> 替换为用户名和密码的 base64 字符串。
      14
      <nic1_mac_address> 替换为裸机节点第一个 NIC 的 MAC 地址。如需了解更多 BMC 配置选项,请参阅"BMC 寻址"部分。
      15
      <protocol> 替换为 BMC 协议,如 IPMI、RedFish 或其他协议。将 <bmc_url> 替换为裸机节点基板管理控制器的 URL。
      17
      要跳过证书验证,将 disableCertificateVerification 设为 true。
      18 19
      <bmc_username><bmc_password> 替换为 BMC 用户名和密码的字符串。
      20
      可选:如果您指定了 root 设备提示,将 <root_device_hint> 替换为设备路径。
      21
      可选: 如果您为新创建的节点配置了网络接口,请在 BareMetalHost CR 的 preprovisioningNetworkDataName 中提供网络配置 secret 名称。
    • DHCP 配置 bmh.yaml

      ---
      apiVersion: v1
      kind: Secret
      metadata:
        name: openshift-worker-<num>-bmc-secret 1
        namespace: openshift-machine-api
      type: Opaque
      data:
        username: <base64_of_uid> 2
        password: <base64_of_pwd> 3
      ---
      apiVersion: metal3.io/v1alpha1
      kind: BareMetalHost
      metadata:
        name: openshift-worker-<num> 4
        namespace: openshift-machine-api
      spec:
        online: True
        bootMACAddress: <nic1_mac_address> 5
        bmc:
          address: <protocol>://<bmc_url> 6
          credentialsName: openshift-worker-<num>-bmc-secret 7
          disableCertificateVerification: True 8
          username: <bmc_username> 9
          password: <bmc_password> 10
        rootDeviceHints:
          deviceName: <root_device_hint> 11
        preprovisioningNetworkDataName: openshift-worker-<num>-network-config-secret 12
      1 4 7
      namecredentialsName 字段和 preprovisioningNetworkDataName 字段中,使用裸机节点的 worker 数量替换 <num>
      2 3
      <base64_of_uid><base64_of_pwd> 替换为用户名和密码的 base64 字符串。
      5
      <nic1_mac_address> 替换为裸机节点第一个 NIC 的 MAC 地址。如需了解更多 BMC 配置选项,请参阅"BMC 寻址"部分。
      6
      <protocol> 替换为 BMC 协议,如 IPMI、RedFish 或其他协议。将 <bmc_url> 替换为裸机节点基板管理控制器的 URL。
      8
      要跳过证书验证,将 disableCertificateVerification 设为 true。
      9 10
      <bmc_username><bmc_password> 替换为 BMC 用户名和密码的字符串。
      11
      可选:如果您指定了 root 设备提示,将 <root_device_hint> 替换为设备路径。
      12
      可选: 如果您为新创建的节点配置了网络接口,请在 BareMetalHost CR 的 preprovisioningNetworkDataName 中提供网络配置 secret 名称。
    注意

    如果现有裸机节点的 MAC 地址与您试图置备的裸机主机的 MAC 地址匹配,则 Ironic 安装将失败。如果主机注册、检查、清理或其他 Ironic 步骤失败,Bare Metal Operator 会持续重试安装。如需更多信息,请参阅"诊断主机重复的 MAC 地址"。

  5. 创建裸机节点:

    $ oc -n openshift-machine-api create -f bmh.yaml

    输出示例

    secret/openshift-worker-<num>-network-config-secret created
    secret/openshift-worker-<num>-bmc-secret created
    baremetalhost.metal3.io/openshift-worker-<num> created

    其中 <num> 是 worker 号。

  6. 启动并检查裸机节点:

    $ oc -n openshift-machine-api get bmh openshift-worker-<num>

    其中 <num> 是 worker 节点号。

    输出示例

    NAME                    STATE       CONSUMER   ONLINE   ERROR
    openshift-worker-<num>  available              true

    注意

    要允许 worker 节点加入集群,请将 machineset 对象扩展到 BareMetalHost 对象的数量。您可以手动或自动缩放节点。要自动扩展节点,请为 machineset 使用 metal3.io/autoscale-to-hosts 注解。

其他资源

16.5.2. 替换裸机 control plane 节点

使用以下步骤替换安装程序置备的 OpenShift Container Platform control plane 节点。

重要

如果您从现有 control plane 主机重复使用 BareMetalHost 对象定义,请不要将 externallyProvisioned 字段保留为 true

如果 OpenShift Container Platform 安装程序置备,现有 control plane BareMetalHost 对象可能会将 externallyProvisioned 标记设为 true

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 已进行 etcd 备份。

    重要

    执行此流程前进行 etcd 备份,以便在遇到任何问题时可以恢复集群。有关获取 etcd 备份的更多信息,请参阅附加资源部分。

流程

  1. 确保 Bare Metal Operator 可用:

    $ oc get clusteroperator baremetal

    输出示例

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

  2. 删除旧的 BareMetalHostMachine 对象:

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

    <host_name> 替换为主机名,<machine_name> 替换为机器的名称。机器名称会出现在 CONSUMER 字段下。

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

  3. 创建新的 BareMetalHost 对象和 secret,以存储 BMC 凭证:

    $ cat <<EOF | oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: control-plane-<num>-bmc-secret 1
      namespace: openshift-machine-api
    data:
      username: <base64_of_uid> 2
      password: <base64_of_pwd> 3
    type: Opaque
    ---
    apiVersion: metal3.io/v1alpha1
    kind: BareMetalHost
    metadata:
      name: control-plane-<num> 4
      namespace: openshift-machine-api
    spec:
      automatedCleaningMode: disabled
      bmc:
        address: <protocol>://<bmc_ip> 5
        credentialsName: control-plane-<num>-bmc-secret 6
      bootMACAddress: <NIC1_mac_address> 7
      bootMode: UEFI
      externallyProvisioned: false
      hardwareProfile: unknown
      online: true
    EOF
    1 4 6
    name 字段和 credentialsName 字段中,使用裸机节点的 control plane 数量替换 <num>
    2
    <base64_of_uid> 替换为用户名的 base64 格式的字符串。
    3
    <base64_of_pwd> 替换为密码的 base64 格式的字符串。
    5
    <protocol> 替换为 BMC 协议,如 redfishredfish-virtualmediaidrac-virtualmedia 或其他。将 <bmc_ip> 替换为裸机节点基板管理控制器的 IP 地址。如需了解更多 BMC 配置选项,请参阅附加资源部分中的 "BMC 寻址"。
    7
    <NIC1_mac_address> 替换为裸机节点第一个 NIC 的 MAC 地址。

    检查完成后,BareMetalHost 对象会被创建并可用置备。

  4. 查看可用的 BareMetalHost 对象:

    $ oc get bmh -n openshift-machine-api

    输出示例

    NAME                          STATE                    CONSUMER                   ONLINE   ERROR   AGE
    control-plane-1.example.com   available                control-plane-1            true             1h10m
    control-plane-2.example.com   externally provisioned   control-plane-2            true             4h53m
    control-plane-3.example.com   externally provisioned   control-plane-3            true             4h53m
    compute-1.example.com         provisioned              compute-1-ktmmx            true             4h53m
    compute-1.example.com         provisioned              compute-2-l2zmb            true             4h53m

    control plane 节点没有 MachineSet 对象,因此您必须创建 Machine 对象。您可以从另一个 control plane Machine 对象复制 providerSpec

  5. 创建 Machine 对象:

    $ cat <<EOF | oc apply -f -
    apiVersion: machine.openshift.io/v1beta1
    kind: Machine
    metadata:
      annotations:
        metal3.io/BareMetalHost: openshift-machine-api/control-plane-<num> 1
      labels:
        machine.openshift.io/cluster-api-cluster: control-plane-<num> 2
        machine.openshift.io/cluster-api-machine-role: master
        machine.openshift.io/cluster-api-machine-type: master
      name: control-plane-<num> 3
      namespace: openshift-machine-api
    spec:
      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
    EOF
    1 2 3
    name, labelsannotations 字段中,使用裸机节点的 control plane 数量替换 <num>
  6. 要查看 BareMetalHost 对象,请运行以下命令:

    $ oc get bmh -A

    输出示例

    NAME                          STATE                    CONSUMER                   ONLINE   ERROR   AGE
    control-plane-1.example.com   provisioned              control-plane-1            true             2h53m
    control-plane-2.example.com   externally provisioned   control-plane-2            true             5h53m
    control-plane-3.example.com   externally provisioned   control-plane-3            true             5h53m
    compute-1.example.com         provisioned              compute-1-ktmmx            true             5h53m
    compute-2.example.com         provisioned              compute-2-l2zmb            true             5h53m

  7. 在 RHCOS 安装后,验证 BareMetalHost 是否已添加到集群中:

    $ oc get nodes

    输出示例

    NAME                           STATUS      ROLES     AGE   VERSION
    control-plane-1.example.com    available   master    4m2s  v1.18.2
    control-plane-2.example.com    available   master    141m  v1.18.2
    control-plane-3.example.com    available   master    141m  v1.18.2
    compute-1.example.com          available   worker    87m   v1.18.2
    compute-2.example.com          available   worker    87m   v1.18.2

    注意

    替换新的 control plane 节点后,在新节点上运行的 etcd pod 处于 crashloopback 状态。如需更多信息,请参阅附加资源部分中的 "替换不健康的 etcd 成员"。

16.5.3. 准备在 baremetal 网络中使用 Virtual Media 进行部署

如果启用了 provisioning 网络,且您要使用 baremetal 网络中的 Virtual Media 扩展集群,请使用以下步骤。

先决条件

  • 有一个带有 a baremetal 网络和 provisioning 网络的现有集群。

流程

  1. 编辑 置备 自定义资源(CR),以在 baremetal 网络中使用 Virtual Media 启用部署:

    oc edit provisioning
      apiVersion: metal3.io/v1alpha1
      kind: Provisioning
      metadata:
        creationTimestamp: "2021-08-05T18:51:50Z"
        finalizers:
        - provisioning.metal3.io
        generation: 8
        name: provisioning-configuration
        resourceVersion: "551591"
        uid: f76e956f-24c6-4361-aa5b-feaf72c5b526
      spec:
        provisioningDHCPRange: 172.22.0.10,172.22.0.254
        provisioningIP: 172.22.0.3
        provisioningInterface: enp1s0
        provisioningNetwork: Managed
        provisioningNetworkCIDR: 172.22.0.0/24
        virtualMediaViaExternalNetwork: true 1
      status:
        generations:
        - group: apps
          hash: ""
          lastGeneration: 7
          name: metal3
          namespace: openshift-machine-api
          resource: deployments
        - group: apps
          hash: ""
          lastGeneration: 1
          name: metal3-image-cache
          namespace: openshift-machine-api
          resource: daemonsets
        observedGeneration: 8
        readyReplicas: 0
    1
    virtualMediaViaExternalNetwork: true 添加到 provisioning CR。
  2. 如果镜像 URL 存在,请编辑 machineset 以使用 API VIP 地址。此步骤只适用于在 4.9 或更早版本安装的集群。

    oc edit machineset
      apiVersion: machine.openshift.io/v1beta1
      kind: MachineSet
      metadata:
        creationTimestamp: "2021-08-05T18:51:52Z"
        generation: 11
        labels:
          machine.openshift.io/cluster-api-cluster: ostest-hwmdt
          machine.openshift.io/cluster-api-machine-role: worker
          machine.openshift.io/cluster-api-machine-type: worker
        name: ostest-hwmdt-worker-0
        namespace: openshift-machine-api
        resourceVersion: "551513"
        uid: fad1c6e0-b9da-4d4a-8d73-286f78788931
      spec:
        replicas: 2
        selector:
          matchLabels:
            machine.openshift.io/cluster-api-cluster: ostest-hwmdt
            machine.openshift.io/cluster-api-machineset: ostest-hwmdt-worker-0
        template:
          metadata:
            labels:
              machine.openshift.io/cluster-api-cluster: ostest-hwmdt
              machine.openshift.io/cluster-api-machine-role: worker
              machine.openshift.io/cluster-api-machine-type: worker
              machine.openshift.io/cluster-api-machineset: ostest-hwmdt-worker-0
          spec:
            metadata: {}
            providerSpec:
              value:
                apiVersion: baremetal.cluster.k8s.io/v1alpha1
                hostSelector: {}
                image:
                  checksum: http:/172.22.0.3:6181/images/rhcos-<version>.<architecture>.qcow2.<md5sum> 1
                  url: http://172.22.0.3:6181/images/rhcos-<version>.<architecture>.qcow2 2
                kind: BareMetalMachineProviderSpec
                metadata:
                  creationTimestamp: null
                userData:
                  name: worker-user-data
      status:
        availableReplicas: 2
        fullyLabeledReplicas: 2
        observedGeneration: 11
        readyReplicas: 2
        replicas: 2
    1
    编辑 校验和 URL,以使用 API VIP 地址。
    2
    编辑 URL 以使用 API VIP 地址。

16.5.4. 在集群中置备新主机时诊断重复的 MAC 地址

如果集群中现有裸机节点的 MAC 地址与您试图添加到集群的裸机主机的 MAC 地址匹配,Bare Metal Operator 将主机与现有节点关联。如果主机注册、检查、清理或其他 Ironic 步骤失败,Bare Metal Operator 会持续重试安装。失败的裸机主机会显示注册错误。

您可以通过检查在 openshift-machine-api 命名空间中运行的裸机主机来诊断重复的 MAC 地址。

先决条件

  • 在裸机上安装 OpenShift Container Platform 集群。
  • 安装 OpenShift Container Platform CLI oc
  • 以具有 cluster-admin 权限的用户身份登录。

流程

要确定置备失败的裸机主机是否具有与现有节点相同的 MAC 地址,请执行以下操作:

  1. 获取在 openshift-machine-api 命名空间中运行的裸机主机:

    $ oc get bmh -n openshift-machine-api

    输出示例

    NAME                 STATUS   PROVISIONING STATUS      CONSUMER
    openshift-master-0   OK       externally provisioned   openshift-zpwpq-master-0
    openshift-master-1   OK       externally provisioned   openshift-zpwpq-master-1
    openshift-master-2   OK       externally provisioned   openshift-zpwpq-master-2
    openshift-worker-0   OK       provisioned              openshift-zpwpq-worker-0-lv84n
    openshift-worker-1   OK       provisioned              openshift-zpwpq-worker-0-zd8lm
    openshift-worker-2   error    registering

  2. 要查看失败主机状态的更多详细信息,请运行以下命令将 <bare_metal_host_name> 替换为主机名称:

    $ oc get -n openshift-machine-api bmh <bare_metal_host_name> -o yaml

    输出示例

    ...
    status:
      errorCount: 12
      errorMessage: MAC address b4:96:91:1d:7c:20 conflicts with existing node openshift-worker-1
      errorType: registration error
    ...

16.5.5. 置备裸机节点

置备裸机节点需要从 provisioner 节点执行以下步骤。

流程

  1. 在置备裸机节点前,请确保 STATEavailable

    $  oc -n openshift-machine-api get bmh openshift-worker-<num>

    其中 <num> 是 worker 节点号。

    NAME              STATE     ONLINE ERROR  AGE
    openshift-worker  available true          34h
  2. 获取 worker 节点数量。

    $ oc get nodes
    NAME                                                STATUS   ROLES           AGE     VERSION
    openshift-master-1.openshift.example.com            Ready    master          30h     v1.25.0
    openshift-master-2.openshift.example.com            Ready    master          30h     v1.25.0
    openshift-master-3.openshift.example.com            Ready    master          30h     v1.25.0
    openshift-worker-0.openshift.example.com            Ready    worker          30h     v1.25.0
    openshift-worker-1.openshift.example.com            Ready    worker          30h     v1.25.0
  3. 获取计算机器集。

    $ oc get machinesets -n openshift-machine-api
    NAME                                DESIRED   CURRENT   READY   AVAILABLE   AGE
    ...
    openshift-worker-0.example.com      1         1         1       1           55m
    openshift-worker-1.example.com      1         1         1       1           55m
  4. 将 worker 节点数量增加一个。

    $ oc scale --replicas=<num> machineset <machineset> -n openshift-machine-api

    <num> 替换为新的 worker 节点数。将 <machineset> 替换为上一步中计算机器设置的名称。

  5. 检查裸机节点的状态。

    $ oc -n openshift-machine-api get bmh openshift-worker-<num>

    其中 <num> 是 worker 节点号。STATE 从 ready 变为 provisioning

    NAME                    STATE             CONSUMER                          ONLINE   ERROR
    openshift-worker-<num>  provisioning      openshift-worker-<num>-65tjz      true

    provisioning 状态会保持,直到 OpenShift Container Platform 集群置备节点。这可能需要 30 分钟或更长时间。在调配节点后,其状态将更改为 provisioned

    NAME                    STATE             CONSUMER                          ONLINE   ERROR
    openshift-worker-<num>  provisioned       openshift-worker-<num>-65tjz      true
  6. 在置备完成后,确保裸机节点就绪。

    $ oc get nodes
    NAME                                          STATUS   ROLES   AGE     VERSION
    openshift-master-1.openshift.example.com      Ready    master  30h     v1.25.0
    openshift-master-2.openshift.example.com      Ready    master  30h     v1.25.0
    openshift-master-3.openshift.example.com      Ready    master  30h     v1.25.0
    openshift-worker-0.openshift.example.com      Ready    worker  30h     v1.25.0
    openshift-worker-1.openshift.example.com      Ready    worker  30h     v1.25.0
    openshift-worker-<num>.openshift.example.com  Ready    worker  3m27s   v1.25.0

    您还可以检查 kubelet。

    $ ssh openshift-worker-<num>
    [kni@openshift-worker-<num>]$ journalctl -fu kubelet