2 使用 Elemental 进行远程主机初始配置 #
本章介绍 SUSE Edge 中的“电告总部网络置备”解决方案。我们将使用 Elemental 来协助完成节点初始配置。Elemental 是一个软件堆栈,可用于注册远程主机和通过 Kubernetes 实现集中式云原生操作系统全面管理。在 SUSE Edge 堆栈中,我们将使用 Elemental 的注册功能将远程主机初始配置到 Rancher,以便将主机集成到集中式管理平台,然后从该平台部署和管理 Kubernetes 群集以及分层组件、应用程序及其生命周期,所有这些操作都在一个中心位置完成。
此方法在以下情况下可能很有用:您要控制的设备与上游群集不在同一网络中,或没有带外管理控制器初始配置功能可以进行更直接的控制;您要在边缘处引导许多不同的“未知”系统,并且需要安全地大规模初始配置和管理这些系统。这种情况在以下领域的用例中很常见:零售、工业物联网,或几乎无法通过设备要安装到的网络进行控制的其他领域。
2.1 概要体系结构 #
2.2 所需资源 #
下面说明了学习本快速入门所要满足的最低系统和环境要求:
集中式管理群集的主机(托管 Rancher 和 Elemental 的主机):
至少 8 GB RAM 和 20 GB 磁盘空间,用于开发或测试(对于生产用途,请参见此处)
要置备的目标节点,即边缘设备(可以使用虚拟机进行演示或测试)
至少 4GB RAM、2 个 CPU 核心和 20 GB 磁盘空间
管理群集的可解析主机名,或用于 sslip.io 等服务的静态 IP 地址
用于通过 Edge Image Builder 构建安装媒体的主机
用于引导的 USB 闪存盘(如果使用物理硬件)
在初始配置过程中会重写目标计算机上的现有数据,因此请务必备份挂接到目标部署节点的所有 USB 存储设备和磁盘上的所有数据。
本指南是使用托管上游群集的 Digital Ocean droplet 以及用作下游设备的 Intel NUC 制作的。为了构建安装媒体,我们使用了 SUSE Linux Enterprise Server。
2.3 如何使用 Elemental #
安装和使用 Elemental 的基本步骤如下:
2.3.1 构建引导群集 #
首先创建一个能够托管 Rancher 和 Elemental 的群集。必须可以从下游节点所连接到的网络路由此群集。
2.3.1.1 创建 Kubernetes 群集 #
如果您使用的是超大规模云(例如 Azure、AWS 或 Google Cloud),那么,设置群集的最简单方法是使用这些云的内置工具。为简洁起见,本指南不会详细介绍每种选项的用法过程。
如果您要安装到裸机或其他宿主服务,同时需要提供 Kubernetes 发行版本身,我们建议您使用 RKE2。
2.3.1.2 设置 DNS #
在继续之前,需要设置群集访问权限。与群集本身的设置一样,DNS 的配置方式根据群集的托管位置而异。
如果您不想处理 DNS 记录的设置(例如,这只是一个临时使用的测试服务器),可以改用 sslip.io 之类的服务。通过此服务,可以使用
<address>.sslip.io
解析任何 IP 地址。
2.3.2 安装 Rancher #
要安装 Rancher,需要访问刚刚创建的群集的 Kubernetes API。具体方法取决于使用的 Kubernetes 发行版。
对于 RKE2,kubeconfig 文件会写入
/etc/rancher/rke2/rke2.yaml
。将此文件作为
~/.kube/config
保存在本地系统上。可能需要编辑该文件,以包含正确的外部可路由 IP 地址或主机名。
使用 Rancher 文档中所述的命令轻松安装 Rancher:
安装 cert-manager:
- Linux
- Windows
helm repo add rancher-prime https://charts.rancher.com/server-charts/prime kubectl create namespace cattle-system kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.3/cert-manager.crds.yaml helm repo add jetstack https://charts.jetstack.io helm repo update helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace
然后安装 Rancher 本身:
- Linux
- Windows
helm install rancher rancher-prime/rancher \ --namespace cattle-system \ --set hostname=<DNS or sslip from above> \ --set replicas=1 \ --set bootstrapPassword=<PASSWORD_FOR_RANCHER_ADMIN>
如果目标系统是生产系统,请使用 cert-manager 配置实际证书(例如 Let's Encrypt 提供的证书)。
浏览到您设置的主机名,然后使用您的 bootstrapPassword
登录到
Rancher。系统将指导您完成一个简短的设置过程。
2.3.3 安装 Elemental #
安装 Rancher 后,接下来可以安装 Elemental Operator 和所需的 CRD。Elemental 的 Helm chart 作为 OCI 项目发布,因此其安装过程比其他 chart 略简单一些。可以通过您用来安装 Rancher 的同一外壳安装 Helm chart,也可以在浏览器中通过 Rancher 的外壳安装。
helm install --create-namespace -n cattle-elemental-system \
elemental-operator-crds \
oci://registry.suse.com/rancher/elemental-operator-crds-chart \
--version 1.4.4
helm install --create-namespace -n cattle-elemental-system \
elemental-operator \
oci://registry.suse.com/rancher/elemental-operator-chart \
--version 1.4.4
2.3.3.1 (可选)安装 Elemental UI 扩展 #
2.3.3.2 配置 Elemental #
为方便起见,我们建议将变量 $ELEM
设置为配置目录所在的完整路径:
export ELEM=$HOME/elemental mkdir -p $ELEM
为了能够将计算机注册到 Elemental,我们需要在 fleet-default
名称空间中创建
MachineRegistration
对象。
我们来创建该对象的基本版本:
cat << EOF > $ELEM/registration.yaml apiVersion: elemental.cattle.io/v1beta1 kind: MachineRegistration metadata: name: ele-quickstart-nodes namespace: fleet-default spec: machineName: "\${System Information/Manufacturer}-\${System Information/UUID}" machineInventoryLabels: manufacturer: "\${System Information/Manufacturer}" productName: "\${System Information/Product Name}" EOF kubectl apply -f $ELEM/registration.yaml
cat
命令使用反斜杠 (\
) 将每个
$
符号转义,以免 Bash 将其模板化。如果手动复制命令,请去除反斜杠。
创建该对象后,找到并记下分配的端点:
REGISURL=$(kubectl get machineregistration ele-quickstart-nodes -n fleet-default -o jsonpath='{.status.registrationURL}')
或者,可以在 UI 中执行此操作。
- UI 扩展
- UI 扩展
如果您刚刚创建了配置,则应会看到列出的注册 URL,可以单击“Copy”(复制)来复制该网址:
提示如果您退出了该屏幕,可以单击左侧菜单中的“Registration Endpoints”(注册端点),然后单击刚刚创建的端点的名称。
此 URL 将在下一步骤中使用。
2.3.4 构建安装媒体 #
虽然当前版本的 Elemental 提供了构建其自身安装媒体的方法,但在 SUSE Edge 3.0 中,我们会改用 Edge Image Builder 来构建安装媒体,因此最终构建的系统使用 SLE Micro 作为基础操作系统。
有关 Edge Image Builder 的更多细节,请查看相关入门指南(第 3 章 “使用 Edge Image Builder 配置独立群集”)和组件文档(第 9 章 “Edge Image Builder”)。
在装有 Podman 的 Linux 系统上,运行:
mkdir -p $ELEM/eib_quickstart/base-images
mkdir -p $ELEM/eib_quickstart/elemental
curl $REGISURL -o $ELEM/eib_quickstart/elemental/elemental_config.yaml
cat << EOF > $ELEM/eib_quickstart/eib-config.yaml
apiVersion: 1.0
image:
imageType: iso
arch: x86_64
baseImage: SLE-Micro.x86_64-5.5.0-Default-SelfInstall-GM.install.iso
outputImageName: elemental-image.iso
operatingSystem:
users:
- username: root
encryptedPassword: \$6\$jHugJNNd3HElGsUZ\$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
EOF
未编码的口令是
eib
。cat
命令使用反斜杠 (\
) 将每个$
符号转义,以免 Bash 将其模板化。如果手动复制命令,请去除反斜杠。
podman run --privileged --rm -it -v $ELEM/eib_quickstart/:/eib \
registry.suse.com/edge/edge-image-builder:1.0.2 \
build --definition-file eib-config.yaml
如果要引导物理设备,我们需要将映像刻录到 USB 闪存盘中。为此请使用以下命令:
sudo dd if=/eib_quickstart/elemental-image.iso of=/dev/<PATH_TO_DISK_DEVICE> status=progress
2.3.5 引导下游节点 #
现在我们已创建安装媒体,接下来可以用它来引导下游节点。
对于您要使用 Elemental 控制的每个系统,请添加安装媒体并引导设备。安装后,系统会重引导并自行注册。
如果您正在使用 UI 扩展,则应会看到您的节点出现在“Inventory of Machines”(计算机清单)中。
在出现登录提示之前,请勿移除安装媒体;在首次引导期间,仍需访问 USB 记忆棒上的文件。
2.3.6 创建下游群集 #
使用 Elemental 置备新群集时,需要创建两个对象。
- Linux
- UI 扩展
第一个对象是
MachineInventorySelectorTemplate
。此对象用于指定群集与清单中计算机之间的映射。
创建一个选择器,用于根据标签匹配清单中的任何计算机:
cat << EOF > $ELEM/selector.yaml apiVersion: elemental.cattle.io/v1beta1 kind: MachineInventorySelectorTemplate metadata: name: location-123-selector namespace: fleet-default spec: template: spec: selector: matchLabels: locationID: '123' EOF
将资源应用于群集:
kubectl apply -f $ELEM/selector.yaml
获取计算机名称并添加匹配标签:
MACHINENAME=$(kubectl get MachineInventory -n fleet-default | awk 'NR>1 {print $1}') kubectl label MachineInventory -n fleet-default \ $MACHINENAME locationID=123
创建简单的单节点 K3s 群集资源,并将其应用于群集:
cat << EOF > $ELEM/cluster.yaml apiVersion: provisioning.cattle.io/v1 kind: Cluster metadata: name: location-123 namespace: fleet-default spec: kubernetesVersion: v1.28.9+k3s1 rkeConfig: machinePools: - name: pool1 quantity: 1 etcdRole: true controlPlaneRole: true workerRole: true machineConfigRef: kind: MachineInventorySelectorTemplate name: location-123-selector apiVersion: elemental.cattle.io/v1beta1 EOF kubectl apply -f $ELEM/cluster.yaml
创建这些对象后,您应会看到一个新的 Kubernetes 群集使用刚刚安装的新节点运行。
为了能够更轻松地将系统分组,可以添加一个启动脚本,用于在环境中查找已知在该位置独有的内容。
例如,如果您知道每个位置都有一个唯一的子网,则可以编写一个脚本来查找网络前缀,并为相应的 MachineInventory 添加标签。
通常需要根据您的系统设计自定义此脚本,如下所示:
INET=`ip addr show dev eth0 | grep "inet\ "`
elemental-register --label "network=$INET" \
--label "network=$INET" /oem/registration
2.4 节点重置 #
SUSE Rancher Elemental 支持执行“节点重置”,从 Rancher 中删除整个群集、从群集中删除单个节点或者从计算机清单中手动删除某个节点时,可以选择性地触发该操作。当您想要重置和清理任何孤立资源,并希望自动将清理的节点放回计算机清单以便重复使用时,此功能非常有用。默认未启用此功能,因此不会清理任何已去除的系统(即,不会去除数据,任何 Kubernetes 群集资源将继续在下游群集上运行),并且需要手动干预才能擦除数据,并通过 Elemental 将计算机重新注册到 Rancher。
如果您希望默认启用此功能,则需要通过添加 config.elemental.reset.enabled:
true
,来确保 MachineRegistration
明确启用此功能,例如:
config:
elemental:
registration:
auth: tpm
reset:
enabled: true
然后,所有使用此 MachineRegistration
注册的系统将自动在其配置中收到
elemental.cattle.io/resettable: 'true'
批注。如果您希望在各个节点上手动执行此操作(例如,您的现有 MachineInventory
没有此批注,或者您已部署节点),您可以修改 MachineInventory
并添加
resettable
配置,例如:
apiVersion: elemental.cattle.io/v1beta1
kind: MachineInventory
metadata:
annotations:
elemental.cattle.io/os.unmanaged: 'true'
elemental.cattle.io/resettable: 'true'
在 SUSE Edge 3.0 中,Elemental Operator 会在操作系统上放置一个标记,该标记将自动触发清理过程;它会停止所有
Kubernetes 服务、去除所有永久数据、卸装所有 Kubernetes 服务、清理所有剩余 Kubernetes/Rancher 目录,并通过原始
Elemental MachineRegistration
配置强制重新注册到
Rancher。此过程会自动发生,无需任何手动干预。调用的脚本可以在
/opt/edge/elemental_node_cleanup.sh
中找到,将在放置标记后通过
systemd.path
触发,因此会立即执行。
使用 resettable
功能的假设条件是,从 Rancher
去除节点/群集时的所需行为是擦除数据并强制重新注册。在这种情况下,必然会丢失数据,因此,请仅在您确定要执行自动重置时才使用此功能。
2.5 后续步骤 #
下面是使用本指南后建议阅读的一些资源:
第 6 章 “Fleet” 中的端到端自动化
第 10 章 “边缘网络”中的其他网络配置选项