documentation.suse.com / SUSE Edge 文档 / SUSE Telco Cloud 文档 / 设置管理群集

41 设置管理群集

41.1 简介

管理群集是 SUSE Telco Cloud 的组成部分,用于管理运行时堆栈置备和生命周期。从技术角度而言,管理群集包含以下组件:

  • SUSE Linux Micro(操作系统),可以根据使用场景自定义某些配置,例如网络、存储、用户和内核参数。

  • RKE2(Kubernetes 群集),可以根据使用场景将其配置为使用特定的 CNI 插件,例如 MultusCiliumCalico 等。

  • Rancher(管理平台),用于管理群集的生命周期。

  • Metal3,该组件用于管理裸机节点的生命周期。

  • CAPI,该组件用于管理 Kubernetes 群集(下游群集)的生命周期。RKE2 CAPI 提供程序也用于管理 RKE2 群集的生命周期。

通过上述所有组件,管理群集可以管理下游群集的生命周期,并使用声明式方法来管理基础架构和应用程序。

注意
注意

有关 SUSE Linux Micro 的详细信息,请参见第 9 章 “SUSE Linux Micro

有关 RKE2 的详细信息,请参见第 16 章 “RKE2

有关 Rancher 的详细信息,请参见第 5 章 “Rancher

有关 Metal3 的详细信息,请参见第 10 章 “Metal3

41.2 设置管理群集的步骤

需要执行以下步骤来设置管理群集(使用单个节点):

ATIP 产品管理群集 1

