52 Aprovisionamiento de clústeres en sentido descendente con aprovisionamiento de red dirigida (nodo único) #
Esta sección describe el flujo de trabajo utilizado para automatizar el aprovisionamiento de un clúster en sentido descendente de nodo único mediante el aprovisionamiento de red dirigida. Esta es la forma más sencilla de automatizar el aprovisionamiento de un clúster en sentido descendente.
Requisitos
La imagen generada mediante
EIB, tal como se describe en la sección anterior (Capítulo 50, Preparar la imagen del clúster descendente para escenarios conectados), con la configuración mínima para configurar el clúster descendente debe estar ubicada en el clúster de gestión exactamente en la vía que configuró en esta sección (Nota).El servidor de gestión creado y disponible para ser utilizado en las siguientes secciones. Para obtener más información, consulte la sección del Clúster de gestión Parte V, “Configuración del clúster de gestión”.
Flujo de trabajo
El siguiente diagrama muestra el flujo de trabajo utilizado para automatizar el aprovisionamiento de un clúster descendente de nodo único mediante aprovisionamiento de red dirigido:
Existen dos pasos diferentes para automatizar el aprovisionamiento de un clúster descendente de nodo único mediante aprovisionamiento de red dirigido:
Inscriba el host de equipo sin sistema operativo para que esté disponible para el proceso de aprovisionamiento.
Aprovisione el host de equipo sin sistema operativo para instalar y configurar el sistema operativo y el clúster de Kubernetes.
Inscribir el host de equipo sin sistema operativo
El primer paso es inscribir el nuevo host de equipo sin sistema operativo en el clúster de gestión para que esté disponible para ser aprovisionado.
Para ello, se debe crear el siguiente archivo (bmh-example.yaml) en el clúster de gestión, para especificar las credenciales BMC que se utilizarán y el objeto BaremetalHost que se va a inscribir:
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-credentialsDonde:
${BMC_USERNAME}— El nombre de usuario para elBMCdel nuevo host de equipo sin sistema operativo.${BMC_PASSWORD}— La contraseña para elBMCdel nuevo host de equipo sin sistema operativo.${BMC_MAC}— La direcciónMACdel nuevo host de equipo sin sistema operativo que se va a utilizar.${BMC_ADDRESS}— ElURLpara el host de equipo sin sistema operativoBMC(por ejemplo,redfish-virtualmedia://192.168.200.75/redfish/v1/Systems/1/). Para obtener más información sobre las diferentes opciones disponibles según su proveedor de hardware, consulte el siguiente enlace.
La arquitectura debe ser
x86_64oaarch64, dependiendo de la arquitectura del host de equipo sin sistema operativo que se va a inscribir.Si no se ha especificado ninguna configuración de red para el host, ya sea en el momento de la creación de la imagen o a través de la definición
BareMetalHost, se utilizará un mecanismo de autoconfiguración (DHCP, DHCPv6, SLAAC). Para obtener más detalles o configuraciones complejas, consulte el Capítulo 54, Configuración de red avanzada.
Una vez creado el archivo, se debe ejecutar el siguiente comando en el clúster de gestión para comenzar a inscribir el nuevo host de equipo sin sistema operativo en el clúster de gestión:
$ kubectl apply -f bmh-example.yamlEl nuevo objeto de host de equipo sin sistema operativo se inscribirá, cambiando su estado de registro a inspección y disponible. Los cambios se pueden comprobar utilizando el siguiente comando:
$ kubectl get bmhEl objeto BaremetalHost está en el estado registering hasta que se validan las credenciales BMC. Una vez validadas las credenciales, el objeto BaremetalHost cambia su estado a inspecting, y este paso podría llevar algún tiempo dependiendo del hardware (hasta 20 minutos). Durante la fase de inspección, se recupera la información del hardware y se actualiza el objeto de Kubernetes. Compruebe la información utilizando el siguiente comando: kubectl get bmh -o yaml.
Paso de aprovisionamiento
Una vez que el host de equipo sin sistema operativo esté inscrito y disponible, el siguiente paso es aprovisionarlo para instalar y configurar el sistema operativo y el clúster de Kubernetes.
Para ello, se debe crear el siguiente archivo (capi-provisioning-example.yaml) en el clúster de gestión con la siguiente información (el capi-provisioning-example.yaml se puede generar uniendo los siguientes bloques).
Solo se deben reemplazar los valores entre $\{…\} por los valores reales.
El siguiente bloque es la definición del clúster, donde la red se puede configurar utilizando los bloques pods y services. Además, contiene las referencias a los objetos del plano de control y de la infraestructura (utilizando el proveedor Metal3) que se van a utilizar.
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-clusterSon posibles tanto las implementaciones de pila única como de pila dual; elimine los CIDR de IPv6 de la definición anterior para un clúster solo de IPv4.
Las implementaciones de IPv6 de pila única están en fase de vista previa técnica y aún no cuentan con soporte oficial.
Añadir la etiqueta
cluster-api.cattle.io/rancher-auto-import: "true"a los objetoscluster.x-k8s.ioimportará el clúster a Rancher (creando un objetoclusters.management.cattle.iocorrespondiente). Consulte la documentación de Cluster API para obtener más información.
El objeto Metal3Cluster especifica el punto de conexión del plano de control (reemplazando el ${DOWNSTREAM_CONTROL_PLANE_IPV4}) que se va a configurar y el indicador cloudProviderEnabled establecido en false porque se utiliza un equipo sin sistema operativo.
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: Metal3Cluster
metadata:
name: single-node-cluster
namespace: default
spec:
controlPlaneEndpoint:
host: ${DOWNSTREAM_CONTROL_PLANE_IPV4}
port: 6443
cloudProviderEnabled: falseEl objeto RKE2ControlPlane especifica la configuración del plano de control que se va a utilizar y el objeto Metal3MachineTemplate especifica la imagen del plano de control que se va a utilizar.
Además, contiene la información sobre el número de réplicas requeridas (en este caso, una) y el complemento CNI que se va a utilizar (en este caso, Cilium).
El bloque agentConfig contiene el formato Ignition que se va a utilizar y el additionalUserData que se va a utilizar para configurar el nodo RKE2 con información, como un servicio de unidad systemd llamado rke2-preinstall.service, que reemplaza automáticamente PROVIDERID y node-name durante el proceso de aprovisionamiento utilizando la información de Ironic. También se incluye la configuración necesaria para el controlador de entrada RKE2 (basado en Traefik), junto con los manifiestos de instancia de recursos personalizados MetalLB (IPAddressPool y L2Advertisement) necesarios para exponer externamente el servicio Ingress a través de las IP virtuales ${INGRESS_IPV4} y ${INGRESS_IPV6}.
El último bloque de información contiene la versión de Kubernetes que se va a utilizar. ${RKE2_VERSION} es la versión de RKE2 que se va a utilizar reemplazando este valor (por ejemplo, v1.36.3+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"
# Note we use _ as a delimiter for sed here because the providerid includes / characters
ExecStart=/bin/sh -c "sed -i \"s_PROVIDERID_$(jq -r .providerid /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
storage:
directories:
- path: /var/lib/rancher/rke2/server/manifests
overwrite: true
files:
- 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
spec:
type: LoadBalancer
externalTrafficPolicy: Local
allocateLoadBalancerNodePorts: false
mode: 0644
user:
name: root
group:
name: root
- path: /var/lib/rancher/rke2/server/manifests/metallb-traefik-cr.yaml
overwrite: true
contents:
inline: |
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: ingress-ippool
namespace: metallb-system
spec:
addresses:
- ${INGRESS_IPV4}/32
- ${INGRESS_IPV6}/128
serviceAllocation:
priority: 100
serviceSelectors:
- matchExpressions:
- {key: app.kubernetes.io/name, operator: In, values: [rke2-traefik]} # assign to rke2-traefik LB svc
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: ingress-l2-adv
namespace: metallb-system
spec:
ipAddressPools:
- ingress-ippool
mode: 0644
user:
name: root
group:
name: root
kubelet:
extraArgs:
- provider-id=metal3://PROVIDERID
nodeName: "localhost.localdomain"El objeto Metal3MachineTemplate especifica la siguiente información:
El
dataTemplateque se va a utilizar como referencia para la plantilla.El
hostSelectorque se debe utilizar coincidiendo con la etiqueta creada durante el proceso de inscripción.El
imageque se debe utilizar como referencia a la imagen generada utilizandoEIBen la sección (Capítulo 50, Preparar la imagen del clúster descendente para escenarios conectados) anterior, y elchecksumychecksumTypeque se deben utilizar para validar la imagen.
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
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
diskFormat: raw
url: http://imagecache.local:8080/eibimage-output-telco.rawEl objeto Metal3DataTemplate especifica el metaData para el clúster descendente.
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
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: machineUna vez creado el archivo uniendo los bloques anteriores, se debe ejecutar el siguiente comando en el clúster de gestión para comenzar a aprovisionar el nuevo host de equipo sin sistema operativo:
$ kubectl apply -f capi-provisioning-example.yaml