51 使用定向网络配置(单节点)进行下游集群配置 #
本节介绍了用于通过定向网络配置自动配置单节点下游集群的工作流程。 这是自动化配置下游集群的最简单方法。
要求
使用
EIB生成的镜像(如 上一节 (Chapter 49, 为连接场景准备下游集群镜像) 所述)以及用于设置下游集群的最小配置,必须位于管理集群中,且路径必须与您在 本节 (Note) 中配置的路径完全一致。已创建管理服务器,可供后续章节使用。有关更多信息,请参阅管理集群部分 Part V, “设置管理集群”。
工作流程
下图显示了使用定向网络配置自动配置单节点下游集群的工作流程:
使用定向网络配置自动配置单节点下游集群有两个不同的步骤:
注册裸机主机,使其可用于配置过程。
配置裸机主机以安装和设置操作系统及 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/)。要了解有关根据您的硬件提供商可用的不同选项的更多信息,请查看以下 链接。
架构必须是`x86_64`或`aarch64`,具体取决于要注册的裸机主机的架构。
如果未指定主机的网络配置(无论是在镜像构建时还是通过`BareMetalHost`定义),则将使用自动配置机制(DHCP、DHCPv6、SLAAC)。有关更多详细信息或复杂配置,请查看Chapter 53, 高级网络配置。
文件创建完成后,必须在管理集群中执行以下命令,以开始在管理集群中注册新的裸机主机:
$ kubectl apply -f bmh-example.yaml新的裸机主机对象将被注册,其状态将从注册中变为检查中和可用。可以使用以下命令检查更改:
$ kubectl get bmh在验证`BMC`凭据之前,BaremetalHost`对象处于`registering`状态。凭据验证完成后,`BaremetalHost`对象的状态将更改为`inspecting,根据硬件的不同,此步骤可能需要一些时间(最长 20 分钟)。在检查阶段,将检索硬件信息并更新 Kubernetes 对象。使用以下命令检查信息:kubectl get bmh -o yaml。
置备步骤
一旦裸机主机注册并可用,下一步就是置备裸机主机,以安装和配置操作系统及 Kubernetes 集群。
为此,必须在管理集群中创建以下文件 (capi-provisioning-example.yaml),并包含以下信息(capi-provisioning-example.yaml 可以通过连接以下块来生成)。
只需将`$\{…\}`之间的值替换为实际值。
以下块是集群定义,其中可以使用 pods 和 services 块配置网络。此外,它还包含要使用的控制平面和基础设施(使用 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单栈和双栈部署均可行,若只需 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: trueRKE2ControlPlane 对象指定要使用的控制平面配置,Metal3MachineTemplate 对象指定要使用的控制平面镜像。
此外,它还包含有关要使用的副本数量的信息(在本例中为 1),以及要使用的 CNI 插件(在本例中为 Cilium)。
agentConfig 块包含要使用的 Ignition 格式,以及用于配置 RKE2 节点的 additionalUserData,其中包含诸如 systemd 名称 rke2-preinstall.service 之类的信息,以便在置备过程中使用 Ironic 信息自动替换 BAREMETALHOST_UUID 和 node-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.rawMetal3DataTemplate 对象指定了下游集群的`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