跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Edge 文档 / 快速入门 / 使用 Metal3 实现 BMC 自动化部署

1 使用 Metal3 实现 BMC 自动化部署

Metal3 是一个 CNCF 项目,它为 Kubernetes 提供裸机基础架构管理功能。

Metal3 提供 Kubernetes 原生资源来管理裸机服务器的生命周期,支持通过 Redfish 等带外协议进行管理。

它还为群集 API (CAPI) 提供成熟的支持,允许通过广泛采用的不区分供应商的 API 来管理跨多个基础架构提供商的基础架构资源。

1.1 为何使用此方法

此方法非常适合用于目标硬件支持带外管理,并且需要全自动化基础架构管理流程的方案。

管理群集配置为提供声明性 API 来对下游群集裸机服务器进行清单和状态管理,包括自动检查、清理和置备/取消置备。

1.2 概要体系结构

metal3 体系结构快速入门

1.3 先决条件

下游群集服务器硬件和网络相关的限制具体如下所述:

  • 管理群集

    • 必须与目标服务器管理/BMC API 建立网络连接

    • 必须与目标服务器控制平面网络建立网络连接

    • 对于多节点管理群集,需要配置额外的预留 IP 地址

  • 要控制的主机

    • 必须支持通过 Redfish、iDRAC 或 iLO 接口进行带外管理

    • 必须支持通过虚拟媒体进行部署(目前不支持 PXE)

    • 必须与管理群集建立网络连接,以便能够访问 Metal3 置备 API

需要一些工具,可以安装在管理群集上,也可以安装在能够访问管理群集的主机上。

必须从 SUSE Customer CenterSUSE 下载页面下载 SLE-Micro.x86_64-5.5.0-Default-GM.raw.xz 操作系统映像文件。

1.3.1 设置管理群集

安装管理群集和使用 Metal3 的基本步骤如下:

  1. 安装 RKE2 管理群集

  2. 安装 Rancher

  3. 安装存储提供程序

  4. 安装 Metal3 依赖项

  5. 安装 CAPI 依赖项

  6. 为下游群集主机构建 SLEMicro 操作系统映像

  7. 注册 BareMetalHost CR 以定义裸机清单

  8. 通过定义 CAPI 资源创建下游群集

本指南假设已安装现有的 RKE2 群集和 Rancher(包括 cert-manager),例如已使用 Edge Image Builder 安装(第 9 章 “Edge Image Builder)。

提示
提示

也可以按照 ATIP 管理群集文档(第 29 章 “设置管理群集)中所述,将此处所述的步骤完全自动化。

1.3.2 安装 Metal3 依赖项

必须安装并运行 cert-manager(如果在安装 Rancher 的过程中未安装)。

必须安装永久存储提供程序。建议使用 Longhorn,但对于开发/PoC 环境,也可以使用 local-path。以下说明假设已将 StorageClass 标记为默认,否则需要对 Metal3 chart 进行额外的配置。

需要提供一个额外的 IP,该 IP 由 MetalLB 管理,用于为 Metal3 管理服务提供一致的端点。此 IP 必须是控制平面子网的一部分,并且是为静态配置预留的(不是任何 DHCP 池的一部分)。

提示
提示

