|Index|SUSE Telco Cloud 文档|全自动定向网络配置|使用定向网络配置(单节点)进行下游集群配置
Applies to SUSE Telco Cloud 3.6

51 使用定向网络配置(单节点)进行下游集群配置

本节介绍了用于通过定向网络配置自动配置单节点下游集群的工作流程。 这是自动化配置下游集群的最简单方法。

要求

工作流程

下图显示了使用定向网络配置自动配置单节点下游集群的工作流程:

atip automated singlenode1

使用定向网络配置自动配置单节点下游集群有两个不同的步骤:

  1. 注册裸机主机,使其可用于配置过程。

  2. 配置裸机主机以安装和设置操作系统及 Kubernetes 集群。

注册裸机主机

第一步是在管理集群中注册新的裸机主机,使其可用于置备。 为此,必须在管理集群中创建以下文件(bmh-example.yaml),以指定要使用的`BMC`凭据和要注册的`BaremetalHost`对象:

apiVersion: v1
kind: Secret
metadata:
  name: example-demo-credentials
type: Opaque
data:
  username: ${BMC_USERNAME}
  password: ${BMC_PASSWORD}
---
apiVersion: metal3.io/v1alpha1
kind: BareMetalHost
metadata:
  name: example-demo
  labels:
    cluster-role: control-plane
spec:
  architecture: x86_64
  online: true
  bootMACAddress: ${BMC_MAC}
  rootDeviceHints:
    deviceName: /dev/nvme0n1
  bmc:
    address: ${BMC_ADDRESS}
    disableCertificateVerification: true
    credentialsName: example-demo-credentials

