1 使用 Metal3 实现 BMC 自动化部署 #
Metal3 是一个 CNCF 项目,它为 Kubernetes 提供裸机基础架构管理功能。
Metal3 提供 Kubernetes 原生资源来管理裸机服务器的生命周期,支持通过 Redfish 等带外协议进行管理。
它还为 Cluster API (CAPI) 提供成熟的支持,允许通过广泛采用的不限供应商的 API 来管理跨多个基础架构提供商的基础架构资源。
1.1 为何使用此方法 #
此方法非常适合用于目标硬件支持带外管理,并且需要全自动化基础架构管理流程的场景。
管理群集配置为提供声明性 API 来对下游群集裸机服务器进行清单和状态管理,包括自动检查、清理和置备/取消置备。
1.2 总体体系结构 #
1.3 先决条件 #
下游群集服务器硬件和网络相关的限制具体如下所述:
- 管理群集 - 必须与目标服务器管理/BMC API 建立网络连接 
- 必须与目标服务器控制平面网络建立网络连接 
- 对于多节点管理群集,需要配置额外的预留 IP 地址 
 
- 要控制的主机 - 必须支持通过 Redfish、iDRAC 或 iLO 接口进行带外管理 
- 必须支持通过虚拟媒体进行部署(目前不支持 PXE) 
- 必须与管理群集建立网络连接,以便能够访问 Metal3 置备 API 
 
需要安装一些工具,可以安装在管理群集上,也可以安装在能够访问管理群集的主机上。
- Podman 或 Rancher Desktop 等容器运行时 
SL-Micro.x86_64-6.0-Base-GM2.raw 操作系统映像文件必须从 SUSE Customer Center 或 SUSE 下载页面下载。
1.3.1 设置管理群集 #
安装管理群集和使用 Metal3 的基本步骤如下:
- 安装 RKE2 管理群集 
- 安装 Rancher 
- 安装存储提供程序 
- 安装 Metal3 依赖项 
- 通过 Rancher Turtles 安装 CAPI 依赖项 
- 为下游群集主机构建 SLEMicro 操作系统映像 
- 注册 BareMetalHost CR 以定义裸机清单 
- 通过定义 CAPI 资源创建下游群集 
本指南假设已安装现有的 RKE2 群集和 Rancher(包括 cert-manager),例如已使用 Edge Image Builder 安装(第 11 章 “Edge Image Builder”)。
1.3.2 安装 Metal3 依赖项 #
必须安装并运行 cert-manager(如果在安装 Rancher 的过程中未安装)。
必须安装持久性存储提供程序。建议使用 SUSE Storage,但对于开发/PoC 环境,也可以使用
local-path-provisioner。以下说明假设已将 StorageClass 标记为默认值,否则需要对
Metal3 chart 进行额外的配置。
需要提供一个额外的 IP,该 IP 由 MetalLB 管理,用于为 Metal3 管理服务提供一致的端点。此 IP 必须是控制平面子网的一部分,并且为静态配置预留(不是任何 DHCP 池的一部分)。
- 首先,我们需要安装 MetalLB: - helm install \ metallb oci://registry.suse.com/edge/3.2/metallb-chart \ --namespace metallb-system \ --create-namespace
- 然后使用预留 IP 来定义 - IPAddressPool和- L2Advertisement(如下方的- STATIC_IRONIC_IP所定义):- 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
- 现在可以安装 Metal3: - helm install \ metal3 oci://registry.suse.com/edge/3.2/metal3-chart \ --namespace metal3-system \ --create-namespace \ --set global.ironicIP="$STATIC_IRONIC_IP"
- 大约要经过两分钟,init 容器才会在此部署中运行,因此请确保所有 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 安装 Cluster API 依赖项 #
Cluster API 依赖项通过 Rancher Turtles Helm chart 管理:
cat > values.yaml <<EOF
rancherTurtles:
  features:
    embedded-capi:
      disabled: true
    rancher-webhook:
      cleanup: true
EOF
helm install \
  rancher-turtles oci://registry.suse.com/edge/3.2/rancher-turtles-chart \
  --namespace rancher-turtles-system \
  --create-namespace \
  -f values.yaml一段时间后,控制器 Pod 应会在
