2 使用 Elemental 进行远程主机接入 #
本章介绍 SUSE Edge 中的“自主回连网络置备”解决方案。我们将使用 Elemental 来协助完成节点接入。Elemental 是一个软件堆栈,可用于注册远程主机和通过 Kubernetes 实现集中式云原生操作系统全面管理。在 SUSE Edge 堆栈中,我们将使用 Elemental 的注册功能将远程主机接入 Rancher,以便将主机集成到集中式管理平台,然后从该平台部署和管理 Kubernetes 群集以及分层组件、应用程序及其生命周期,所有这些操作都在一个中心位置完成。
此方法在以下情况下可能很有用:您要控制的设备与管理群集不在同一网络中,或没有带外管理控制器接入功能可以进行更直接的控制;您要在边缘处引导许多不同的“未知”系统,并且需要安全地大规模接入和管理这些系统。这种情况在以下领域的使用场景中很常见:零售、工业物联网,或几乎无法通过设备要安装到的网络进行控制的其他领域。
2.1 总体体系结构 #
2.2 所需资源 #
下面说明了学习本快速入门所要满足的最低系统和环境要求:
在初始配置过程中会重写目标计算机上的现有数据,因此请务必备份挂接到目标部署节点的所有 USB 存储设备和磁盘上的所有数据。
本指南是使用托管上游群集的 Digital Ocean droplet 以及用作下游设备的 Intel NUC 制作的。为了构建安装媒体,我们使用了 SUSE Linux Enterprise Server。
2.3 构建引导群集 #
首先创建一个能够托管 Rancher 和 Elemental 的群集。必须可以从下游节点所连接到的网络路由此群集。
2.3.1 创建 Kubernetes 群集 #
如果您使用的是超大规模云(例如 Azure、AWS 或 Google Cloud),那么,设置群集的最简单方法是使用这些云的内置工具。为简洁起见,本指南不会详细介绍使用每种选项的操作过程。
如果您要安装到裸机或其他宿主服务,同时需要提供 Kubernetes 发行版本身,我们建议您使用 RKE2。
2.3.2 设置 DNS #
在继续之前,需要设置群集访问权限。与群集本身的设置一样,DNS 的配置方式因群集的托管位置而异。
如果您不想处理 DNS 记录的设置(例如,这只是一个临时使用的测试服务器),可以改用 sslip.io 之类的服务。通过此服务,可以使用
<address>.sslip.io
解析任何 IP 地址。
2.4 安装 Rancher #
要安装 Rancher,需要访问刚刚创建的群集的 Kubernetes API。具体方式因使用的 Kubernetes 发行版而异。
对于 RKE2,kubeconfig 文件会写入
/etc/rancher/rke2/rke2.yaml
。将此文件作为
~/.kube/config
保存在本地系统上。可能需要编辑该文件,以包含正确的外部可路由 IP 地址或主机名。
使用 Rancher 文档中所述的命令轻松安装 Rancher:
安装 cert-manager:
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=true
然后安装 Rancher 本身:
helm repo add rancher-prime https://charts.rancher.com/server-charts/prime
helm repo update
helm install rancher rancher-prime/rancher \
--namespace cattle-system \
--create-namespace \
--set hostname=<DNS or sslip from above> \
--set replicas=1 \
--set bootstrapPassword=<PASSWORD_FOR_RANCHER_ADMIN> \
--version 2.11.2
如果目标系统是生产系统,请使用 cert-manager 配置实际证书(例如 Let's Encrypt 提供的证书)。
浏览到您设置的主机名,然后使用您的 bootstrapPassword
登录到
Rancher。系统将指导您完成一个简短的设置过程。
2.5 安装 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.6.8
helm install -n cattle-elemental-system \
elemental-operator \
oci://registry.suse.com/rancher/elemental-operator-chart \
--version 1.6.8
2.5.1 (可选)安装 Elemental UI 扩展 #
2.6 配置 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 扩展
在“OS Management”(操作系统管理)扩展中,单击“Create Registration Endpoint”(创建注册端点):
为此配置命名。
注意您可以忽略“Cloud Configuration”(云配置)字段,因为此处的数据将被 Edge Image Builder 中的后续步骤覆盖。
接下来,向下滚动并单击“Add Label”(添加标签),为注册计算机时创建的每个资源添加标签。标签可用于区分计算机。
单击“Create”(创建)以保存配置。
创建注册后,您应该就会看到列出的注册 URL,此时可以单击“Copy”(复制)来复制该网址:
提示如果您退出了该屏幕,可以单击左侧菜单中的“Registration Endpoints”(注册端点),然后单击刚刚创建的端点的名称。
此 URL 将在下一步骤中使用。
2.7 构建映像 #
虽然当前版本的 Elemental 提供了构建其自身安装媒体的方法,但在 SUSE Edge 3.3.1 中,我们改用 Kiwi 和 Edge Image Builder 来构建安装媒体,因此最终的系统将使用 SUSE Linux Micro 作为基础操作系统。
有关使用 Kiwi 的详细信息,请先按照 Kiwi 映像构建器流程(第 28 章 “使用 Kiwi 构建更新的 SUSE Linux Micro 映像”)构建全新映像;如要使用 Edge Image Builder,请参见 Edge Image Builder 入门指南(第 3 章 “使用 Edge Image Builder 配置独立群集”)和组件文档(第 11 章 “Edge Image Builder”)。
在安装了 Podman 的 Linux 系统中,创建相应目录并将 Kiwi 所构建的基础映像存放到其中:
mkdir -p $ELEM/eib_quickstart/base-images
cp /path/to/{micro-base-image-iso} $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.2
image:
imageType: iso
arch: x86_64
baseImage: SL-Micro.x86_64-6.1-Base-SelfInstall-GM.install.iso
outputImageName: elemental-image.iso
operatingSystem:
time:
timezone: Europe/London
ntp:
forceWait: true
pools:
- 2.suse.pool.ntp.org
servers:
- 10.0.0.1
- 10.0.0.2
isoConfiguration:
installDevice: /dev/vda
users:
- username: root
encryptedPassword: \$6\$jHugJNNd3HElGsUZ\$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
packages:
sccRegistrationCode: XXX
EOF
虽然
time
部分是可选的,但强烈建议配置该部分,以免出现证书和时钟偏差方面的潜在问题。本示例中提供的值仅作说明之用,请根据您的具体要求相应调整。未编码的口令是
eib
。要从官方来源下载和安装必要的 RPM,则需要配置
sccRegistrationCode
(或者,也可以手动侧载elemental-register
和elemental-system-agent
)cat
命令使用反斜杠 (\
) 将每个$
符号转义,以免 Bash 将其模板化。如果手动复制命令,请去除反斜杠。安装期间将会擦除安装设备。
podman run --privileged --rm -it -v $ELEM/eib_quickstart/:/eib \
registry.suse.com/edge/3.3/edge-image-builder:1.2.1 \
build --definition-file eib-config.yaml
如果要引导物理设备,我们需要将映像刻录到 USB 闪存盘中。为此请使用以下命令:
sudo dd if=/eib_quickstart/elemental-image.iso of=/dev/<PATH_TO_DISK_DEVICE> status=progress
2.8 引导下游节点 #
现在我们已创建安装媒体,接下来可以用它来引导下游节点。
对于您要使用 Elemental 控制的每个系统,请添加安装媒体并引导设备。安装后,系统会重引导并自行注册。
如果您正在使用 UI 扩展,则应会看到您的节点出现在“Inventory of Machines”(计算机清单)中。
在出现登录提示之前,请勿移除安装媒体;在首次引导期间,仍需访问 USB 记忆棒上的文件。
2.9 创建下游群集 #
使用 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.32.4+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 群集使用刚刚安装的新节点运行。
2.10 节点重置(可选) #
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.1 中,Elemental Operator 会在操作系统上设置一个标记,该标记将自动触发清理过程;它会停止所有
Kubernetes 服务、去除所有持久性数据、卸装所有 Kubernetes 服务、清理所有剩余 Kubernetes/Rancher
目录,并通过原始 Elemental MachineRegistration
配置强制重新注册到
Rancher。此过程会自动发生,无需任何手动干预。调用的脚本存放在
/opt/edge/elemental_node_cleanup.sh
中。一旦设置了标记,脚本便会通过
systemd.path
触发,因此会立即执行。
使用 resettable
功能的假设条件是,预期在从 Rancher
去除节点/群集时执行的行为是擦除数据并强制重新注册。在这种情况下,必然会丢失数据,因此,请仅在您确定要执行自动重置时才使用此功能。
2.11 后续步骤 #
下面是使用本指南后建议阅读的一些资源:
第 8 章 “Fleet”中的端到端自动化
第 12 章 “边缘网络”中的其他网络配置选项