其中:

  • ${BMC_USERNAME} — 新裸机主机`BMC`的用户名。

  • ${BMC_PASSWORD} — 新裸机主机`BMC`的密码。

  • ${BMC_MAC} — 要使用的新裸机主机的`MAC`地址。

  • ${BMC_ADDRESS} — 裸机主机的`URL``BMC`(例如,redfish-virtualmedia://192.168.200.75/redfish/v1/Systems/1/)。要了解有关根据您的硬件提供商可用的不同选项的更多信息,请查看以下 链接

Note
Note
  • 架构必须是`x86_64`或`aarch64`,具体取决于要注册的裸机主机的架构。

  • 如果未指定主机的网络配置(无论是在镜像构建时还是通过`BareMetalHost`定义),则将使用自动配置机制(DHCP、DHCPv6、SLAAC)。有关更多详细信息或复杂配置,请查看Chapter 53, 高级网络配置

文件创建完成后,必须在管理集群中执行以下命令,以开始在管理集群中注册新的裸机主机:

$ kubectl apply -f bmh-example.yaml

新的裸机主机对象将被注册,其状态将从注册中变为检查中和可用。可以使用以下命令检查更改:

$ kubectl get bmh
Note
Note

在验证`BMC`凭据之前,BaremetalHost`对象处于`registering`状态。凭据验证完成后,`BaremetalHost`对象的状态将更改为`inspecting,根据硬件的不同,此步骤可能需要一些时间(最长 20 分钟)。在检查阶段,将检索硬件信息并更新 Kubernetes 对象。使用以下命令检查信息:kubectl get bmh -o yaml

置备步骤

一旦裸机主机注册并可用,下一步就是置备裸机主机,以安装和配置操作系统及 Kubernetes 集群。 为此,必须在管理集群中创建以下文件 (capi-provisioning-example.yaml),并包含以下信息(capi-provisioning-example.yaml 可以通过连接以下块来生成)。

Note
Note

只需将`$\{…​\}`之间的值替换为实际值。

以下块是集群定义,其中可以使用 podsservices 块配置网络。此外,它还包含要使用的控制平面和基础设施(使用 Metal3 提供程序)对象的引用。

apiVersion: cluster.x-k8s.io/v1beta2
kind: Cluster
metadata:
  name: single-node-cluster
  namespace: default
  labels:
    cluster-api.cattle.io/rancher-auto-import: "true"
spec:
  clusterNetwork:
    pods:
      cidrBlocks:
        - 192.168.0.0/18
        - fd00:bad:cafe::/48
    services:
      cidrBlocks:
        - 10.96.0.0/12
        - fd00:bad:bad:cafe::/112
  controlPlaneRef:
    apiGroup: controlplane.cluster.x-k8s.io
    kind: RKE2ControlPlane
    name: single-node-cluster
  infrastructureRef:
    apiGroup: infrastructure.cluster.x-k8s.io
    kind: Metal3Cluster
    name: single-node-cluster
Note
Note
  • 单栈和双栈部署均可行,若只需 IPv4 集群,请去除上述定义中的 IPv6 CIDR。

  • 单栈 IPv6 部署处于技术预览状态,尚未获得官方支持。

  • 将标签 cluster-api.cattle.io/rancher-auto-import: "true" 添加到 cluster.x-k8s.io 对象中会将集群导入 Rancher(通过创建相应的 clusters.management.cattle.io 对象)。 有关更多信息,请参阅 Cluster API 文档

Metal3Cluster 对象指定要配置的控制平面端点(替换 ${DOWNSTREAM_CONTROL_PLANE_IPV4})以及 noCloudProvider,因为使用了裸机节点。

apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3Cluster
metadata:
  name: single-node-cluster
  namespace: default
spec:
  controlPlaneEndpoint:
    host: ${DOWNSTREAM_CONTROL_PLANE_IPV4}
    port: 6443
  noCloudProvider: true

RKE2ControlPlane 对象指定要使用的控制平面配置,Metal3MachineTemplate 对象指定要使用的控制平面镜像。 此外,它还包含有关要使用的副本数量的信息(在本例中为 1),以及要使用的 CNI 插件(在本例中为 Cilium)。 agentConfig 块包含要使用的 Ignition 格式,以及用于配置 RKE2 节点的 additionalUserData,其中包含诸如 systemd 名称 rke2-preinstall.service 之类的信息,以便在置备过程中使用 Ironic 信息自动替换 BAREMETALHOST_UUIDnode-name。 为了在 cilium 中启用 multus,需要在 rke2 服务器清单目录中创建一个名为 rke2-cilium-config.yaml 的文件,其中包含要使用的配置。 最后一块信息包含要使用的 Kubernetes 版本。${RKE2_VERSION} 是要使用的 RKE2 版本,用于替换此值(例如 v1.35.4+rke2r1)。

apiVersion: controlplane.cluster.x-k8s.io/v1beta2
kind: RKE2ControlPlane
metadata:
  name: single-node-cluster
  namespace: default
  annotations: {
    rke2.controlplane.cluster.x-k8s.io/load-balancer-exclusion: "true"
  }
spec:
  machineTemplate:
  infrastructureRef:
    apiGroup: infrastructure.cluster.x-k8s.io
    kind: Metal3MachineTemplate
    name: single-node-cluster-controlplane
  replicas: 1
  version: ${RKE2_VERSION}
  rolloutStrategy:
    type: "RollingUpdate"
    rollingUpdate:
      maxSurge: 0
  serverConfig:
    cni: cilium
  agentConfig:
    format: ignition
    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"
              ExecStart=/bin/sh -c "echo \"node-label:\" >> /etc/rancher/rke2/config.yaml"
              ExecStart=/bin/sh -c "echo \"  - metal3.io/uuid=$(jq -r .uuid /mnt/openstack/latest/meta_data.json)\" >> /etc/rancher/rke2/config.yaml"
              ExecStartPost=/bin/sh -c "umount /mnt"
              [Install]
              WantedBy=multi-user.target
          # rke2-traefik-deployment.service unit to be removed once "traefik" being the default ingress controller (starting with RKE2 v1.36)
          - name: rke2-traefik-deployment.service
            enabled: true
            contents: |
              [Unit]
              Description=rke2-traefik-deployment
              Wants=rke2-preinstall.service
              Before=rke2-install.service
              ConditionPathExists=!/run/cluster-api/bootstrap-success.complete
              [Service]
              Type=oneshot
              User=root
              ExecStart=/bin/sh -c "echo \"ingress-controller: traefik\" >> /etc/rancher/rke2/config.yaml"
              [Install]
              WantedBy=multi-user.target
        storage:
          directories:
          - path: /var/lib/rancher/rke2/server/manifests
            overwrite: true
          files:
          # https://docs.rke2.io/networking/multus_sriov#using-multus-with-cilium
          - path: /var/lib/rancher/rke2/server/manifests/rke2-cilium-config.yaml
            overwrite: true
            contents:
              inline: |
                apiVersion: helm.cattle.io/v1
                kind: HelmChartConfig
                metadata:
                  name: rke2-cilium
                  namespace: kube-system
                spec:
                  valuesContent: |-
                    cni:
                      exclusive: false
            mode: 0644
            user:
              name: root
            group:
              name: root
          - path: /var/lib/rancher/rke2/server/manifests/rke2-traefik-config.yaml
            overwrite: true
            contents:
              inline: |
                apiVersion: helm.cattle.io/v1
                kind: HelmChartConfig
                metadata:
                  name: rke2-traefik
                  namespace: kube-system
                spec:
                  valuesContent: |-
                    ingressClass:
                      isDefaultClass: true
                    ports:
                      web:
                        hostPort: null    # disallow hostPort
                        exposedPort: 80
                      websecure:
                        hostPort: null    # disallow hostPort
                        exposedPort: 443
                    service:
                      enabled: true
                      type: LoadBalancer
                      spec:
                        externalTrafficPolicy: Local
                        allocateLoadBalancerNodePorts: false  # k8s GA from 1.24; supported by MetalLB
            mode: 0644
            user:
              name: root
            group:
              name: root
    kubelet:
      extraArgs:
      - provider-id=metal3://BAREMETALHOST_UUID
    nodeName: "localhost.localdomain"

Metal3MachineTemplate 对象指定以下信息:

  • 用作模板引用的 dataTemplate

  • 用作与注册过程中创建的标签匹配的 hostSelector

  • 作为参考 image`上一节 (Chapter 49, 为连接场景准备下游集群镜像)中使用`EIB`生成图像的 ,以及用于验证该图像的 `checksum`和`checksumType

apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3MachineTemplate
metadata:
  name: single-node-cluster-controlplane
  namespace: default
spec:
  template:
    spec:
      dataTemplate:
        name: single-node-cluster-controlplane-template
      hostSelector:
        matchLabels:
          cluster-role: control-plane
      image:
        checksum: http://imagecache.local:8080/eibimage-output-telco.raw.sha256
        checksumType: sha256
        format: raw
        url: http://imagecache.local:8080/eibimage-output-telco.raw

Metal3DataTemplate 对象指定了下游集群的`metaData`。

apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3DataTemplate
metadata:
  name: single-node-cluster-controlplane-template
  namespace: default
spec:
  clusterName: single-node-cluster
  metaData:
    objectNames:
    - key: name
      object: machine
    - key: local-hostname
      object: machine
    - key: local_hostname
      object: machine

通过连接之前的块创建文件后,必须在管理集群中执行以下命令以开始置备新的裸机主机:

$ kubectl apply -f capi-provisioning-example.yaml