65 Uso de ClusterClass para desplegar clústeres en sentido descendente #
65.1 Introducción #
El aprovisionamiento de clústeres de Kubernetes es una tarea compleja que exige una gran experiencia en la configuración de los componentes del clúster. A medida que las configuraciones se vuelven más complejas, o a medida que las demandas de los diferentes proveedores introducen numerosas definiciones de recursos específicas del proveedor, la creación de clústeres puede resultar desalentadora. Afortunadamente, Kubernetes Cluster API (CAPI) ofrece un enfoque más elegante y declarativo que se ve mejorado aún más por ClusterClass. Esta funcionalidad introduce un modelo basado en plantillas, que os permite definir una clase de clúster reutilizable que encapsula la complejidad y promueve la coherencia.
65.2 ¿Qué es ClusterClass? #
El proyecto CAPI introdujo la funcionalidad ClusterClass como un cambio de paradigma en la gestión del ciclo de vida de los clústeres de Kubernetes mediante la adopción de una metodología basada en plantillas para la instanciación de clústeres. En lugar de definir recursos de forma independiente para cada clúster, los usuarios definen una ClusterClass, que sirve como un plano completo y reutilizable. Esta representación abstracta encapsula el estado y la configuración deseados de un clúster de Kubernetes, lo que permite la creación rápida y coherente de múltiples clústeres que cumplen con las especificaciones definidas. Esta abstracción reduce la carga de configuración, lo que da lugar a manifiestos de ampliación más manejables. Esto significa que los componentes principales de un clúster de carga de trabajo se definen a nivel de clase, lo que permite a los usuarios utilizar estas plantillas como variantes de clúster de Kubernetes que pueden reutilizarse una o varias veces para el aprovisionamiento de clústeres. La implementación de ClusterClass aporta varias ventajas clave que abordan los desafíos inherentes de la gestión tradicional de CAPI a escala:
Reducción sustancial de la complejidad y de la verbosidad de YAML
Procesos de mantenimiento y actualización optimizados
Consistencia y estandarización mejoradas en todas las implementaciones
Capacidades mejoradas de escalabilidad y automatización
Gestión declarativa y control de versiones robusto
65.3 Ejemplo del archivo de aprovisionamiento de CAPI actual #
El despliegue de un clúster de Kubernetes que aprovecha Cluster API (CAPI) con los proveedores CAPRKE2 (plano de control e iniciar) y CAPM3 (infraestructura) requiere definir varios recursos personalizados. Estos recursos definen el estado deseado del clúster y su infraestructura subyacente, lo que permite a CAPI orquestar el ciclo de vida de aprovisionamiento y gestión. El fragmento de código a continuación ilustra los tipos de recursos que deben configurarse para instanciar un clúster de Kubernetes solo con nodos del plano de control:
Cluster: Este recurso encapsula configuraciones de alto nivel, incluida la topología de red que regirá la comunicación entre nodos y la detección de servicios. Además, establece vínculos esenciales con la especificación del plano de control y el recurso del proveedor de infraestructura designado, informando así a CAPI sobre la arquitectura de clúster deseada y la infraestructura subyacente sobre la que se aprovisionará.
Metal3Cluster: Este recurso define atributos a nivel de infraestructura exclusivos de Metal3, por ejemplo, el punto de conexión externo a través del cual será accesible el servidor de la API de Kubernetes.
RKE2ControlPlane: El recurso RKE2ControlPlane define las características y el comportamiento de los nodos del plano de control del clúster. Dentro de esta especificación, se configuran parámetros como el número deseado de réplicas del plano de control (crucial para garantizar la alta disponibilidad y la tolerancia a fallos), la versión específica de la distribución de Kubernetes (alineada con la versión de RKE2 elegida) y la estrategia para implementar actualizaciones en los componentes del plano de control. Además, este recurso dicta la interfaz de red (CNI) que se empleará dentro del clúster y facilita la inyección de configuraciones específicas del agente, a menudo aprovechando Ignition para un aprovisionamiento fluido y automatizado de los agentes de RKE2 en los nodos del plano de control.
Metal3MachineTemplate: Este recurso sirve como modelo para crear las instancias de computación individuales que forman los nodos del plano de control del clúster.
Metal3DataTemplate: Como complemento de Metal3MachineTemplate, el recurso Metal3DataTemplate permite especificar metadatos adicionales para las instancias de máquina recién aprovisionadas.
apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: emea-spa-cluster-3 namespace: emea-spa labels: cluster-api.cattle.io/rancher-auto-import: "true" spec: clusterNetwork: pods: cidrBlocks: - 192.168.0.0/18 services: cidrBlocks: - 10.96.0.0/12 controlPlaneRef: apiGroup: controlplane.cluster.x-k8s.io kind: RKE2ControlPlane name: emea-spa-cluster-3 infrastructureRef: apiGroup: infrastructure.cluster.x-k8s.io kind: Metal3Cluster name: emea-spa-cluster-3 --- apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: Metal3Cluster metadata: name: emea-spa-cluster-3 namespace: emea-spa spec: controlPlaneEndpoint: host: 192.168.122.203 port: 6443 cloudProviderEnabled: false --- apiVersion: controlplane.cluster.x-k8s.io/v1beta2 kind: RKE2ControlPlane metadata: name: emea-spa-cluster-3 namespace: emea-spa spec: machineTemplate: spec: infrastructureRef: apiGroup: infrastructure.cluster.x-k8s.io kind: Metal3MachineTemplate name: emea-spa-cluster-3 replicas: 1 version: v1.35.4+rke2r1 rolloutStrategy: type: "RollingUpdate" rollingUpdate: maxSurge: 1 registrationMethod: "control-plane-endpoint" registrationAddress: 192.168.122.203 serverConfig: cni: cilium cniMultusEnable: true tlsSan: - 192.168.122.203 - https://192.168.122.203.sslip.io agentConfig: format: ignition additionalUserData: config: | variant: fcos version: 1.4.0 storage: files: - path: /var/lib/rancher/rke2/server/manifests/endpoint-copier-operator.yaml overwrite: true contents: inline: | apiVersion: helm.cattle.io/v1 kind: HelmChart metadata: name: endpoint-copier-operator namespace: kube-system spec: chart: oci://registry.suse.com/edge/charts/endpoint-copier-operator targetNamespace: endpoint-copier-operator version: 306.0.1+up0.3.0 createNamespace: true - path: /var/lib/rancher/rke2/server/manifests/metallb.yaml overwrite: true contents: inline: | apiVersion: helm.cattle.io/v1 kind: HelmChart metadata: name: metallb namespace: kube-system spec: chart: oci://registry.suse.com/edge/charts/metallb targetNamespace: metallb-system version: 306.0.2+up0.15.3 createNamespace: true - path: /var/lib/rancher/rke2/server/manifests/metallb-cr.yaml overwrite: true contents: inline: | apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: kubernetes-vip-ip-pool namespace: metallb-system spec: addresses: - 192.168.122.203/32 serviceAllocation: priority: 100 namespaces: - default serviceSelectors: - matchExpressions: - {key: "serviceType", operator: In, values: [kubernetes-vip]} --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: ip-pool-l2-adv namespace: metallb-system spec: ipAddressPools: - kubernetes-vip-ip-pool - path: /var/lib/rancher/rke2/server/manifests/endpoint-svc.yaml overwrite: true contents: inline: | apiVersion: v1 kind: Service metadata: name: kubernetes-vip namespace: default labels: serviceType: kubernetes-vip spec: ports: - name: rke2-api port: 9345 protocol: TCP targetPort: 9345 - name: k8s-api port: 6443 protocol: TCP targetPort: 6443 type: LoadBalancer 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 kubelet: extraArgs: - provider-id=metal3://BAREMETALHOST_UUID nodeName: "localhost.localdomain" --- apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: Metal3MachineTemplate metadata: name: emea-spa-cluster-3 namespace: emea-spa spec: nodeReuse: True template: spec: automatedCleaningMode: metadata dataTemplate: name: emea-spa-cluster-3 hostSelector: matchLabels: cluster-role: control-plane deploy-region: emea-spa cluster-type: group-3 image: checksum: http://fileserver.local:8080/eibimage-downstream-cluster.raw.sha256 checksumType: sha256 format: raw url: http://fileserver.local:8080/eibimage-downstream-cluster.raw --- apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: Metal3DataTemplate metadata: name: emea-spa-cluster-3 namespace: emea-spa spec: clusterName: emea-spa-cluster-3 metaData: objectNames: - key: name object: machine - key: local-hostname object: machine - key: local_hostname object: machine
Añadir la etiqueta cluster-api.cattle.io/rancher-auto-import: "true" a un objeto de la API Cluster en el grupo de API cluster.x-k8s.io importará el clúster a Rancher (creando un objeto de la API Cluster de Rancher correspondiente en el grupo de API management.cattle.io).
Consulte la documentación de Cluster API para obtener más información.
65.4 Transformación del archivo de aprovisionamiento de CAPI a ClusterClass #
65.4.1 Definición de ClusterClass #
El siguiente código define un recurso ClusterClass, una plantilla declarativa para desplegar de forma coherente tipos específicos de clústeres de Kubernetes. Esta especificación incluye configuraciones comunes de infraestructura y del plano de control, lo que permite un aprovisionamiento eficiente y una gestión uniforme del ciclo de vida en todo un Fleet de clústeres. En el siguiente ejemplo de ClusterClass hay algunas variables definidas que se reemplazarán durante el proceso de instanciación del clúster utilizando los valores reales solicitados para cada instancia de clúster. En el ejemplo se utilizan las siguientes variables:
metallbHelmChartVersion: Esta variable opcional permite especificar la versión del gráfico de HelmMetalLBque se desplegará en el clúster; cuando no se proporciona, el gráfico de HelmMetalLBno se desplegará.endpointCopierOperatorHelmChartVersion: Esta variable opcional permite especificar la versión del gráfico de HelmEndpoint Copier Operatorque se desplegará en el clúster (cuando también se ha proporcionado una versión para el gráfico de HelmMetalLB); cuando no se proporciona, el gráfico de HelmEndpoint Copier Operatorno se desplegará.controlPlaneMachineTemplateImageURL: Esta variable obligatoria permite especificar la URL de la imagen que se utilizará para aprovisionar las máquinas del plano de control.controlPlaneMachineTemplateHostSelectorDeployRegion: Esta variable obligatoria permite especificar el valor del selector de hostdeploy-regionpara las máquinas del plano de control.controlPlaneMachineTemplateHostSelectorClusterType: Esta variable obligatoria permite especificar el valor del selector de hostcluster-typepara las máquinas del plano de control.controlPlaneMachineTemplateDataTemplateName: Esta variable obligatoria permite especificar el nombre del objeto de la APIMetal3DataTemplateque se utilizará para las máquinas del plano de control.controlPlaneEndpointHost: Esta variable obligatoria permite especificar el nombre de host o la dirección IP del punto de conexión del plano de control.tlsSan: Esta variable obligatoria permite especificar la lista de nombres alternativos del sujeto (SAN) TLS para el punto de conexión del plano de control.
El archivo de definición de ClusterClass consta de los siguientes cuatro recursos:
ClusterClass: Este recurso encapsula toda la definición de la clase de clúster, incluidas las plantillas del plano de control y de la infraestructura. Además, incluye la lista de variables que se reemplazarán durante el proceso de instanciación (y define los parches que las utilizan).
RKE2ControlPlaneTemplate: Este recurso define la plantilla del plano de control, especificando la configuración deseada para los nodos del plano de control. Además, algunos parámetros serán reemplazados por los valores correctos durante el proceso de instanciación.
Metal3ClusterTemplate: Este recurso define la plantilla de infraestructura, especificando la configuración deseada para la infraestructura subyacente. Incluye parámetros tales como el punto de conexión del plano de control y el indicador cloudProviderEnabled (true|false). Además, algunos parámetros serán reemplazados por los valores correctos durante el proceso de instanciación.
Metal3MachineTemplate: Este recurso define el modelo de plantilla de máquina para los nodos del plano de control, proporcionando los marcadores de posición para que esos parámetros sean reemplazados por los valores correctos durante el proceso de instanciación.
apiVersion: controlplane.cluster.x-k8s.io/v1beta2 kind: RKE2ControlPlaneTemplate metadata: name: example-controlplane namespace: emea-spa spec: template: spec: rolloutStrategy: type: "RollingUpdate" rollingUpdate: maxSurge: 1 registrationMethod: "control-plane-endpoint" registrationAddress: TO-BE-PATCHED-AUTOMATICALLY # This will be replaced by the involved patch when applying the cluster instance serverConfig: cni: cilium cniMultusEnable: true tlsSan: - TO-BE-PATCHED-AUTOMATICALLY # This will be replaced by the involved patch when applying the cluster instance agentConfig: format: ignition additionalUserData: config: | # This will be replaced by the involved patch when applying the cluster instance TO-BE-PATCHED-AUTOMATICALLY kubelet: extraArgs: - provider-id=metal3://BAREMETALHOST_UUID nodeName: "localhost.localdomain" --- apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: Metal3ClusterTemplate metadata: name: example-cluster-template namespace: emea-spa spec: template: spec: controlPlaneEndpoint: host: TO-BE-PATCHED-AUTOMATICALLY # This will be replaced by the involved patch when applying the cluster instance port: 6443 cloudProviderEnabled: false --- apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: Metal3MachineTemplate metadata: name: example-controlplane-machineinfrastructure namespace: emea-spa spec: nodeReuse: true template: spec: automatedCleaningMode: metadata dataTemplate: name: to-be-patched-automatically # This will be replaced by the involved patch when applying the cluster instance hostSelector: matchLabels: # The labels used to identify the BMHs to select. cluster-role: control-plane deploy-region: TO-BE-PATCHED-AUTOMATICALLY # This will be replaced by the involved patch when applying the cluster instance cluster-type: TO-BE-PATCHED-AUTOMATICALLY # This will be replaced by the involved patch when applying the cluster instance image: checksum: http://TO-BE-PATCHED-AUTOMATICALLY # This will be replaced by the involved patch when applying the cluster instance checksumType: sha256 format: raw url: http://TO-BE-PATCHED-AUTOMATICALLY # This will be replaced by the involved patch when applying the cluster instance --- apiVersion: cluster.x-k8s.io/v1beta2 kind: ClusterClass metadata: name: example-clusterclass namespace: emea-spa spec: infrastructure: templateRef: kind: Metal3ClusterTemplate apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 name: example-cluster-template controlPlane: templateRef: kind: RKE2ControlPlaneTemplate apiVersion: controlplane.cluster.x-k8s.io/v1beta2 name: example-controlplane machineInfrastructure: templateRef: kind: Metal3MachineTemplate apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 name: example-controlplane-machineinfrastructure variables: - name: metallbHelmChartVersion required: false schema: openAPIV3Schema: type: string - name: endpointCopierOperatorHelmChartVersion required: false schema: openAPIV3Schema: type: string - name: controlPlaneMachineTemplateImageURL required: true schema: openAPIV3Schema: type: string - name: controlPlaneMachineTemplateHostSelectorDeployRegion required: true schema: openAPIV3Schema: type: string - name: controlPlaneMachineTemplateHostSelectorClusterType required: true schema: openAPIV3Schema: type: string - name: controlPlaneMachineTemplateDataTemplateName required: true schema: openAPIV3Schema: type: string - name: controlPlaneEndpointHost required: true schema: openAPIV3Schema: type: string - name: tlsSan required: true schema: openAPIV3Schema: type: array items: type: string patches: - name: setControlPlaneMachineTemplateImageURL definitions: - selector: apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: Metal3MachineTemplate matchResources: controlPlane: true # Added to select ControlPlane jsonPatches: - op: replace path: "/spec/template/spec/image/url" valueFrom: variable: controlPlaneMachineTemplateImageURL - op: replace path: "/spec/template/spec/image/checksum" valueFrom: template: "{{ .controlPlaneMachineTemplateImageURL }}.sha256" - name: setControlPlaneMachineTemplateHostSelectorDeployRegion definitions: - selector: apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: Metal3MachineTemplate matchResources: controlPlane: true jsonPatches: - op: replace path: "/spec/template/spec/hostSelector/matchLabels/deploy-region" valueFrom: variable: controlPlaneMachineTemplateHostSelectorDeployRegion - name: setControlPlaneMachineTemplateHostSelectorClusterType definitions: - selector: apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: Metal3MachineTemplate matchResources: controlPlane: true # Added to select ControlPlane jsonPatches: - op: replace path: "/spec/template/spec/hostSelector/matchLabels/cluster-type" valueFrom: variable: controlPlaneMachineTemplateHostSelectorClusterType - name: setControlPlaneMachineTemplateDataTemplateName definitions: - selector: apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: Metal3MachineTemplate matchResources: controlPlane: true # Added to select ControlPlane jsonPatches: - op: replace path: "/spec/template/spec/dataTemplate/name" valueFrom: variable: controlPlaneMachineTemplateDataTemplateName - name: setControlPlaneEndpoint definitions: - selector: apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: Metal3ClusterTemplate matchResources: infrastructureCluster: true # Added to select InfraCluster jsonPatches: - op: replace path: "/spec/template/spec/controlPlaneEndpoint/host" valueFrom: variable: controlPlaneEndpointHost - name: setRegistrationAddress definitions: - selector: apiVersion: controlplane.cluster.x-k8s.io/v1beta2 kind: RKE2ControlPlaneTemplate matchResources: controlPlane: true # Added to select ControlPlane jsonPatches: - op: replace path: "/spec/template/spec/registrationAddress" valueFrom: variable: controlPlaneEndpointHost - name: setTlsSan definitions: - selector: apiVersion: controlplane.cluster.x-k8s.io/v1beta2 kind: RKE2ControlPlaneTemplate matchResources: controlPlane: true # Added to select ControlPlane jsonPatches: - op: replace path: "/spec/template/spec/serverConfig/tlsSan" valueFrom: variable: tlsSan - name: updateAdditionalUserData definitions: - selector: apiVersion: controlplane.cluster.x-k8s.io/v1beta2 kind: RKE2ControlPlaneTemplate matchResources: controlPlane: true jsonPatches: - op: replace path: "/spec/template/spec/agentConfig/additionalUserData" valueFrom: template: | config: | variant: fcos version: 1.4.0 {{ if .metallbHelmChartVersion }} storage: files: - path: /var/lib/rancher/rke2/server/manifests/metallb.yaml overwrite: true contents: inline: | apiVersion: helm.cattle.io/v1 kind: HelmChart metadata: name: metallb namespace: kube-system spec: chart: oci://registry.suse.com/edge/charts/metallb targetNamespace: metallb-system version: {{ .metallbHelmChartVersion }} createNamespace: true {{ if .endpointCopierOperatorHelmChartVersion }} - path: /var/lib/rancher/rke2/server/manifests/endpoint-copier-operator.yaml overwrite: true contents: inline: | apiVersion: helm.cattle.io/v1 kind: HelmChart metadata: name: endpoint-copier-operator namespace: kube-system spec: chart: oci://registry.suse.com/edge/charts/endpoint-copier-operator targetNamespace: endpoint-copier-operator version: {{ .endpointCopierOperatorHelmChartVersion }} createNamespace: true - path: /var/lib/rancher/rke2/server/manifests/metallb-cr.yaml overwrite: true contents: inline: | apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: kubernetes-vip-ip-pool namespace: metallb-system spec: addresses: - {{ .controlPlaneEndpointHost }}/32 serviceAllocation: priority: 100 namespaces: - default serviceSelectors: - matchExpressions: - {key: "serviceType", operator: In, values: [kubernetes-vip]} --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: ip-pool-l2-adv namespace: metallb-system spec: ipAddressPools: - kubernetes-vip-ip-pool - path: /var/lib/rancher/rke2/server/manifests/endpoint-svc.yaml overwrite: true contents: inline: | apiVersion: v1 kind: Service metadata: name: kubernetes-vip namespace: default labels: serviceType: kubernetes-vip spec: ports: - name: rke2-api port: 9345 protocol: TCP targetPort: 9345 - name: k8s-api port: 6443 protocol: TCP targetPort: 6443 type: LoadBalancer {{ end }} {{ end }} 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
65.4.2 Definición de instancia de clúster #
Dentro del contexto de ClusterClass, una instancia de clúster se refiere a una instanciación específica y en ejecución de un clúster que ha sido creado basándose en una ClusterClass definida. Representa una ampliación concreta con sus configuraciones, recursos y estado operativo únicos, derivados directamente del plano especificado en la ClusterClass. Esto incluye el conjunto específico de máquinas, configuraciones de red y componentes de Kubernetes asociados que se están ejecutando activamente. Comprender la instancia de clúster es crucial para gestionar el ciclo de vida, realizar actualizaciones de versión, ejecutar operaciones de escalado y llevar a cabo la monitorización de un clúster desplegado en particular que se aprovisionó utilizando el marco de trabajo ClusterClass.
Para definir una instancia de clúster necesitamos definir los dos recursos siguientes:
Cluster: Este recurso representa la instancia de clúster real, incluyendo una referencia a su
topology(es decir, el objetoClusterClass), la versión de Kubernetes requerida, el número de nodos del plano de control a instanciar y los valores proporcionados para cada una de las variables definidas en elClusterClassreferenciado, que se utilizarán durante el proceso de instanciación.Metal3DataTemplate: Este recurso proporciona metadatos adicionales para las máquinas en el clúster (solo máquinas del plano de control en este ejemplo), complementando el objeto
Metal3MachineTemplatecreado automáticamente por cada clúster instanciado. Tened en cuenta que no es posible definir un único recursoMetal3DataTemplateválido para todos los clústeres instanciados a partir de unClusterClasscomún, ya que el campoclusterNameen la especificaciónMetal3DataTemplatedebe hacer referencia a la instancia de clúster específica a la que "pertenece".apiVersion: cluster.x-k8s.io/v1beta2 kind: Cluster metadata: name: emea-spa-cluster-3 namespace: emea-spa labels: cluster-api.cattle.io/rancher-auto-import: "true" spec: topology: classRef: name: example-clusterclass namespace: emea-spa version: v1.35.3+rke2r3 controlPlane: replicas: 1 variables: # Values to be replaced in the clusterclass template variables to create this specific cluster - name: endpointCopierOperatorHelmChartVersion value: 306.0.1+up0.3.0 - name: metallbHelmChartVersion value: 306.0.2+up0.15.3 - name: controlPlaneMachineTemplateImageURL value: http://fileserver.local:8080/eibimage-downstream-cluster.raw.sha256 - name: controlPlaneMachineTemplateHostSelectorDeployRegion value: emea-spa - name: controlPlaneMachineTemplateHostSelectorClusterType value: group-3 - name: controlPlaneMachineTemplateDataTemplateName value: emea-spa-cluster-3 - name: controlPlaneEndpointHost value: 192.168.122.203 - name: tlsSan value: - 192.168.122.203 - https://192.168.122.203.sslip.io --- apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: Metal3DataTemplate metadata: name: emea-spa-cluster-3 namespace: emea-spa spec: clusterName: emea-spa-cluster-3 metaData: objectNames: - key: name object: machine - key: local-hostname object: machine - key: local_hostname object: machine
Añadir la etiqueta cluster-api.cattle.io/rancher-auto-import: "true" a un objeto de la API Cluster en el grupo de API cluster.x-k8s.io importará el clúster a Rancher (creando un objeto de la API Cluster de Rancher correspondiente en el grupo de API management.cattle.io).
Consulte la documentación de Cluster API para obtener más información.
Este enfoque agiliza el proceso, permitiendo desplegar un clúster utilizando solo dos recursos una vez que se han definido los planos de ClusterClass.