如果管理群集是单个节点,则可以避免通过 MetalLB 管理额外的浮动 IP,具体参见“单节点配置”(第 1.6.1 节 “单节点配置”

  1. 首先,我们需要安装 MetalLB:

    helm install \
      metallb oci://registry.suse.com/edge/metallb-chart \
      --namespace metallb-system \
      --create-namespace
  2. 然后使用定义为 STATIC_IRONIC_IP(如下所示)的预留 IP 来定义 IPAddressPoolL2Advertisment

    export STATIC_IRONIC_IP=<STATIC_IRONIC_IP>
    
    cat <<-EOF | kubectl apply -f -
    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      name: ironic-ip-pool
      namespace: metallb-system
    spec:
      addresses:
      - ${STATIC_IRONIC_IP}/32
      serviceAllocation:
        priority: 100
        serviceSelectors:
        - matchExpressions:
          - {key: app.kubernetes.io/name, operator: In, values: [metal3-ironic]}
    EOF
    cat <<-EOF | kubectl apply -f -
    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: ironic-ip-pool-l2-adv
      namespace: metallb-system
    spec:
      ipAddressPools:
      - ironic-ip-pool
    EOF
  3. 现在可以安装 Metal3

    helm install \
      metal3 oci://registry.suse.com/edge/metal3-chart \
      --namespace metal3-system \
      --create-namespace \
      --set global.ironicIP="${STATIC_IRONIC_IP}"
  4. 大约要经过两分钟,initContainer 才会在此部署中运行,因此在继续之前,请确保所有 Pod 都已运行:

    kubectl get pods -n metal3-system
    NAME                                                    READY   STATUS    RESTARTS   AGE
    baremetal-operator-controller-manager-85756794b-fz98d   2/2     Running   0          15m
    metal3-metal3-ironic-677bc5c8cc-55shd                   4/4     Running   0          15m
    metal3-metal3-mariadb-7c7d6fdbd8-64c7l                  1/1     Running   0          15m
警告
警告

请在 metal3-system 名称空间中的所有 Pod 都已运行之后才继续执行以下步骤

1.3.3 安装群集 API 依赖项

首先,我们需要禁用 Rancher 嵌入的 CAPI 控制器:

cat <<-EOF | kubectl apply -f -
apiVersion: management.cattle.io/v3
kind: Feature
metadata:
  name: embedded-cluster-api
spec:
  value: false
EOF

kubectl delete mutatingwebhookconfiguration.admissionregistration.k8s.io mutating-webhook-configuration
kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io validating-webhook-configuration
kubectl wait --for=delete namespace/cattle-provisioning-capi-system --timeout=300s

然后,要使用 SUSE 映像,需要创建一个配置文件:

mkdir ~/.cluster-api
cat >  ~/.cluster-api/clusterctl.yaml <<EOF
images:
  all:
    repository: registry.suse.com/edge
EOF

安装 clusterctl 1.6.x,之后我们将安装核心、基础架构、引导程序和控制平面提供程序,如下所示:

clusterctl init --core "cluster-api:v1.6.2" --infrastructure "metal3:v1.6.0" --bootstrap "rke2:v0.2.6" --control-plane "rke2:v0.2.6"

一段时间后,控制器 Pod 应会在 capi-systemcapm3-systemrke2-bootstrap-systemrke2-control-plane-system 名称空间中运行。

1.3.4 准备下游群集映像

Edge Image Builder(第 9 章 “Edge Image Builder)用于准备下游群集主机上置备的经过修改的 SLEMicro 基础映像。

可以通过 Edge Image Builder 完成大部分配置,但本指南仅介绍设置下游群集所需的最低限度配置。

1.3.4.1 映像配置

运行 Edge Image Builder 时,将从主机挂载一个目录,因此需要创建一个目录结构来存储用于定义目标映像的配置文件。

├── downstream-cluster-config.yaml
├── base-images/
│   └ SLE-Micro.x86_64-5.5.0-Default-GM.raw
├── network/
|   └ configure-network.sh
└── custom/
    └ scripts/
        └ growfs.sh
1.3.4.1.1 下游群集映像定义文件

downstream-cluster-config.yaml 文件是下游群集映像的主配置文件。下面是通过 Metal3 进行部署的极简示例:

apiVersion: 1.0
image:
  imageType: RAW
  arch: x86_64
  baseImage: SLE-Micro.x86_64-5.5.0-Default-GM.raw
  outputImageName: SLE-Micro-eib-output.raw
operatingSystem:
  kernelArgs:
    - ignition.platform.id=openstack
    - net.ifnames=1
  systemd:
    disable:
      - rebootmgr
  users:
    - username: root
      encryptedPassword: ${ROOT_PASSWORD}
      sshKeys:
      - ${USERKEY1}

${ROOT_PASSWORD} 是 root 用户的已加密口令,可用于测试/调试。可以使用 openssl passwd-6 PASSWORD 命令生成此口令

对于生产环境,建议使用可添加到 users 块的 SSH 密钥(将该块中的 ${USERKEY1} 替换为实际 SSH 密钥)。

注意
注意

net.ifnames=1 会启用可预测网络接口命名

这与 metal3 chart 的默认配置相匹配,但设置必须与配置的 chart predictableNicNames 值相匹配。

另请注意,ignition.platform.id=openstack 是必需的,如果不指定此参数,在 Metal3 自动化流程中通过 ignition 进行 SLEMicro 配置将会失败。

1.3.4.1.2 Growfs 脚本

目前是一个自定义脚本 (custom/scripts/growfs.sh),在置备后首次引导时,必须使用此脚本来增大文件系统,使之与磁盘大小匹配。growfs.sh 脚本包含以下信息:

#!/bin/bash
growfs() {
  mnt="$1"
  dev="$(findmnt --fstab --target ${mnt} --evaluate --real --output SOURCE --noheadings)"
  # /dev/sda3 -> /dev/sda, /dev/nvme0n1p3 -> /dev/nvme0n1
  parent_dev="/dev/$(lsblk --nodeps -rno PKNAME "${dev}")"
  # Last number in the device name: /dev/nvme0n1p42 -> 42
  partnum="$(echo "${dev}" | sed 's/^.*[^0-9]\([0-9]\+\)$/\1/')"
  ret=0
  growpart "$parent_dev" "$partnum" || ret=$?
  [ $ret -eq 0 ] || [ $ret -eq 1 ] || exit 1
  /usr/lib/systemd/systemd-growfs "$mnt"
}
growfs /
注意
注意

使用相同的方法添加您自己的自定义脚本,以便在置备过程中执行。有关详细信息,请参见第 3 章 “使用 Edge Image Builder 配置独立群集

与此解决方法相关的 bug 为 https://bugzilla.suse.com/show_bug.cgi?id=1217430

1.3.4.2 映像创建

按照前面的章节准备好目录结构后,运行以下命令来构建映像:

podman run --rm --privileged -it -v $PWD:/eib \
 registry.suse.com/edge/edge-image-builder:1.0.2 \
 build --definition-file downstream-cluster-config.yaml

这会根据上述定义创建名为 SLE-Micro-eib-output.raw 的输出映像文件。

然后必须通过 Web 服务器提供输出映像,该服务器可以是通过 Metal3 chart 启用的媒体服务器容器(注意),也可以是其他某个本地可访问的服务器。在下面的示例中,此服务器是 imagecache.local:8080

1.3.5 添加 BareMetalHost 清单

注册自动部署的裸机服务器需要创建两个资源:一个用于存储 BMC 访问身份凭证的密钥,以及一个用于定义 BMC 连接和其他细节的 Metal3 BareMetalHost 资源:

apiVersion: v1
kind: Secret
metadata:
  name: controlplane-0-credentials
type: Opaque
data:
  username: YWRtaW4=
  password: cGFzc3dvcmQ=
---
apiVersion: metal3.io/v1alpha1
kind: BareMetalHost
metadata:
  name: controlplane-0
  labels:
    cluster-role: control-plane
spec:
  online: true
  bootMACAddress: "00:f3:65:8a:a3:b0"
  bmc:
    address: redfish-virtualmedia://192.168.125.1:8000/redfish/v1/Systems/68bd0fb6-d124-4d17-a904-cdf33efe83ab
    disableCertificateVerification: true
    credentialsName: controlplane-0-credentials

请注意以下几点:

  • 密钥用户名/口令必须采用 base64 编码。请注意,此值不能包含任何尾部换行符(例如,应使用 echo-n,而不是简单地使用 echo!)

  • 可以现在设置 cluster-role 标签,也可以稍后在创建群集时设置。在以下示例中,应该设置 control-planeworker

  • bootMACAddress 必须是与主机的控制平面 NIC 匹配的有效 MAC

  • bmc 地址是与 BMC 管理 API 的连接,支持以下设置:

    • redfish-virtualmedia://<IP 地址>/redfish/v1/Systems/<系统 ID>:Redfish 虚拟媒体,例如 SuperMicro

    • idrac-virtualmedia://<IP 地址>/redfish/v1/Systems/System.Embedded.1:Dell iDRAC

  • 有关 BareMetalHost API 的更多细节,请参见上游 API 文档

1.3.5.1 配置静态 IP

上面的 BareMetalHost 示例假设 DHCP 提供控制平面网络配置,但对于需要手动配置(例如静态 IP)的情况,可以提供附加配置,如下所述。

1.3.5.1.1 用于静态网络配置的附加脚本

使用 Edge Image Builder 创建基础映像时,请在 network 文件夹中创建以下 configure-network.sh 文件。

这会在首次引导时使用配置驱动器数据,并使用 NM Configurator 工具来配置主机网络。

#!/bin/bash

set -eux

# Attempt to statically configure a NIC in the case where we find a network_data.json
# In a configuration drive

CONFIG_DRIVE=$(blkid --label config-2 || true)
if [ -z "${CONFIG_DRIVE}" ]; then
  echo "No config-2 device found, skipping network configuration"
  exit 0
fi

mount -o ro $CONFIG_DRIVE /mnt

NETWORK_DATA_FILE="/mnt/openstack/latest/network_data.json"

if [ ! -f "${NETWORK_DATA_FILE}" ]; then
  umount /mnt
  echo "No network_data.json found, skipping network configuration"
  exit 0
fi

DESIRED_HOSTNAME=$(cat /mnt/openstack/latest/meta_data.json | tr ',{}' '\n' | grep '\"metal3-name\"' | sed 's/.*\"metal3-name\": \"\(.*\)\"/\1/')

mkdir -p /tmp/nmc/{desired,generated}
cp ${NETWORK_DATA_FILE} /tmp/nmc/desired/${DESIRED_HOSTNAME}.yaml
umount /mnt

./nmc generate --config-dir /tmp/nmc/desired --output-dir /tmp/nmc/generated
./nmc apply --config-dir /tmp/nmc/generated
1.3.5.1.2 包含主机网络配置的附加密钥

可为每个主机定义一个附加密钥,其中包含采用 NM Configurator(第 10 章 “边缘网络)所支持的 nmstate 格式的数据。

然后通过 preprovisioningNetworkDataName 规范字段在 BareMetalHost 资源中引用该密钥。

apiVersion: v1
kind: Secret
metadata:
  name: controlplane-0-networkdata
type: Opaque
stringData:
  networkData: |
    interfaces:
    - name: enp1s0
      type: ethernet
      state: up
      mac-address: "00:f3:65:8a:a3:b0"
      ipv4:
        address:
        - ip:  192.168.125.200
          prefix-length: 24
        enabled: true
        dhcp: false
    dns-resolver:
      config:
        server:
        - 192.168.125.1
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.168.125.1
        next-hop-interface: enp1s0
---
apiVersion: metal3.io/v1alpha1
kind: BareMetalHost
metadata:
  name: controlplane-0
  labels:
    cluster-role: control-plane
spec:
  preprovisioningNetworkDataName: controlplane-0-networkdata
# Remaining content as in previous example
注意
注意

尽管 mac-address 在 nmstate API 中是可选的,但要通过 NM Configurator 进行配置,必须提供 mac-address。

1.3.5.2 BareMetalHost 准备

按照上述步骤创建 BareMetalHost 资源和关联的密钥后,将触发主机准备工作流程:

  • 虚拟媒体附件将 ramdisk 映像引导至目标主机 BMC

  • ramdisk 检查硬件细节,并为主机做好置备准备(例如,清理磁盘中的旧数据)

  • 完成此过程后,BareMetalHost status.hardware 字段中的硬件细节将会更新并可供校验

此过程可能需要几分钟时间,但完成后,您应会看到 BareMetalHost 状态变为 available

% kubectl get baremetalhost
NAME             STATE       CONSUMER   ONLINE   ERROR   AGE
controlplane-0   available              true             9m44s
worker-0         available              true             9m44s

1.3.6 创建下游群集

现在创建用于定义下游群集的群集 API 资源,并创建计算机资源,后者会导致置备 BareMetalHost 资源,然后引导这些资源以形成 RKE2 群集。

1.3.7 控制平面部署

为了部署控制平面,我们需要定义一个如下所示的 yaml 清单,其中包含以下资源:

  • 群集资源定义群集名称、网络和控制平面/基础架构提供程序的类型(在本例中为 RKE2/Metal3)

  • Metal3Cluster 定义控制平面端点(单节点群集的主机 IP,多节点群集的负载平衡器端点,本示例假设使用单节点群集)

  • RKE2ControlPlane 定义 RKE2 版本,以及群集引导期间所需的任何其他配置

  • Metal3MachineTemplate 定义要应用于 BareMetalHost 资源的操作系统映像,hostSelector 定义要使用的 BareMetalHost

  • Metal3DataTemplate 定义要传递给 BareMetalHost 的附加 metaData(请注意,Edge 解决方案目前不支持 networkData)

请注意,为简单起见,本示例假设使用单节点控制平面,其中 BareMetalHost 配置了 IP 192.168.125.200 - 有关更高级的多节点示例,请参见 ATIP 文档(第 31 章 “全自动定向网络置备

apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: sample-cluster
  namespace: default
spec:
  clusterNetwork:
    pods:
      cidrBlocks:
        - 192.168.0.0/18
    services:
      cidrBlocks:
        - 10.96.0.0/12
  controlPlaneRef:
    apiVersion: controlplane.cluster.x-k8s.io/v1alpha1
    kind: RKE2ControlPlane
    name: sample-cluster
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: Metal3Cluster
    name: sample-cluster
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3Cluster
metadata:
  name: sample-cluster
  namespace: default
spec:
  controlPlaneEndpoint:
    host: 192.168.125.200
    port: 6443
  noCloudProvider: true
---
apiVersion: controlplane.cluster.x-k8s.io/v1alpha1
kind: RKE2ControlPlane
metadata:
  name: sample-cluster
  namespace: default
spec:
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: Metal3MachineTemplate
    name: sample-cluster-controlplane
  replicas: 1
  agentConfig:
    format: ignition
    kubelet:
      extraArgs:
        - provider-id=metal3://BAREMETALHOST_UUID
    additionalUserData:
      config: |
        variant: fcos
        version: 1.4.0
        systemd:
          units:
            - name: rke2-preinstall.service
              enabled: true
              contents: |
                [Unit]
                Description=rke2-preinstall
                Wants=network-online.target
                Before=rke2-install.service
                ConditionPathExists=!/run/cluster-api/bootstrap-success.complete
                [Service]
                Type=oneshot
                User=root
                ExecStartPre=/bin/sh -c "mount -L config-2 /mnt"
                ExecStart=/bin/sh -c "sed -i \"s/BAREMETALHOST_UUID/$(jq -r .uuid /mnt/openstack/latest/meta_data.json)/\" /etc/rancher/rke2/config.yaml"
                ExecStart=/bin/sh -c "echo \"node-name: $(jq -r .name /mnt/openstack/latest/meta_data.json)\" >> /etc/rancher/rke2/config.yaml"
                ExecStartPost=/bin/sh -c "umount /mnt"
                [Install]
                WantedBy=multi-user.target
    version: v1.28.9+rke2r1
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3MachineTemplate
metadata:
  name: sample-cluster-controlplane
  namespace: default
spec:
  template:
    spec:
      dataTemplate:
        name: sample-cluster-controlplane-template
      hostSelector:
        matchLabels:
          cluster-role: control-plane
      image:
        checksum: http://imagecache.local:8080/SLE-Micro-eib-output.raw.sha256
        checksumType: sha256
        format: raw
        url: http://imagecache.local:8080/SLE-Micro-eib-output.raw
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3DataTemplate
metadata:
  name: sample-cluster-controlplane-template
  namespace: default
spec:
  clusterName: sample-cluster
  metaData:
    objectNames:
      - key: name
        object: machine
      - key: local-hostname
        object: machine
      - key: local_hostname
        object: machine

复制以上示例并根据您的环境进行修改后,可以通过 kubectl 应用该示例,然后使用 clusterctl 监控群集状态

% kubectl apply -f rke2-control-plane.yaml

# Wait for the cluster to be provisioned - status can be checked via clusterctl
% clusterctl describe cluster sample-cluster
NAME                                                    READY  SEVERITY  REASON  SINCE  MESSAGE
Cluster/sample-cluster                                  True                     22m
├─ClusterInfrastructure - Metal3Cluster/sample-cluster  True                     27m
├─ControlPlane - RKE2ControlPlane/sample-cluster        True                     22m
│ └─Machine/sample-cluster-chflc                        True                     23m

1.3.8 工作/计算节点部署

与部署控制平面时一样,我们需要定义一个 yaml 清单,其中包含以下资源:

  • MachineDeployment 定义副本(主机)的数量和引导/基础架构提供程序(在本例中为 RKE2/Metal3)

  • RKE2ConfigTemplate 描述代理主机引导的 RKE2 版本和首次引导配置

  • Metal3MachineTemplate 定义要应用于 BareMetalHost 资源的操作系统映像,hostSelector 定义要使用的 BareMetalHost

  • Metal3DataTemplate 定义要传递给 BareMetalHost 的附加 metaData(请注意,Edge 解决方案目前不支持 networkData)

apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
  labels:
    cluster.x-k8s.io/cluster-name: sample-cluster
  name: sample-cluster
  namespace: default
spec:
  clusterName: sample-cluster
  replicas: 1
  selector:
    matchLabels:
      cluster.x-k8s.io/cluster-name: sample-cluster
  template:
    metadata:
      labels:
        cluster.x-k8s.io/cluster-name: sample-cluster
    spec:
      bootstrap:
        configRef:
          apiVersion: bootstrap.cluster.x-k8s.io/v1alpha1
          kind: RKE2ConfigTemplate
          name: sample-cluster-workers
      clusterName: sample-cluster
      infrastructureRef:
        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
        kind: Metal3MachineTemplate
        name: sample-cluster-workers
      nodeDrainTimeout: 0s
      version: v1.28.9+rke2r1
---
apiVersion: bootstrap.cluster.x-k8s.io/v1alpha1
kind: RKE2ConfigTemplate
metadata:
  name: sample-cluster-workers
  namespace: default
spec:
  template:
    spec:
      agentConfig:
        format: ignition
        version: v1.28.9+rke2r1
        kubelet:
          extraArgs:
            - provider-id=metal3://BAREMETALHOST_UUID
        additionalUserData:
          config: |
            variant: fcos
            version: 1.4.0
            systemd:
              units:
                - name: rke2-preinstall.service
                  enabled: true
                  contents: |
                    [Unit]
                    Description=rke2-preinstall
                    Wants=network-online.target
                    Before=rke2-install.service
                    ConditionPathExists=!/run/cluster-api/bootstrap-success.complete
                    [Service]
                    Type=oneshot
                    User=root
                    ExecStartPre=/bin/sh -c "mount -L config-2 /mnt"
                    ExecStart=/bin/sh -c "sed -i \"s/BAREMETALHOST_UUID/$(jq -r .uuid /mnt/openstack/latest/meta_data.json)/\" /etc/rancher/rke2/config.yaml"
                    ExecStart=/bin/sh -c "echo \"node-name: $(jq -r .name /mnt/openstack/latest/meta_data.json)\" >> /etc/rancher/rke2/config.yaml"
                    ExecStartPost=/bin/sh -c "umount /mnt"
                    [Install]
                    WantedBy=multi-user.target
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3MachineTemplate
metadata:
  name: sample-cluster-workers
  namespace: default
spec:
  template:
    spec:
      dataTemplate:
        name: sample-cluster-workers-template
      hostSelector:
        matchLabels:
          cluster-role: worker
      image:
        checksum: http://imagecache.local:8080/SLE-Micro-eib-output.raw.sha256
        checksumType: sha256
        format: raw
        url: http://imagecache.local:8080/SLE-Micro-eib-output.raw
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3DataTemplate
metadata:
  name: sample-cluster-workers-template
  namespace: default
spec:
  clusterName: sample-cluster
  metaData:
    objectNames:
      - key: name
        object: machine
      - key: local-hostname
        object: machine
      - key: local_hostname
        object: machine

复制以上示例并根据您的环境进行修改后,可以通过 kubectl 应用该示例,然后使用 clusterctl 监控群集状态

% kubectl apply -f rke2-agent.yaml

# Wait some time for the compute/agent hosts to be provisioned
% clusterctl describe cluster sample-cluster
NAME                                                    READY  SEVERITY  REASON  SINCE  MESSAGE
Cluster/sample-cluster                                  True                     25m
├─ClusterInfrastructure - Metal3Cluster/sample-cluster  True                     30m
├─ControlPlane - RKE2ControlPlane/sample-cluster        True                     25m
│ └─Machine/sample-cluster-chflc                        True                     27m
└─Workers
  └─MachineDeployment/sample-cluster                    True                     22m
    └─Machine/sample-cluster-56df5b4499-zfljj           True                     23m

1.3.9 群集取消置备

可以通过删除上述创建步骤中应用的资源来取消置备下游群集:

% kubectl delete -f rke2-agent.yaml
% kubectl delete -f rke2-control-plane.yaml

这会触发 BareMetalHost 资源的取消置备,此过程可能需要几分钟,之后,这些资源将再次处于可用状态:

% kubectl get bmh
NAME             STATE            CONSUMER                            ONLINE   ERROR   AGE
controlplane-0   deprovisioning   sample-cluster-controlplane-vlrt6   false            10m
worker-0         deprovisioning   sample-cluster-workers-785x5        false            10m

...

% kubectl get bmh
NAME             STATE       CONSUMER   ONLINE   ERROR   AGE
controlplane-0   available              false            15m
worker-0         available              false            15m

1.4 已知问题

  • 上游 IP 地址管理控制器目前不受支持,因为它与我们在 SLEMicro 中选择的网络配置工具和首次引导工具链尚不兼容。

  • 相关的 IPAM 资源和 Metal3DataTemplate networkData 字段目前也不受支持。

  • 目前仅支持通过 redfish-virtualmedia 进行部署。

  • 部署的群集目前不会导入 Rancher

  • 由于禁用了 Rancher 嵌入式 CAPI 控制器,如上所述为 Metal3 配置的管理群集也无法用于其他群集置备方法,例如 Elemental(第 11 章 “Elemental

1.5 计划的更改

  • 我们已计划好将来通过 Rancher Turtles 将部署的群集导入 Rancher

  • 采用与 Rancher Turtles 一致的做法还有望消除禁用 Rancher 嵌入式 CAPI 的要求,因此其他群集方法应该可以通过管理群集来实现。

  • 通过 networkData 字段启用 IPAM 资源和配置支持

1.6 其他资源

ATIP 文档(第 26 章 “SUSE 自适应电信基础架构平台 (ATIP))提供了 Metal3 在电信用例中的更高级用法示例。

1.6.1 单节点配置

对于管理群集是单个节点的测试/PoC 环境,可能不需要通过 MetalLB 管理额外的浮动 IP。

在此模式下,管理群集 API 的端点是管理群集的 IP,因此在使用 DHCP 时应预留该 IP,或者配置静态 IP,以确保管理群集 IP 不会变化 - 在下面显示为 MANAGEMENT_CLUSTER_IP

为了实现此方案,必须如下所示指定 metal3 chart 值:

global:
  ironicIP: <MANAGEMENT_CLUSTER_IP>
metal3-ironic:
  service:
    type: NodePort

1.6.2 对虚拟媒体 ISO 附件禁用 TLS

某些服务器供应商在将虚拟媒体 ISO 映像挂接到 BMC 时会校验 SSL 连接,这可能会导致问题,因为为 Metal3 部署生成的证书是自我签名证书。要解决此问题,可以使用如下所示的 metal3 chart 值仅对虚拟媒体磁盘附件禁用 TLS:

global:
  enable_vmedia_tls: false

另一种解决方法是使用 CA 证书配置 BMC - 在这种情况下,可以使用 kubectl 从群集读取证书:

kubectl get secret -n metal3-system ironic-vmedia-cert -o yaml

然后可以在服务器 BMC 控制台上配置证书,不过,配置过程根据特定的供应商而异(并且不一定适用于所有供应商,如果不适用,可能需要指定 enable_vmedia_tls 标志)。