使用声明式方法设置管理群集需要执行以下主要步骤:

  1. 为联网环境准备映像(第 41.3 节 “为联网环境准备映像”:第一步是准备包含所有必要配置的清单和文件,以便在联网环境中使用。

    • 联网环境的目录结构(第 41.3.1 节 “目录结构”):此步骤创建一个目录结构,供 Edge Image Builder 用来存储配置文件和映像本身。

    • 管理群集定义文件(第 41.3.2 节 “管理群集定义文件”):mgmt-cluster.yaml 文件是管理群集的主定义文件。其中包含有关所要创建的映像的以下信息:

      • 映像信息:与要使用基础映像创建的映像相关的信息。

      • 操作系统:要在映像中使用的操作系统配置。

      • Kubernetes:要在群集中使用的 Helm chart 和储存库、Kubernetes 版本、网络配置以及节点。

    • Custom 文件夹(第 41.3.3 节 “Custom 文件夹”):custom 文件夹包含的配置文件和脚本供 Edge Image Builder 用来部署功能完备的管理群集。

      • Files 文件夹:包含管理群集要使用的配置文件。

      • Scripts 文件夹:包含管理群集要使用的脚本。

    • Kubernetes 文件夹(第 41.3.4 节 “Kubernetes 文件夹”):kubernetes 文件夹包含管理群集要使用的配置文件。

      • Manifests 文件夹:包含管理群集要使用的清单。

      • Helm:包含管理群集要使用的 Helm 值文件。

      • Config 文件夹:包含管理群集要使用的配置文件。

    • Network 文件夹(第 41.3.5 节 “Network 文件夹”):network 文件夹包含管理群集节点要使用的网络配置文件。

  2. 为隔离环境准备映像(第 41.4 节 “为隔离环境准备映像”:此步骤将说明与非隔离场景相比,准备要在隔离场景中使用的清单和文件有哪些差别。

  3. 创建映像(第 41.5 节 “映像创建”:此步骤使用 Edge Image Builder 工具创建映像(适用于联网场景和隔离场景)。在系统上运行 Edge Image Builder 工具之前,请先检查先决条件(第 11 章 “Edge Image Builder)。

  4. 置备管理群集(第 41.6 节 “置备管理群集”:此步骤使用上一步中创建的映像来置备管理群集(适用于联网场景和隔离场景)。可以使用便携式计算机、服务器、VM 或任何其他带有 USB 端口的 AMD64/Intel 64 系统来执行此步骤。

注意
注意

有关 Edge Image Builder 的详细信息,请参见 Edge Image Builder(第 11 章 “Edge Image Builder)和 Edge Image Builder 快速入门(第 3 章 “使用 Edge Image Builder 配置独立群集)。

41.3 为联网环境准备映像

Edge Image Builder 用于为管理群集创建映像,在本文档中,我们将介绍设置管理群集所需的最低配置。

Edge Image Builder 在容器内运行,因此需要 PodmanRancher Desktop 等容器运行时。在本指南中,我们假设 Podman 可用。

此外,作为部署高可用性管理群集的先决条件,您需要在网络中预留三个 IP 地址:

  • apiVIP,表示 API VIP 地址(用于访问 Kubernetes API 服务器)。

  • ingressVIP,表示入口 VIP 地址(例如,供 Rancher UI 使用)。

  • metal3VIP,表示 Metal3 VIP 地址。

41.3.1 目录结构

运行 EIB 时,将从主机挂载一个目录,因此首先需要创建一个目录结构,供 EIB 用来存储配置文件和映像本身。此目录的结构如下:

eib
├── mgmt-cluster.yaml
├── network
│ └── mgmt-cluster-node1.yaml
├── os-files
│ └── var
│   └── lib
│     └── rancher
│       └── rke2
│         └── server
│           └── manifests
│             └── rke2-ingress-config.yaml
├── kubernetes
│ ├── manifests
│ │ ├── neuvector-namespace.yaml
│ │ ├── ingress-l2-adv.yaml
│ │ └── ingress-ippool.yaml
│ ├── helm
│ │ └── values
│ │     ├── rancher.yaml
│ │     ├── neuvector.yaml
│ │     ├── longhorn.yaml
│ │     ├── metal3.yaml
│ │     └── certmanager.yaml
│ └── config
│     └── server.yaml
├── custom
│ ├── scripts
│ │ ├── 99-register.sh
│ │ ├── 99-mgmt-setup.sh
│ │ └── 99-alias.sh
│ └── files
│     ├── rancher.sh
│     ├── mgmt-stack-setup.service
│     ├── metal3.sh
│     └── basic-setup.sh
└── base-images
注意
注意

必须从 SUSE Customer CenterSUSE 下载页面下载 SL-Micro.x86_64-6.1-Base-SelfInstall-GM.install.iso 映像,并且必须将其存放在 base-images 文件夹下。

应检查该映像的 SHA256 校验和,确保它未遭篡改。可以在映像所下载到的位置找到校验和。

可以在 SUSE Edge GitHub 代码库中的“telco-examples”文件夹下找到目录结构的示例。

41.3.2 管理群集定义文件

mgmt-cluster.yaml 文件是管理群集的主定义文件。其中包含以下信息:

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: SL-Micro.x86_64-6.1-Base-SelfInstall-GM.install.iso
  outputImageName: eib-mgmt-cluster-image.iso
operatingSystem:
  isoConfiguration:
    installDevice: /dev/sda
  users:
  - username: root
    encryptedPassword: $ROOT_PASSWORD
  packages:
    packageList:
    - jq
    - open-iscsi
    sccRegistrationCode: $SCC_REGISTRATION_CODE
kubernetes:
  version: v1.33.3+rke2r1
  helm:
    charts:
      - name: cert-manager
        repositoryName: jetstack
        version: 1.18.2
        targetNamespace: cert-manager
        valuesFile: certmanager.yaml
        createNamespace: true
        installationNamespace: kube-system
      - name: longhorn-crd
        version: 107.0.0+up1.9.1
        repositoryName: rancher-charts
        targetNamespace: longhorn-system
        createNamespace: true
        installationNamespace: kube-system
      - name: longhorn
        version: 107.0.0+up1.9.1
        repositoryName: rancher-charts
        targetNamespace: longhorn-system
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: longhorn.yaml
      - name: metal3
        version: 304.0.16+up0.12.6
        repositoryName: suse-edge-charts
        targetNamespace: metal3-system
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: metal3.yaml
      - name: rancher-turtles
        version: 304.0.6+up0.24.0
        repositoryName: suse-edge-charts
        targetNamespace: rancher-turtles-system
        createNamespace: true
        installationNamespace: kube-system
      - name: neuvector-crd
        version: 107.0.0+up2.8.7
        repositoryName: rancher-charts
        targetNamespace: neuvector
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: neuvector.yaml
      - name: neuvector
        version: 107.0.0+up2.8.7
        repositoryName: rancher-charts
        targetNamespace: neuvector
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: neuvector.yaml
      - name: rancher
        version: 2.12.1
        repositoryName: rancher-prime
        targetNamespace: cattle-system
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: rancher.yaml
    repositories:
      - name: jetstack
        url: https://charts.jetstack.io
      - name: rancher-charts
        url: https://charts.rancher.io/
      - name: suse-edge-charts
        url: oci://registry.suse.com/edge/charts
      - name: rancher-prime
        url: https://charts.rancher.com/server-charts/prime
  network:
    apiHost: $API_HOST
    apiVIP: $API_VIP
  nodes:
    - hostname: mgmt-cluster-node1
      initializer: true
      type: server
#   - hostname: mgmt-cluster-node2
#     type: server
#   - hostname: mgmt-cluster-node3
#     type: server

为了解释 mgmt-cluster.yaml 定义文件中的字段和值,我们将此文件划分成了以下几个部分。

  • 映像部分(定义文件):

image:
  imageType: iso
  arch: x86_64
  baseImage: SL-Micro.x86_64-6.1-Base-SelfInstall-GM.install.iso
  outputImageName: eib-mgmt-cluster-image.iso

其中 baseImage 是从 SUSE Customer Center 或 SUSE 下载页面下载的原始映像。outputImageName 是将用于置备管理群集的新映像的名称。

  • 操作系统部分(定义文件):

operatingSystem:
  isoConfiguration:
    installDevice: /dev/sda
  users:
  - username: root
    encryptedPassword: $ROOT_PASSWORD
  packages:
    packageList:
    - jq
    sccRegistrationCode: $SCC_REGISTRATION_CODE

其中 installDevice 是用于安装操作系统的设备,usernameencryptedPassword 是用于访问系统的身份凭证,packageList 是要安装的软件包列表(在安装过程中,需要在内部使用 jq),sccRegistrationCode 是在构建时用于获取软件包和依赖项的注册代码,可从 SUSE Customer Center 获取。可以如下所示使用 openssl 命令生成加密的口令:

openssl passwd -6 MyPassword!123

此命令会输出如下所示的内容:

$6$UrXB1sAGs46DOiSq$HSwi9GFJLCorm0J53nF2Sq8YEoyINhHcObHzX2R8h13mswUIsMwzx4eUzn/rRx0QPV4JIb0eWCoNrxGiKH4R31
  • Kubernetes 部分(定义文件):

kubernetes:
  version: v1.33.3+rke2r1
  helm:
    charts:
      - name: cert-manager
        repositoryName: jetstack
        version: 1.18.2
        targetNamespace: cert-manager
        valuesFile: certmanager.yaml
        createNamespace: true
        installationNamespace: kube-system
      - name: longhorn-crd
        version: 107.0.0+up1.9.1
        repositoryName: rancher-charts
        targetNamespace: longhorn-system
        createNamespace: true
        installationNamespace: kube-system
      - name: longhorn
        version: 107.0.0+up1.9.1
        repositoryName: rancher-charts
        targetNamespace: longhorn-system
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: longhorn.yaml
      - name: metal3
        version: 304.0.16+up0.12.6
        repositoryName: suse-edge-charts
        targetNamespace: metal3-system
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: metal3.yaml
      - name: rancher-turtles
        version: 304.0.6+up0.24.0
        repositoryName: suse-edge-charts
        targetNamespace: rancher-turtles-system
        createNamespace: true
        installationNamespace: kube-system
      - name: neuvector-crd
        version: 107.0.0+up2.8.7
        repositoryName: rancher-charts
        targetNamespace: neuvector
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: neuvector.yaml
      - name: neuvector
        version: 107.0.0+up2.8.7
        repositoryName: rancher-charts
        targetNamespace: neuvector
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: neuvector.yaml
      - name: rancher
        version: 2.12.1
        repositoryName: rancher-prime
        targetNamespace: cattle-system
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: rancher.yaml
    repositories:
      - name: jetstack
        url: https://charts.jetstack.io
      - name: rancher-charts
        url: https://charts.rancher.io/
      - name: suse-edge-charts
        url: oci://registry.suse.com/edge/charts
      - name: rancher-prime
        url: https://charts.rancher.com/server-charts/prime
    network:
      apiHost: $API_HOST
      apiVIP: $API_VIP
    nodes:
    - hostname: mgmt-cluster-node1
      initializer: true
      type: server
#   - hostname: mgmt-cluster-node2
#     type: server
#   - hostname: mgmt-cluster-node3
#     type: server

helm 部分包含要安装的 Helm chart 列表、要使用的储存库,以及所有 chart 和储存库的版本配置。

network 部分包含 RKE2 组件要使用的网络配置,例如 apiHostapiVIPapiVIP 必须是网络中未使用的 IP 地址,并且不属于 DHCP 池(如果使用 DHCP)。此外,如果我们在多节点群集中使用 apiVIP,apiVIP 将用于访问 Kubernetes API 服务器。apiHostRKE2 组件要使用的 apiVIP 的名称解析。

nodes 部分包含群集中要使用的节点列表。本示例使用的是单节点群集,但可通过在列表中添加更多节点(取消注释相应行)将其扩展为多节点群集。

注意
注意
  • 节点名称在群集中必须保持唯一。

  • 可以选择使用 initializer 字段指定引导主机,如果不指定,列表中的第一个节点将会是引导主机。

  • 需要网络配置时,节点名称必须与“Network”文件夹(第 41.3.5 节 “Network 文件夹”)中定义的主机名相同。

41.3.3 Custom 文件夹

custom 文件夹包含以下子文件夹:

...
├── custom
│ ├── scripts
│ │ ├── 99-register.sh
│ │ ├── 99-mgmt-setup.sh
│ │ └── 99-alias.sh
│ └── files
│     ├── rancher.sh
│     ├── mgmt-stack-setup.service
│     ├── metal3.sh
│     └── basic-setup.sh
...
  • custom/files 文件夹包含管理群集要使用的配置文件。

  • custom/scripts 文件夹包含管理群集要使用的脚本。

custom/files 文件夹包含以下文件:

  • basic-setup.sh:包含 Metal3RancherMetalLB 的配置参数。仅当您要更改要使用的名称空间时,才需修改此文件。

    #!/bin/bash
    # Pre-requisites. Cluster already running
    export KUBECTL="/var/lib/rancher/rke2/bin/kubectl"
    export KUBECONFIG="/etc/rancher/rke2/rke2.yaml"
    
    ##################
    # METAL3 DETAILS #
    ##################
    export METAL3_CHART_TARGETNAMESPACE="metal3-system"
    
    ###########
    # METALLB #
    ###########
    export METALLBNAMESPACE="metallb-system"
    
    ###########
    # RANCHER #
    ###########
    export RANCHER_CHART_TARGETNAMESPACE="cattle-system"
    export RANCHER_FINALPASSWORD="adminadminadmin"
    
    die(){
      echo ${1} 1>&2
      exit ${2}
    }
  • metal3.sh:包含要使用的 Metal3 组件的配置(无需修改)。在将来的版本中将替换此脚本,以改用 Rancher Turtles 来简化配置。

    #!/bin/bash
    set -euo pipefail
    
    BASEDIR="$(dirname "$0")"
    source ${BASEDIR}/basic-setup.sh
    
    METAL3LOCKNAMESPACE="default"
    METAL3LOCKCMNAME="metal3-lock"
    
    trap 'catch $? $LINENO' EXIT
    
    catch() {
      if [ "$1" != "0" ]; then
        echo "Error $1 occurred on $2"
        ${KUBECTL} delete configmap ${METAL3LOCKCMNAME} -n ${METAL3LOCKNAMESPACE}
      fi
    }
    
    # Get or create the lock to run all those steps just in a single node
    # As the first node is created WAY before the others, this should be enough
    # TODO: Investigate if leases is better
    if [ $(${KUBECTL} get cm -n ${METAL3LOCKNAMESPACE} ${METAL3LOCKCMNAME} -o name | wc -l) -lt 1 ]; then
      ${KUBECTL} create configmap ${METAL3LOCKCMNAME} -n ${METAL3LOCKNAMESPACE} --from-literal foo=bar
    else
      exit 0
    fi
    
    # Wait for metal3
    while ! ${KUBECTL} wait --for condition=ready -n ${METAL3_CHART_TARGETNAMESPACE} $(${KUBECTL} get pods -n ${METAL3_CHART_TARGETNAMESPACE} -l app.kubernetes.io/name=metal3-ironic -o name) --timeout=10s; do sleep 2 ; done
    
    # Get the ironic IP
    IRONICIP=$(${KUBECTL} get cm -n ${METAL3_CHART_TARGETNAMESPACE} ironic -o jsonpath='{.data.IRONIC_IP}')
    
    # If LoadBalancer, use metallb, else it is NodePort
    if [ $(${KUBECTL} get svc -n ${METAL3_CHART_TARGETNAMESPACE} metal3-metal3-ironic -o jsonpath='{.spec.type}') == "LoadBalancer" ]; then
      # Wait for metallb
      while ! ${KUBECTL} wait --for condition=ready -n ${METALLBNAMESPACE} $(${KUBECTL} get pods -n ${METALLBNAMESPACE} -l app.kubernetes.io/component=controller -o name) --timeout=10s; do sleep 2 ; done
    
      # Do not create the ippool if already created
      ${KUBECTL} get ipaddresspool -n ${METALLBNAMESPACE} ironic-ip-pool -o name || cat <<-EOF | ${KUBECTL} apply -f -
      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        name: ironic-ip-pool
        namespace: ${METALLBNAMESPACE}
      spec:
        addresses:
        - ${IRONICIP}/32
        serviceAllocation:
          priority: 100
          serviceSelectors:
          - matchExpressions:
            - {key: app.kubernetes.io/name, operator: In, values: [metal3-ironic]}
            EOF
    
      # Same for L2 Advs
      ${KUBECTL} get L2Advertisement -n ${METALLBNAMESPACE} ironic-ip-pool-l2-adv -o name || cat <<-EOF | ${KUBECTL} apply -f -
      apiVersion: metallb.io/v1beta1
      kind: L2Advertisement
      metadata:
        name: ironic-ip-pool-l2-adv
        namespace: ${METALLBNAMESPACE}
      spec:
        ipAddressPools:
        - ironic-ip-pool
            EOF
    fi
    
    # If rancher is deployed
    if [ $(${KUBECTL} get pods -n ${RANCHER_CHART_TARGETNAMESPACE} -l app=rancher -o name | wc -l) -ge 1 ]; then
      cat <<-EOF | ${KUBECTL} apply -f -
            apiVersion: management.cattle.io/v3
            kind: Feature
            metadata:
              name: embedded-cluster-api
            spec:
              value: false
            EOF
    
      # Disable Rancher webhooks for CAPI
      ${KUBECTL} delete --ignore-not-found=true mutatingwebhookconfiguration.admissionregistration.k8s.io mutating-webhook-configuration
      ${KUBECTL} delete --ignore-not-found=true validatingwebhookconfigurations.admissionregistration.k8s.io validating-webhook-configuration
      ${KUBECTL} wait --for=delete namespace/cattle-provisioning-capi-system --timeout=300s
    fi
    
    # Clean up the lock cm
    
    ${KUBECTL} delete configmap ${METAL3LOCKCMNAME} -n ${METAL3LOCKNAMESPACE}
    • rancher.sh:包含要使用的 Rancher 组件的配置(无需修改)。

      #!/bin/bash
      set -euo pipefail
      
      BASEDIR="$(dirname "$0")"
      source ${BASEDIR}/basic-setup.sh
      
      RANCHERLOCKNAMESPACE="default"
      RANCHERLOCKCMNAME="rancher-lock"
      
      if [ -z "${RANCHER_FINALPASSWORD}" ]; then
        # If there is no final password, then finish the setup right away
        exit 0
      fi
      
      trap 'catch $? $LINENO' EXIT
      
      catch() {
        if [ "$1" != "0" ]; then
          echo "Error $1 occurred on $2"
          ${KUBECTL} delete configmap ${RANCHERLOCKCMNAME} -n ${RANCHERLOCKNAMESPACE}
        fi
      }
      
      # Get or create the lock to run all those steps just in a single node
      # As the first node is created WAY before the others, this should be enough
      # TODO: Investigate if leases is better
      if [ $(${KUBECTL} get cm -n ${RANCHERLOCKNAMESPACE} ${RANCHERLOCKCMNAME} -o name | wc -l) -lt 1 ]; then
        ${KUBECTL} create configmap ${RANCHERLOCKCMNAME} -n ${RANCHERLOCKNAMESPACE} --from-literal foo=bar
      else
        exit 0
      fi
      
      # Wait for rancher to be deployed
      while ! ${KUBECTL} wait --for condition=ready -n ${RANCHER_CHART_TARGETNAMESPACE} $(${KUBECTL} get pods -n ${RANCHER_CHART_TARGETNAMESPACE} -l app=rancher -o name) --timeout=10s; do sleep 2 ; done
      until ${KUBECTL} get ingress -n ${RANCHER_CHART_TARGETNAMESPACE} rancher > /dev/null 2>&1; do sleep 10; done
      
      RANCHERBOOTSTRAPPASSWORD=$(${KUBECTL} get secret -n ${RANCHER_CHART_TARGETNAMESPACE} bootstrap-secret -o jsonpath='{.data.bootstrapPassword}' | base64 -d)
      RANCHERHOSTNAME=$(${KUBECTL} get ingress -n ${RANCHER_CHART_TARGETNAMESPACE} rancher -o jsonpath='{.spec.rules[0].host}')
      
      # Skip the whole process if things have been set already
      if [ -z $(${KUBECTL} get settings.management.cattle.io first-login -ojsonpath='{.value}') ]; then
        # Add the protocol
        RANCHERHOSTNAME="https://${RANCHERHOSTNAME}"
        TOKEN=""
        while [ -z "${TOKEN}" ]; do
          # Get token
          sleep 2
          TOKEN=$(curl -sk -X POST ${RANCHERHOSTNAME}/v3-public/localProviders/local?action=login -H 'content-type: application/json' -d "{\"username\":\"admin\",\"password\":\"${RANCHERBOOTSTRAPPASSWORD}\"}" | jq -r .token)
        done
      
        # Set password
        curl -sk ${RANCHERHOSTNAME}/v3/users?action=changepassword -H 'content-type: application/json' -H "Authorization: Bearer $TOKEN" -d "{\"currentPassword\":\"${RANCHERBOOTSTRAPPASSWORD}\",\"newPassword\":\"${RANCHER_FINALPASSWORD}\"}"
      
        # Create a temporary API token (ttl=60 minutes)
        APITOKEN=$(curl -sk ${RANCHERHOSTNAME}/v3/token -H 'content-type: application/json' -H "Authorization: Bearer ${TOKEN}" -d '{"type":"token","description":"automation","ttl":3600000}' | jq -r .token)
      
        curl -sk ${RANCHERHOSTNAME}/v3/settings/server-url -H 'content-type: application/json' -H "Authorization: Bearer ${APITOKEN}" -X PUT -d "{\"name\":\"server-url\",\"value\":\"${RANCHERHOSTNAME}\"}"
        curl -sk ${RANCHERHOSTNAME}/v3/settings/telemetry-opt -X PUT -H 'content-type: application/json' -H 'accept: application/json' -H "Authorization: Bearer ${APITOKEN}" -d '{"value":"out"}'
      fi
      
      # Clean up the lock cm
      ${KUBECTL} delete configmap ${RANCHERLOCKCMNAME} -n ${RANCHERLOCKNAMESPACE}
    • mgmt-stack-setup.service:包含用于创建 systemd 服务,以便在首次引导期间运行脚本的配置(无需修改)。

      [Unit]
      Description=Setup Management stack components
      Wants=network-online.target
      # It requires rke2 or k3s running, but it will not fail if those services are not present
      After=network.target network-online.target rke2-server.service k3s.service
      # At least, the basic-setup.sh one needs to be present
      ConditionPathExists=/opt/mgmt/bin/basic-setup.sh
      
      [Service]
      User=root
      Type=forking
      # Metal3 can take A LOT to download the IPA image
      TimeoutStartSec=1800
      
      ExecStartPre=/bin/sh -c "echo 'Setting up Management components...'"
      # Scripts are executed in StartPre because Start can only run a single one
      ExecStartPre=/opt/mgmt/bin/rancher.sh
      ExecStartPre=/opt/mgmt/bin/metal3.sh
      ExecStart=/bin/sh -c "echo 'Finished setting up Management components'"
      RemainAfterExit=yes
      KillMode=process
      # Disable & delete everything
      ExecStartPost=rm -f /opt/mgmt/bin/rancher.sh
      ExecStartPost=rm -f /opt/mgmt/bin/metal3.sh
      ExecStartPost=rm -f /opt/mgmt/bin/basic-setup.sh
      ExecStartPost=/bin/sh -c "systemctl disable mgmt-stack-setup.service"
      ExecStartPost=rm -f /etc/systemd/system/mgmt-stack-setup.service
      
      [Install]
      WantedBy=multi-user.target

custom/scripts 文件夹包含以下文件:

  • 99-alias.sh 脚本:包含管理群集在首次引导时用来加载 kubeconfig 文件的别名(无需修改)。

    #!/bin/bash
    echo "alias k=kubectl" >> /etc/profile.local
    echo "alias kubectl=/var/lib/rancher/rke2/bin/kubectl" >> /etc/profile.local
    echo "export KUBECONFIG=/etc/rancher/rke2/rke2.yaml" >> /etc/profile.local
  • 99-mgmt-setup.sh 脚本:包含首次引导期间用于复制脚本的配置(无需修改)。

    #!/bin/bash
    
    # Copy the scripts from combustion to the final location
    mkdir -p /opt/mgmt/bin/
    for script in basic-setup.sh rancher.sh metal3.sh; do
            cp ${script} /opt/mgmt/bin/
    done
    
    # Copy the systemd unit file and enable it at boot
    cp mgmt-stack-setup.service /etc/systemd/system/mgmt-stack-setup.service
    systemctl enable mgmt-stack-setup.service
  • 99-register.sh 脚本:包含用于通过 SCC 注册代码注册系统的配置。必须正确设置 ${SCC_ACCOUNT_EMAIL}${SCC_REGISTRATION_CODE} 才能使用您的帐户注册系统。

    #!/bin/bash
    set -euo pipefail
    
    # Registration https://www.suse.com/support/kb/doc/?id=000018564
    if ! which SUSEConnect > /dev/null 2>&1; then
            zypper --non-interactive install suseconnect-ng
    fi
    SUSEConnect --email "${SCC_ACCOUNT_EMAIL}" --url "https://scc.suse.com" --regcode "${SCC_REGISTRATION_CODE}"

41.3.4 Kubernetes 文件夹

kubernetes 文件夹包含以下子文件夹:

...
├── kubernetes
│ ├── manifests
│ │ ├── rke2-ingress-config.yaml
│ │ ├── neuvector-namespace.yaml
│ │ ├── ingress-l2-adv.yaml
│ │ └── ingress-ippool.yaml
│ ├── helm
│ │ └── values
│ │     ├── rancher.yaml
│ │     ├── neuvector.yaml
│ │     ├── metal3.yaml
│ │     └── certmanager.yaml
│ └── config
│     └── server.yaml
...

kubernetes/config 文件夹包含以下文件:

  • server.yaml:默认安装的 CNI 插件是 Cilium,因此不需要创建此文件夹和文件。如果您需要自定义 CNI 插件,可以使用 kubernetes/config 文件夹中的 server.yaml 文件。该文件包含以下信息:

    cni:
    - multus
    - cilium
    write-kubeconfig-mode: '0644'
    selinux: true
    system-default-registry: registry.rancher.com
注意
注意

这是一个可选文件,用于定义某些 Kubernetes 自定义设置,例如要使用的 CNI 插件,或官方文档中所述的许多选项。

os-files/var/lib/rancher/rke2/server/manifests 文件夹包含以下文件:

  • rke2-ingress-config.yaml:包含用于为管理群集创建入口服务的配置(无需修改)。

    apiVersion: helm.cattle.io/v1
    kind: HelmChartConfig
    metadata:
      name: rke2-ingress-nginx
      namespace: kube-system
    spec:
      valuesContent: |-
        controller:
          config:
            use-forwarded-headers: "true"
            enable-real-ip: "true"
          publishService:
            enabled: true
          service:
            enabled: true
            type: LoadBalancer
            externalTrafficPolicy: Local
注意
注意

必须通过 os-filesHelmChartConfig 放入 /var/lib/rancher/rke2/server/manifests 目录,而非像之前版本中所述通过 kubernetes/manifests 放入。

kubernetes/manifests 文件夹包含以下文件:

  • neuvector-namespace.yaml:包含用于创建 NeuVector 名称空间的配置(无需修改)。

    apiVersion: v1
    kind: Namespace
    metadata:
      labels:
        pod-security.kubernetes.io/enforce: privileged
      name: neuvector
  • ingress-l2-adv.yaml:包含用于为 MetalLB 组件创建 L2Advertisement 的配置(无需修改)。

    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: ingress-l2-adv
      namespace: metallb-system
    spec:
      ipAddressPools:
        - ingress-ippool
  • ingress-ippool.yaml:包含用于为 rke2-ingress-nginx 组件创建 IPAddressPool 的配置。必须正确设置 ${INGRESS_VIP},以定义预留给 rke2-ingress-nginx 组件使用的 IP 地址。

    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      name: ingress-ippool
      namespace: metallb-system
    spec:
      addresses:
        - ${INGRESS_VIP}/32
      serviceAllocation:
        priority: 100
        serviceSelectors:
          - matchExpressions:
              - {key: app.kubernetes.io/name, operator: In, values: [rke2-ingress-nginx]}

kubernetes/helm/values 文件夹包含以下文件:

  • rancher.yaml:包含用于创建 Rancher 组件的配置。必须正确设置 ${INGRESS_VIP},以定义 Rancher 组件要使用的 IP 地址。用于访问 Rancher 组件的 URL 为 https://rancher-${INGRESS_VIP}.sslip.io

    hostname: rancher-${INGRESS_VIP}.sslip.io
    bootstrapPassword: "foobar"
    replicas: 1
    global:
      cattle:
        systemDefaultRegistry: "registry.rancher.com"
  • neuvector.yaml:包含用于创建 NeuVector 组件的配置(无需修改)。

    controller:
      replicas: 1
      ranchersso:
        enabled: true
    manager:
      enabled: false
    cve:
      scanner:
        enabled: false
        replicas: 1
    k3s:
      enabled: true
    crdwebhook:
      enabled: false
    registry: "registry.rancher.com"
    global:
      cattle:
        systemDefaultRegistry: "registry.rancher.com"
  • longhorn.yaml:包含用于创建 Longhorn 组件的配置(无需修改)。

    global:
      cattle:
        systemDefaultRegistry: "registry.rancher.com"
  • metal3.yaml:包含用于创建 Metal3 组件的配置。必须正确设置 ${METAL3_VIP},以定义 Metal3 组件要使用的 IP 地址。

    global:
      ironicIP: ${METAL3_VIP}
      enable_vmedia_tls: false
      additionalTrustedCAs: false
    metal3-ironic:
      global:
        predictableNicNames: "true"
      persistence:
        ironic:
          size: "5Gi"
注意
注意

媒体服务器是 Metal3 中包含的可选功能(默认处于禁用状态)。要使用该 Metal3 功能,需要在前面所述的清单中配置该功能。要使用 Metal3 媒体服务器,请指定以下变量:

  • 在 global 部分,将 enable_metal3_media_server 设置为 true 以启用媒体服务器功能。

  • 包含有关媒体服务器的以下配置,其中 ${MEDIA_VOLUME_PATH} 是媒体卷在媒体中的路径(例如 /home/metal3/bmh-image-cache

    metal3-media:
      mediaVolume:
        hostPath: ${MEDIA_VOLUME_PATH}

可以使用外部媒体服务器来存储映像,如果您要将该服务器与 TLS 配合使用,则需要修改以下配置:

  • 将前面所述 metal3.yaml 文件中的 additionalTrustedCAs 设置为 true,以启用来自外部媒体服务器的附加可信 CA。

  • kubernetes/manifests/metal3-cacert-secret.yaml 文件夹中包含以下机密配置,以存储外部媒体服务器的 CA 证书。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: metal3-system
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: tls-ca-additional
      namespace: metal3-system
    type: Opaque
    data:
      ca-additional.crt: {{ additional_ca_cert | b64encode }}

additional_ca_cert 是外部媒体服务器的 base64 编码 CA 证书。可使用以下命令对证书进行编码并手动生成机密:

kubectl -n meta3-system create secret generic tls-ca-additional --from-file=ca-additional.crt=./ca-additional.crt
  • certmanager.yaml:包含用于创建 Cert-Manager 组件的配置(无需修改)。

    installCRDs: true

41.3.5 Network 文件夹

Network 文件夹中的文件数量与管理群集中的节点数量相同。在本例中,我们只有一个节点,因此此文件夹中只有一个文件,名为 mgmt-cluster-node1.yaml。该文件的名称必须与 mgmt-cluster.yaml 定义文件的上述 network/node 部分中定义的主机名一致。

如果您需要自定义网络配置,例如要使用特定的静态 IP 地址(无 DHCP 的方案),可以使用 network 文件夹中的 mgmt-cluster-node1.yaml 文件。该文件包含以下信息:

  • ${MGMT_GATEWAY}:网关 IP 地址。

  • ${MGMT_DNS}:DNS 服务器 IP 地址。

  • ${MGMT_MAC}:网络接口的 MAC 地址。

  • ${MGMT_NODE_IP}:管理群集的 IP 地址。

routes:
  config:
  - destination: 0.0.0.0/0
    metric: 100
    next-hop-address: ${MGMT_GATEWAY}
    next-hop-interface: eth0
    table-id: 254
dns-resolver:
  config:
    server:
    - ${MGMT_DNS}
    - 8.8.8.8
interfaces:
- name: eth0
  type: ethernet
  state: up
  mac-address: ${MGMT_MAC}
  ipv4:
    address:
    - ip: ${MGMT_NODE_IP}
      prefix-length: 24
    dhcp: false
    enabled: true
  ipv6:
    enabled: false

如果您要使用 DHCP 获取 IP 地址,可使用以下配置(必须使用 ${MGMT_MAC} 变量正确设置 MAC 地址):

## This is an example of a dhcp network configuration for a management cluster
interfaces:
- name: eth0
  type: ethernet
  state: up
  mac-address: ${MGMT_MAC}
  ipv4:
    dhcp: true
    enabled: true
  ipv6:
    enabled: false
注意
注意
  • 根据管理群集中的节点数,您可以创建更多文件(例如 mgmt-cluster-node2.yamlmgmt-cluster-node3.yaml 等)来配置其余节点。

  • routes 部分用于定义管理群集的路由表。

41.4 为隔离环境准备映像

本节介绍如何为隔离环境准备映像,其中只说明了与前面几节内容存在的差别。为隔离环境准备映像需要对上一节(为联网环境准备映像(第 41.3 节 “为联网环境准备映像”))的内容进行以下更改:

  • 必须修改 mgmt-cluster.yaml 文件,以包含 embeddedArtifactRegistry 部分,并将 images 字段设置为要包含在 EIB 输出映像中的所有容器映像。

  • 必须修改 mgmt-cluster.yaml 文件,以包含 rancher-turtles-airgap-resources Helm chart。

  • 使用隔离环境时,必须去除 custom/scripts/99-register.sh 脚本。

41.4.1 定义文件中的修改

必须修改 mgmt-cluster.yaml 文件,以包含 embeddedArtifactRegistry 部分。在此部分中,images 字段必须设置为要包含在输出映像中的所有容器映像的列表。

注意
注意

以下是包含 embeddedArtifactRegistry 部分的 mgmt-cluster.yaml 文件示例。请确保列出的映像包含您所需的组件版本。

此外,还必须添加 rancher-turtles-airgap-resources Helm chart,以创建 Rancher Turtles 隔离文档中所述的资源。还需要 rancher-turtles chart 的 turtles.yaml 值文件来指定必要的配置。

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: SL-Micro.x86_64-6.1-Base-SelfInstall-GM.install.iso
  outputImageName: eib-mgmt-cluster-image.iso
operatingSystem:
  isoConfiguration:
    installDevice: /dev/sda
  users:
  - username: root
    encryptedPassword: $ROOT_PASSWORD
  packages:
    packageList:
    - jq
    sccRegistrationCode: $SCC_REGISTRATION_CODE
kubernetes:
  version: v1.33.3+rke2r1
  helm:
    charts:
      - name: cert-manager
        repositoryName: jetstack
        version: 1.18.2
        targetNamespace: cert-manager
        valuesFile: certmanager.yaml
        createNamespace: true
        installationNamespace: kube-system
      - name: longhorn-crd
        version: 107.0.0+up1.9.1
        repositoryName: rancher-charts
        targetNamespace: longhorn-system
        createNamespace: true
        installationNamespace: kube-system
      - name: longhorn
        version: 107.0.0+up1.9.1
        repositoryName: rancher-charts
        targetNamespace: longhorn-system
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: longhorn.yaml
      - name: metal3
        version: 304.0.16+up0.12.6
        repositoryName: suse-edge-charts
        targetNamespace: metal3-system
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: metal3.yaml
      - name: rancher-turtles
        version: 304.0.6+up0.24.0
        repositoryName: suse-edge-charts
        targetNamespace: rancher-turtles-system
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: turtles.yaml
      - name: rancher-turtles-airgap-resources
        version: 304.0.6+up0.24.0
        repositoryName: suse-edge-charts
        targetNamespace: rancher-turtles-system
        createNamespace: true
        installationNamespace: kube-system
      - name: neuvector-crd
        version: 107.0.0+up2.8.7
        repositoryName: rancher-charts
        targetNamespace: neuvector
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: neuvector.yaml
      - name: neuvector
        version: 107.0.0+up2.8.7
        repositoryName: rancher-charts
        targetNamespace: neuvector
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: neuvector.yaml
      - name: rancher
        version: 2.12.1
        repositoryName: rancher-prime
        targetNamespace: cattle-system
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: rancher.yaml
    repositories:
      - name: jetstack
        url: https://charts.jetstack.io
      - name: rancher-charts
        url: https://charts.rancher.io/
      - name: suse-edge-charts
        url: oci://registry.suse.com/edge/charts
      - name: rancher-prime
        url: https://charts.rancher.com/server-charts/prime
    network:
      apiHost: $API_HOST
      apiVIP: $API_VIP
    nodes:
    - hostname: mgmt-cluster-node1
      initializer: true
      type: server
#   - hostname: mgmt-cluster-node2
#     type: server
#   - hostname: mgmt-cluster-node3
#     type: server
#       type: server
embeddedArtifactRegistry:
  images:
    - name: registry.rancher.com/rancher/hardened-cluster-autoscaler:v1.10.2-build20250611
    - name: registry.rancher.com/rancher/hardened-cni-plugins:v1.7.1-build20250611
    - name: registry.rancher.com/rancher/hardened-coredns:v1.12.2-build20250611
    - name: registry.rancher.com/rancher/hardened-k8s-metrics-server:v0.8.0-build20250704
    - name: registry.rancher.com/rancher/hardened-multus-cni:v4.2.1-build20250627
    - name: registry.rancher.com/rancher/klipper-helm:v0.9.8-build20250709
    - name: registry.rancher.com/rancher/mirrored-cilium-cilium:v1.17.6
    - name: registry.rancher.com/rancher/mirrored-cilium-operator-generic:v1.17.6
    - name: registry.rancher.com/rancher/mirrored-longhornio-csi-attacher:v4.9.0-20250709
    - name: registry.rancher.com/rancher/mirrored-longhornio-csi-node-driver-registrar:v2.14.0-20250709
    - name: registry.rancher.com/rancher/mirrored-longhornio-csi-provisioner:v5.3.0-20250709
    - name: registry.rancher.com/rancher/mirrored-longhornio-csi-resizer:v1.14.0-20250709
    - name: registry.rancher.com/rancher/mirrored-longhornio-csi-snapshotter:v8.3.0-20250709
    - name: registry.rancher.com/rancher/mirrored-longhornio-livenessprobe:v2.16.0-20250709
    - name: registry.rancher.com/rancher/mirrored-longhornio-longhorn-engine:v1.9.1
    - name: registry.rancher.com/rancher/mirrored-longhornio-longhorn-instance-manager:v1.9.1
    - name: registry.rancher.com/rancher/mirrored-longhornio-longhorn-manager:v1.9.1
    - name: registry.rancher.com/rancher/mirrored-longhornio-longhorn-share-manager:v1.9.1
    - name: registry.rancher.com/rancher/mirrored-longhornio-longhorn-ui:v1.9.1
    - name: registry.rancher.com/rancher/mirrored-sig-storage-snapshot-controller:v8.2.0
    - name: registry.rancher.com/rancher/neuvector-compliance-config:1.0.6
    - name: registry.rancher.com/rancher/neuvector-controller:5.4.5
    - name: registry.rancher.com/rancher/neuvector-enforcer:5.4.5
    - name: registry.rancher.com/rancher/nginx-ingress-controller:v1.12.4-hardened2
    - name: registry.suse.com/rancher/cluster-api-addon-provider-fleet:v0.11.0
    - name: registry.rancher.com/rancher/cluster-api-operator:v0.18.1
    - name: registry.rancher.com/rancher/fleet-agent:v0.13.1
    - name: registry.rancher.com/rancher/fleet:v0.13.1
    - name: registry.rancher.com/rancher/hardened-node-feature-discovery:v0.15.7-build20250425
    - name: registry.rancher.com/rancher/rancher-webhook:v0.8.1
    - name: registry.rancher.com/rancher/rancher/turtles:v0.24.0
    - name: registry.rancher.com/rancher/rancher:v2.12.1
    - name: registry.rancher.com/rancher/shell:v0.4.1
    - name: registry.rancher.com/rancher/system-upgrade-controller:v0.16.0
    - name: registry.suse.com/rancher/cluster-api-controller:v1.10.5
    - name: registry.suse.com/rancher/cluster-api-provider-metal3:v1.10.2
    - name: registry.suse.com/rancher/cluster-api-provider-rke2-bootstrap:v0.20.1
    - name: registry.suse.com/rancher/cluster-api-provider-rke2-controlplane:v0.20.1
    - name: registry.suse.com/rancher/hardened-sriov-network-operator:v1.5.0-build20250425
    - name: registry.suse.com/rancher/ip-address-manager:v1.10.2
    - name: registry.rancher.com/rancher/kubectl:v1.32.2
    - name: registry.rancher.com/rancher/mirrored-cluster-api-controller:v1.9.5

41.4.2 custom 文件夹中的修改

  • 使用隔离环境时,必须去除 custom/scripts/99-register.sh 脚本。如目录结构中所示,99-register.sh 脚本并未包含在 custom/scripts 文件夹中。

41.4.3 Helm 值文件夹中的修改

  • turtles.yaml:包含为 Rancher Turtles 指定隔离操作所需的配置,请注意,具体配置取决于 rancher-turtles-airgap-resources chart 的安装。

    cluster-api-operator:
      cluster-api:
        core:
          fetchConfig:
            selector: "{\"matchLabels\": {\"provider-components\": \"core\"}}"
        rke2:
          bootstrap:
            fetchConfig:
              selector: "{\"matchLabels\": {\"provider-components\": \"rke2-bootstrap\"}}"
          controlPlane:
            fetchConfig:
              selector: "{\"matchLabels\": {\"provider-components\": \"rke2-control-plane\"}}"
        metal3:
          infrastructure:
            fetchConfig:
              selector: "{\"matchLabels\": {\"provider-components\": \"metal3\"}}"

41.5 映像创建

按照前面的章节准备好目录结构后(适用于联网场景和隔离场景),运行以下命令来构建映像:

podman run --rm --privileged -it -v $PWD:/eib \
 registry.suse.com/edge/3.4/edge-image-builder:1.3.0 \
 build --definition-file mgmt-cluster.yaml

这会创建 ISO 输出映像文件,根据前面所述的映像定义,本例中该文件是 eib-mgmt-cluster-image.iso

41.6 置备管理群集

上图包含前面介绍的所有组件,可以使用虚拟机或裸机服务器(使用虚拟媒体功能)根据此图置备管理群集。

41.7 双栈考虑因素和配置

前面章节中的示例提供了有关如何设置单栈 IPv4 管理群集的指导和示例。此类管理群集不受下游群集运行状态的影响,下游群集在部署后可分别配置为以 IPv4/IPv6 单栈或双栈模式运行。然而,管理群集的配置方式会直接影响置备阶段可使用的通信协议 - 在此阶段,带内和带外通信都必须遵循管理群集和下游主机支持的协议。如果部分或所有 BMC 和/或下游群集节点需使用 IPv6,则管理群集需采用双栈配置。

注意
注意

目前暂不支持单栈 IPv6 管理群集。

要实现双栈功能,必须为 Kubernetes 提供用于 POD 和服务的 IPv4 和 IPv6 CIDR。此外,在使用 EIB 构建管理群集映像前,还需对其他组件进行特定调整。可根据您的体系结构或要求,通过不同方式配置 Metal3 置备服务 (Ironic):

  • 可将 Ironic 服务配置为在系统的所有接口上侦听,而非仅在单个 IP 地址上侦听。因此,只要管理群集主机在相关接口上分配了 IPv4 和 IPv6 地址,置备过程中就可能使用其中任意一个地址。请注意,目前仅能选择这些地址中的一个用于生成 URL(供裸机操作器、BMC 等其他服务使用);因此,要实现与 BMC 的 IPv6 通信,可指示裸机操作器在处理包含 IPv6 地址的 BMH 定义时公开并传递 IPv6 URL。也就是说,当 BMC 被识别为支持 IPv6 时,将仅通过 IPv6 进行置备;其他所有情况下则通过 IPv4 进行置备。

  • Metal3 可以使用解析为 IPv4 和 IPv6 的单个主机名,让 Ironic 使用这些地址进行绑定和创建 URL。此方法可实现简单的配置和灵活的行为(置备的每个步骤都可使用 IPv4 和 IPv6),但要求体系结构中已存在 DNS 服务器、IP 分配和记录。

无论采用哪种方式,Kubernetes 都需要知道用于 IPv4 和 IPv6 的 CIDR。因此,您可在 EIB 目录下的 kubernetes/config/server.yaml 中添加以下行,并确保 IPv4 排在前面:

service-cidr: 10.96.0.0/12,fd12:4567:789c::/112
cluster-cidr: 193.168.0.0/18,fd12:4567:789b::/48

某些容器会利用主机网络,因此需要在 network 目录下修改主机的网络配置,以启用 IPv6 连接:

routes:
  config:
  - destination: 0.0.0.0/0
    next-hop-address: ${MGMT_GATEWAY_V4}
    next-hop-interface: eth0
  - destination: ::/0
    next-hop-address: ${MGMT_GATEWAY_V6}
    next-hop-interface: eth0
dns-resolver:
  config:
    server:
    - ${MGMT_DNS}
    - 8.8.8.8
    - 2001:4860:4860::8888
interfaces:
- name: eth0
  type: ethernet
  state: up
  mac-address: ${MGMT_MAC}
  ipv4:
    address:
    - ip: ${MGMT_CLUSTER_IP_V4}
      prefix-length: 24
    dhcp: false
    enabled: true
  ipv6:
    address:
    - ip: ${MGMT_CLUSTER_IP_V6}
      prefix-length: 128
    dhcp: false
    autoconf: false
    enabled: true

将占位符替换为网关 IP 地址、额外的 DNS 服务器(如有需要)、网络接口的 MAC 地址以及管理群集的 IP 地址。如果更喜欢使用地址自动配置,可参考以下代码,只需设置 ${MGMT_MAC} 变量:

interfaces:
- name: eth0
  type: ethernet
  state: up
  mac-address: ${MGMT_MAC}
  ipv4:
    enabled: true
    dhcp: true
  ipv6:
    enabled: false
    dhcp: true
    autoconf: true

现在,我们从第一种方式开始,为单节点配置定义其余文件。创建 kubernetes/helm/values/metal3.yaml,内容如下:

global:
  ironicIP: ${MGMT_CLUSTER_IP_V4}
  enable_vmedia_tls: false
  additionalTrustedCAs: false
metal3-ironic:
  global:
    predictableNicNames: true
  listenOnAll: true
  persistence:
    ironic:
      size: "5Gi"
  service:
    type: NodePort
metal3-baremetal-operator:
  baremetaloperator:
    externalHttpIPv6: ${MGMT_CLUSTER_IP_V6}

创建 kubernetes/helm/values/rancher.yaml,内容如下:

hostname: rancher-${MGMT_CLUSTER_IP_V4}.sslip.io
bootstrapPassword: "foobar"
replicas: 1
global:
  cattle:
    systemDefaultRegistry: "registry.rancher.com"

其中,${MGMT_CLUSTER_IP_V4}${MGMT_CLUSTER_IP_V6} 是之前分配给主机的 IP 地址。

或者,如要使用主机名替代 IP 地址,可将 kubernetes/helm/values/metal3.yaml 修改为:

global:
  provisioningHostname: `${MGMT_CLUSTER_HOSTNAME}`
  enable_vmedia_tls: false
  additionalTrustedCAs: false
metal3-ironic:
  global:
    predictableNicNames: true
  persistence:
    ironic:
      size: "5Gi"
  service:
    type: NodePort

kubernetes/helm/values/rancher.yaml 修改为:

hostname: rancher-${MGMT_CLUSTER_HOSTNAME}.sslip.io
bootstrapPassword: "foobar"
replicas: 1
global:
  cattle:
    systemDefaultRegistry: "registry.rancher.com"

其中,${MGMT_CLUSTER_HOSTNAME} 应为解析为您主机 IP 地址的完全限定域名。

有关详细信息,请访问 SUSE Edge GitHub 代码库的“dual-stack”文件夹,其中提供了示例目录结构。