capi-system、capm3-system、rke2-bootstrap-system
和 rke2-control-plane-system 名称空间中运行。
1.3.4 准备下游群集映像 #
Edge Image Builder(第 11 章 “Edge Image Builder”)用于准备经过修改、将置备到下游群集主机上的 SLEMicro 基础映像。
本指南介绍部署下游群集所需的最低限度配置。
1.3.4.1 映像配置 #
运行 Edge Image Builder 时,将从主机挂载一个目录,因此需要创建一个目录结构来存储用于定义目标映像的配置文件。
- downstream-cluster-config.yaml是映像定义文件,有关详细信息,请参见第 3 章 “使用 Edge Image Builder 配置独立群集”。
- 下载的基础映像已经过 - xz压缩,必须使用- unxz将其解压缩,并将其复制/移动到- base-images文件夹中。
- network文件夹是可选的,有关详细信息,请参见第 1.3.5.1.1 节 “用于静态网络配置的附加脚本”。
- custom/scripts 目录包含首次引导时运行的脚本;目前需要使用 - 01-fix-growfs.sh脚本来调整部署中的操作系统根分区的大小
├── downstream-cluster-config.yaml
├── base-images/
│   └ SL-Micro.x86_64-6.0-Base-GM2.raw
├── network/
|   └ configure-network.sh
└── custom/
    └ scripts/
        └ 01-fix-growfs.sh1.3.4.1.1 下游群集映像定义文件 #
downstream-cluster-config.yaml 文件是下游群集映像的主配置文件。下面是通过
Metal3 进行部署的极简示例:
apiVersion: 1.1
image:
  imageType: raw
  arch: x86_64
  baseImage: SL-Micro.x86_64-6.0-Base-GM2.raw
  outputImageName: SLE-Micro-eib-output.raw
operatingSystem:
  time:
    timezone: Europe/London
    ntp:
      forceWait: true
      pools:
        - 2.suse.pool.ntp.org
      servers:
        - 10.0.0.1
        - 10.0.0.2
  kernelArgs:
    - ignition.platform.id=openstack
    - net.ifnames=1
  systemd:
    disable:
      - rebootmgr
      - transactional-update.timer
      - transactional-update-cleanup.timer
  users:
    - username: root
      encryptedPassword: $ROOT_PASSWORD
      sshKeys:
      - $USERKEY1
  packages:
    packageList:
      - jq
  sccRegistrationCode: $SCC_REGISTRATION_CODE其中 $SCC_REGISTRATION_CODE 是从 SUSE Customer Center
中复制的注册代码,并且软件包列表包含必需的 jq。
$ROOT_PASSWORD 是 root 用户的已加密口令,可用于测试/调试目的。可以使用
openssl passwd-6 PASSWORD 命令生成此口令
对于生产环境,建议使用可添加到 users 块的 SSH 密钥(需将 $USERKEY1 替换为实际 SSH
密钥)。
net.ifnames=1 会启用可预测网络接口命名
这与 Metal3 chart 的默认配置相匹配,但设置必须与配置的 chart
predictableNicNames 值相匹配。
另请注意,ignition.platform.id=openstack 是必需的,如果不指定此参数,在
Metal3 自动化流程中通过 ignition 进行 SUSE Linux Micro
配置将会失败。
虽然 time
部分是可选的,但强烈建议配置该部分,以免出现证书和时钟偏差方面的潜在问题。本示例中提供的值仅作说明之用,请根据您的具体要求相应调整。
1.3.4.1.2 Growfs 脚本 #
目前,在置备后首次引导时,需要使用一个自定义脚本
(custom/scripts/01-fix-growfs.sh)
来增大文件系统,使之与磁盘大小匹配。01-fix-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 /1.3.4.2 映像创建 #
按照前面的章节准备好目录结构后,运行以下命令来构建映像:
podman run --rm --privileged -it -v $PWD:/eib \
 registry.suse.com/edge/3.2/edge-image-builder:1.1.1 \
 build --definition-file downstream-cluster-config.yaml这会根据上述定义创建名为 SLE-Micro-eib-output.raw 的输出映像文件。
