|Index|SUSE Edge 文档|快速入门|使用 Elemental 进行远程主机注册
Applies to SUSE Edge 3.6

1 使用 Elemental 进行远程主机注册

本节记录了作为 SUSE Edge 一部分的“电话回拨网络配置”解决方案,我们使用 Elemental 来协助节点注册。Elemental 是一个软件栈,支持远程主机注册以及通过 Kubernetes 进行集中的云原生操作系统管理。在 SUSE Edge 栈中,我们使用 Elemental 的注册功能来实现远程主机注册至 Rancher,以便将主机集成到集中式管理平台中,并从那里统一部署和管理 Kubernetes 集群以及分层组件、应用程序及其生命周期。

当您想要控制的设备与管理集群不在同一网络,或者没有板载带外管理控制器以实现更直接的控制,并且您需要在边缘启动许多不同的“未知”系统,同时需要大规模安全地注册和管理它们时,这种方法非常有用。这对于零售、工业物联网或其他您无法控制设备安装所在网络的用例来说,是一种常见场景。

1.1 高级体系结构

quickstart elemental architecture

1.2 所需资源

以下描述了完成此快速入门所需的最低系统和环境要求:

  • 用于集中管理集群的主机(托管 Rancher 和 Elemental 的主机):

    • 开发或测试至少需要 8 GB RAM 和 20 GB 磁盘空间(生产环境请参阅 此处

  • 待配置的目标节点,即边缘设备(可使用虚拟机进行演示或测试)

    • 至少 4GB RAM、2 个 CPU 核心和 20 GB 磁盘

  • 管理集群的可解析主机名,或与 sslip.io 等服务配合使用的静态 IP 地址

  • 用于通过 Edge Image Builder 构建安装介质的主机

    • 运行 SLES 15 SP6、openSUSE Leap 15.6 或其他支持 Podman 的兼容操作系统。

    • 安装 KubectlPodmanHelm

  • 用于引导的 U 盘(如果使用物理硬件)

  • 已下载的最新 SUSE Linux Micro 6.2 SelfInstall ISO 映像副本,可在 此处 找到。

Note
Note

目标机器上现有的数据将在该过程中被覆盖,请确保备份连接到目标部署节点的所有 USB 存储设备和磁盘上的任何数据。

本指南是使用 Digital Ocean droplet 来托管上游群集,并使用 Intel NUC 作为下游设备创建的。构建安装介质时,使用的是 SUSE Linux Enterprise Server。

1.3 构建启动群集

首先创建一个能够托管 Rancher 和 Elemental 的群集。此群集需要能够从下游节点所连接的网络进行路由。

1.3.1 创建 Kubernetes 群集

如果您使用的是超大规模云服务商(例如 Azure、AWS 或 Google Cloud),设置群集的最简单方法是使用其内置工具。为了使本指南保持简洁,我们未详细介绍这些选项的每一个处理。

如果您要安装到裸机或其他需要您自行提供 Kubernetes 发行版的托管服务上,我们建议使用 RKE2

1.3.2 设置 DNS

在继续之前,您需要设置对群集的访问权限。与群集本身的设置一样,配置 DNS 的方式将根据其托管位置而有所不同。

Tip
Tip

如果您不想处理 DNS 记录的设置(例如,这只是一个临时测试服务器),则可以使用像 sslip.io 这样的服务来代替。使用此服务,您可以解析任何带有 <address>.sslip.io 的 IP 地址。

1.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.14.2
Note
Note

如果这旨在作为生产系统,请使用 cert-manager 配置真实证书(例如来自 Let’s Encrypt 的证书)。

浏览到您设置的主机名,并使用您使用的 bootstrapPassword 登录 Rancher。您将通过一个简短的设置过程。

1.5 安装 Elemental

安装 Rancher 后,您现在可以安装 Elemental operator 和所需的 CRD。Elemental 的 Helm chart 作为 OCI 工件发布,因此安装比其他 chart 更简单。 它可以从您安装 Rancher 时使用的同一个 shell 中安装,也可以在浏览器中从 Rancher 的 shell 内安装。

helm install --create-namespace -n cattle-elemental-system \
 elemental-operator-crds \
 oci://registry.suse.com/rancher/elemental-operator-crds-chart \
 --version 1.9.0

helm install -n cattle-elemental-system \
 elemental-operator \
 oci://registry.suse.com/rancher/elemental-operator-chart \
 --version 1.9.0

1.5.1 (可选)安装 Elemental UI 扩展

  1. 要使用 Elemental UI,请登录您的 Rancher 实例,点击左上角的三线菜单:

    安装 Elemental 扩展 1
  2. 在此页面的“Available”选项卡中,点击 Elemental 卡片上的“Install”:

    安装 Elemental 扩展 2
  3. 确认您要安装该扩展:

    安装 Elemental 扩展 3
  4. 安装完成后,系统将提示您重新加载页面。

    安装 Elemental 扩展 4
  5. 重新加载后,您可以通过“操作系统管理”全局 APP 访问 Elemental 扩展。

    访问 Elemental 扩展

1.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
Note
Note

cat 命令使用反斜杠 (\) 转义每个 $,以便 Bash 不会对它们进行模板化处理。如果手动复制,请删除反斜杠。

对象创建完成后,找到并记录分配的端点:

REGISURL=$(kubectl get machineregistration ele-quickstart-nodes -n fleet-default -o jsonpath='{.status.registrationURL}')

或者,也可以通过 UI 完成此操作。

UI 扩展
  1. 在“操作系统管理”扩展中,点击“创建注册端点”:

    点击创建注册
  2. 为此配置命名。

    添加名称
    Note
    Note

    您可以忽略“云配置”字段,因为此处的数据会被后续使用 Edge Image Builder 的步骤覆盖。

  3. 接下来,向下滚动并为您希望在机器注册时创建的资源上的每个标签点击“添加标签”。这对于区分机器非常有用。

    添加标签
  4. 单击“创建”以保存配置。

  5. 创建注册后,您应该会看到列出的注册 URL,并可以单击“复制”来复制该地址:

    复制 URL
    Tip
    Tip

    如果您离开了该屏幕,可以单击左侧菜单中的“注册端点”,然后单击您刚创建的端点名称。

    此 URL 将在下一步中使用。

1.7 构建映像

虽然当前版本的 Elemental 有一种构建其自身安装介质的方法,但在 SUSE Edge 3.6 中,我们改用 Kiwi 和 Edge Image Builder 来执行此操作,因此生成的系统以 SUSE Linux Micro 作为基础操作系统。

Tip
Tip

有关 Kiwi 的更多详细信息,请先按照 Kiwi 映像构建器流程 (Chapter 26, 使用 Kiwi 构建更新的 SUSE Linux Micro 镜像) 构建新映像;对于 Edge Image Builder,请查看 Edge Image Builder 入门指南 (Chapter 2, 使用 Edge Image Builder 的独立集群) 以及 组件文档 (Chapter 8, 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.3
image:
    imageType: iso
    arch: x86_64
    baseImage: SL-Micro.x86_64-6.2-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
Note
Note
  • time 部分是可选的,但强烈建议进行配置,以避免证书和时钟偏差带来的潜在问题。本示例中提供的值仅用于说明目的。请根据您的具体要求进行调整。

  • 未编码的密码为 eib

  • 需要 sccRegistrationCode 才能从官方源下载并安装必要的 RPM(或者,也可以手动旁加载 elemental-registerelemental-system-agent RPM)。

  • cat 命令使用反斜杠 ($) 转义每个 \,以便 Bash 不会对它们进行模板化处理。如果手动复制,请删除反斜杠。

  • 安装设备将在安装过程中被擦除。

podman run --privileged --rm -it -v $ELEM/eib_quickstart/:/eib \
 registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 \
 build --definition-file eib-config.yaml

如果您要引导物理设备,我们需要将映像刻录到 USB U 盘中。可以使用以下方式执行此操作:

sudo dd if=/eib_quickstart/elemental-image.iso of=/dev/<PATH_TO_DISK_DEVICE> status=progress

1.8 引导下游节点

现在我们已经创建了安装媒体,可以使用它来引导下游节点。

对于您想要使用 Elemental 控制的每个系统,请添加安装媒体并引导设备。安装完成后,它将重启并自行注册。

如果您正在使用 UI 扩展,您应该会看到您的节点出现在“Inventory of Machines”中。

Note
Note

在看到登录提示之前,请勿移除安装媒体;在首次启动期间,系统仍会访问 USB U 盘上的文件。

1.9 创建下游集群

使用 Elemental 配置新集群时,我们需要创建两个对象。

  • Linux
  • UI 扩展

第一个是 MachineInventorySelectorTemplate。此对象允许我们指定集群与清单中机器之间的映射。

  1. 创建一个选择器,它将匹配清单中带有标签的任何机器:

    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
  2. 将资源应用到集群:

    kubectl apply -f $ELEM/selector.yaml
  3. 获取机器名称并添加匹配的标签:

    MACHINENAME=$(kubectl get MachineInventory -n fleet-default | awk 'NR>1 {print $1}')
    
    kubectl label MachineInventory -n fleet-default \
     $MACHINENAME locationID=123
  4. 创建一个简单的单节点 K3s 集群资源并将其应用到集群:

    cat << EOF > $ELEM/cluster.yaml
    apiVersion: provisioning.cattle.io/v1
    kind: Cluster
    metadata:
      name: location-123
      namespace: fleet-default
    spec:
      kubernetesVersion: v1.35.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 集群使用您刚刚安装的新节点启动。

1.10 节点重置(可选)

SUSE Rancher Elemental 支持执行“节点重置”的功能,当从 Rancher 中删除整个集群、从集群中删除单个节点或从机器清单中手动删除节点时,可以选择触发该功能。当您想要重置和清理任何孤立资源,并希望自动将清理后的节点带回机器清单以便重复使用时,这非常有用。默认情况下未启用此功能,因此任何被去除的系统都不会被清理(即数据不会被去除,任何 Kubernetes 集群资源将继续在下游集群上运行),并且需要人工干预来擦除数据并通过 Elemental 将机器重新注册到 Rancher。

如果您希望默认启用此功能,则需要确保您的 MachineRegistration 通过添加 config.elemental.reset.enabled: true 明确启用它,例如:

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 触发,因此其执行是立即的。

Warning
Warning

使用 resettable 功能的前提是,从 Rancher 中删除节点/集群时,期望的行为是擦除数据并强制重新注册。在这种情况下肯定会丢失数据,因此只有在确定要执行自动重置时才使用此功能。

1.11 后续步骤

以下是使用本指南后建议研究的一些资源: