1 使用 Metal3 实现 BMC 自动化部署 #
Metal3 是一个 CNCF 项目,它为 Kubernetes 提供裸机基础架构管理功能。
Metal3 提供 Kubernetes 原生资源来管理裸机服务器的生命周期,支持通过 Redfish 等带外协议进行管理。
它还为群集 API (CAPI) 提供成熟的支持,允许通过广泛采用的不区分供应商的 API 来管理跨多个基础架构提供商的基础架构资源。
1.1 为何使用此方法 #
此方法非常适合用于目标硬件支持带外管理,并且需要全自动化基础架构管理流程的方案。
管理群集配置为提供声明性 API 来对下游群集裸机服务器进行清单和状态管理,包括自动检查、清理和置备/取消置备。
1.2 概要体系结构 #
1.3 先决条件 #
下游群集服务器硬件和网络相关的限制具体如下所述:
管理群集
必须与目标服务器管理/BMC API 建立网络连接
必须与目标服务器控制平面网络建立网络连接
对于多节点管理群集,需要配置额外的预留 IP 地址
要控制的主机
必须支持通过 Redfish、iDRAC 或 iLO 接口进行带外管理
必须支持通过虚拟媒体进行部署(目前不支持 PXE)
必须与管理群集建立网络连接,以便能够访问 Metal3 置备 API
需要一些工具,可以安装在管理群集上,也可以安装在能够访问管理群集的主机上。
Podman 或 Rancher Desktop 等容器运行时
必须从 SUSE Customer Center 或
SUSE 下载页面下载
SLE-Micro.x86_64-5.5.0-Default-GM.raw.xz
操作系统映像文件。
1.3.1 设置管理群集 #
安装管理群集和使用 Metal3 的基本步骤如下:
安装 RKE2 管理群集
安装 Rancher
安装存储提供程序
安装 Metal3 依赖项
安装 CAPI 依赖项
为下游群集主机构建 SLEMicro 操作系统映像
注册 BareMetalHost CR 以定义裸机清单
通过定义 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 节 “单节点配置”)
首先,我们需要安装 MetalLB:
helm install \ metallb oci://registry.suse.com/edge/metallb-chart \ --namespace metallb-system \ --create-namespace
然后使用定义为
STATIC_IRONIC_IP
(如下所示)的预留 IP 来定义IPAddressPool
和L2Advertisment
: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/metal3-chart \ --namespace metal3-system \ --create-namespace \ --set global.ironicIP="${STATIC_IRONIC_IP}"
大约要经过两分钟,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-system
、capm3-system
、rke2-bootstrap-system
和 rke2-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
是映像定义文件,有关更多细节,请参见第 3 章 “使用 Edge Image Builder 配置独立群集”。下载的基础映像已经过
xz
压缩,必须使用unxz
将其解压缩,并将其复制/移动到base-images
文件夹中。network
文件夹是可选的,有关更多细节,请参见第 1.3.5.1.1 节 “用于静态网络配置的附加脚本”。custom/scripts 目录包含首次引导时运行的脚本;目前需要使用
growfs.sh
脚本来调整部署中的操作系统根分区的大小
├── 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-plane
或worker
bootMACAddress
必须是与主机的控制平面 NIC 匹配的有效 MACbmc
地址是与 BMC 管理 API 的连接,支持以下设置:redfish-virtualmedia://<IP 地址>/redfish/v1/Systems/<系统 ID>
:Redfish 虚拟媒体,例如 SuperMicroidrac-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
标志)。