然后必须通过 Web 服务器提供输出映像,该服务器可以是通过 Metal3 chart 启用的媒体服务器容器(注意),也可以是其他某个本地可访问的服务器。在下面的示例中,此服务器是
imagecache.local:8080
将 EIB 映像部署到下游群集时,还需要在 Metal3MachineTemplate 对象中包含该映像的
sha256 校验和。可通过以下方式生成该校验和:
sha256sum <image_file> > <image_file>.sha256
# On this example:
sha256sum SLE-Micro-eib-output.raw > SLE-Micro-eib-output.raw.sha2561.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-plane或- worker
- 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/')
echo "${DESIRED_HOSTNAME}" > /etc/hostname
mkdir -p /tmp/nmc/{desired,generated}
cp ${NETWORK_DATA_FILE} /tmp/nmc/desired/_all.yaml
umount /mnt
./nmc generate --config-dir /tmp/nmc/desired --output-dir /tmp/nmc/generated
./nmc apply --config-dir /tmp/nmc/generated1.3.5.1.2 包含主机网络配置的附加机密 #
可为每个主机定义一个附加机密,其中包含采用 NM Configurator(第 12 章 “边缘网络”)所支持的 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 example1.3.5.2 BareMetalHost 准备 #
按照上述步骤创建 BareMetalHost 资源和关联的机密后,将触发主机准备工作流程:
- 通过将虚拟媒体挂接到目标主机 BMC,引导内存盘映像 
- 内存盘会检查硬件细节,并为主机做好置备准备(例如,清理磁盘中的旧数据) 
- 完成此过程后,BareMetalHost - status.hardware字段中的硬件细节将会更新并可供验证
此过程可能需要几分钟时间,但完成后,您应该会看到 BareMetalHost 状态变为 available:
% kubectl get baremetalhost
NAME             STATE       CONSUMER   ONLINE   ERROR   AGE
controlplane-0   available              true             9m44s
worker-0         available              true             9m44s1.3.6 创建下游群集 #
现在创建用于定义下游群集的 Cluster API 资源,以及创建计算机资源,后者会导致置备 BareMetalHost 资源,然后引导这些资源以形成 RKE2 群集。
1.3.7 控制平面部署 #
为了部署控制平面,我们需要定义一个如下所示的 yaml 清单,其中包含以下资源:
- 群集资源定义群集名称、网络和控制平面/基础架构提供程序的类型(在本例中为 RKE2/Metal3) 
- Metal3Cluster 定义控制平面端点(单节点群集的主机 IP,多节点群集的负载平衡器端点,本示例假设使用单节点群集) 
- RKE2ControlPlane 定义 RKE2 版本,以及群集引导期间所需的任何其他配置 
- Metal3MachineTemplate 定义要应用于 BareMetalHost 资源的操作系统映像,hostSelector 定义要使用的 BareMetalHost 
- Metal3DataTemplate 定义要传递给 BareMetalHost 的其他元数据(请注意,Edge 解决方案目前不支持 networkData) 
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/v1beta1
    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/v1beta1
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
  version: v1.31.7+rke2r1
  rolloutStrategy:
    type: "RollingUpdate"
    rollingUpdate:
      maxSurge: 0
  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
---
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
% 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                     23m1.3.8 工作/计算节点部署 #
与部署控制平面时一样,我们需要定义一个 YAML 清单,其中包含以下资源:
- MachineDeployment 定义复本(主机)数量和引导/基础架构提供程序(在本例中为 RKE2/Metal3) 
- RKE2ConfigTemplate 描述代理主机引导的 RKE2 版本和首次引导配置 
- Metal3MachineTemplate 定义要应用于 BareMetalHost 资源的操作系统映像,主机选择器定义要使用的 BareMetalHost 
- Metal3DataTemplate 定义要传递给 BareMetalHost 的其他元数据(请注意,目前不支持 - 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.31.7+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.31.7+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 for the worker nodes 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                     23m1.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            15m1.4 已知问题 #
- 目前不支持上游 IP 地址管理控制器,因为它与我们在 SLEMicro 中选择的网络配置工具和首次引导工具链尚不兼容。 
- 此外,也不支持相关的 IPAM 资源和 Metal3DataTemplate networkData 字段。 
- 目前仅支持通过 redfish-virtualmedia 进行部署。 
1.5 计划的更改 #
- 通过 networkData 字段启用 IPAM 资源和配置支持 
1.6 其他资源 #
SUSE Edge for Telco 文档(第 36 章 “SUSE Edge for Telco”)提供了 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: NodePort1.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 标志)。