Consulte estas instrucciones para aprovisionar un clúster de TKG basado en una ClusterClass personalizada. Tenga en cuenta que estas instrucciones son específicas de los entornos de vSphere 8 U2 y versiones posteriores.

Requisitos previos

El procedimiento para aprovisionar un clúster de TKG basado en una ClusterClass personalizada se actualiza para la versión vSphere 8 U2.

Debe cumplir los siguientes requisitos previos.
  • Entorno de vSphere 8 U2 y versiones posteriores
  • Administración de cargas de trabajo habilitada
  • Supervisor configurados
  • Cliente de Ubuntu con Herramientas de la CLI de Kubernetes para vSphere instalado
Atención: La ClusterClass personalizada es una función experimental de Kubernetes según la documentación de la API del clúster ascendente. Debido a la variedad de personalizaciones disponibles con la ClusterClass personalizada, VMware no puede probar ni validar todas las personalizaciones posibles. Los clientes son responsables de probar, validar y solucionar los problemas que puedan surgir en sus clústeres ClusterClass personalizados. Los clientes pueden abrir tickets de soporte relacionados con sus clústeres ClusterClass personalizados. Sin embargo, el soporte de VMware tan solo puede ayudar dentro de unos límites y no puede garantizar la resolución de todos los problemas que se abran para los clústeres ClusterClass personalizados. Los clientes deben tener en cuenta estos riesgos antes de implementar clústeres ClusterClass personalizados en entornos de producción.

Flujos de trabajo de alto nivel

Los flujos de trabajo de alto nivel son los siguientes.

El siguiente flujo de trabajo es todo lo que necesita para comenzar.
Paso Tarea Instrucciones
1 Cree una ClusterClass personalizada mediante la clonación de la ClusterClass predeterminada. 1: Crear una ClusterClass personalizada
2 Aprovisione un nuevo clúster de TKG según la ClusterClass personalizada y compruebe que todos los nodos del clúster aparezcan correctamente. 2: Crear un clúster de TKG basado en la ClusterClass personalizada
Consulte el siguiente flujo de trabajo para realizar cambios en la ClusterClass personalizada e inicie una actualización gradual de los nodos del clúster ClusterClass personalizado.
Nota: La operación que se muestra en el siguiente flujo de trabajo es un ejemplo de lo que se puede hacer con una ClusterClass personalizada. Los casos prácticos pueden ser diferentes, pero se debería poder aplicar el flujo de trabajo general.
Paso Tarea Instrucciones
3 Acceda mediante SSH a uno de los nodos de trabajo para confirmar que hay paquetes que se deben actualizar. 3: Comprobar la existencia de actualizaciones de paquetes
4 Actualice la ClusterClass personalizada con un nuevo comando que realice las actualizaciones. 4: Actualizar la ClusterClass personalizada
5 Confirme la implementación de nodos nuevos con las actualizaciones ya ejecutadas. 5: Comprobar la actualización gradual de los nodos del clúster

1: Crear una ClusterClass personalizada

La primera parte implica la creación de una ClusterClass personalizada denominada ccc (abreviatura de customclusterclass) mediante la clonación de la ClusterClass predeterminada, que se denomina tanzukubernetescluster.
Nota: El nombre de ClusterClass personalizado lo define el usuario. Si utiliza un nombre diferente, ajuste las instrucciones según corresponda.
  1. Cree y configure un espacio de nombres de vSphere denominado ccc-ns.

    Configure los permisos, el almacenamiento, la biblioteca de contenido y las clases de máquinas virtuales. Consulte la documentación según sea necesario.

    Nota: El nombre de espacio de nombres de vSphere lo define el usuario. Si utiliza un nombre diferente, ajuste las instrucciones según corresponda.
  2. Inicie sesión en Supervisor.
    kubectl vsphere login --server=IP-ADDRESS --vsphere-username [email protected]
  3. Escriba el resultado de la ClusterClass predeterminada en un archivo denominado ccc.yaml.
    kubectl -n ccc-ns get clusterclass tanzukubernetescluster -o yaml > ccc.yaml
    O bien, la versión del acceso directo:
    kubectl -n ccc-ns get cc tanzukubernetescluster -o yaml > ccc.yaml
  4. Abra el archivo de la ClusterClass clonada para editarlo.
    vim ccc.yaml
  5. Edite el archivo ccc.yaml.
    • Elimine la línea metadata.creationTimestamp
    • Elimine la línea metadata.generation
    • Elimine la línea metadata.resourceVersion
    • Elimine la línea metadata.uid
    • Cambie el valor de metadata.name en tanzukubernetescluster a ccc
    • Deje el valor de metadata.namespace tal como está: ccc-ns
    • Deje el valor de metadata.annotations tal como está para run.tanzu.vmware.com/resolve-tkr: "". Esta anotación es necesaria para los datos o la resolución de TKR.
  6. Guarde y compruebe los cambios.
    apiVersion: cluster.x-k8s.io/v1beta1
    kind: ClusterClass
    metadata:
      annotations:
        run.tanzu.vmware.com/resolve-tkr: ""
      name: ccc
      namespace: ccc-ns
    spec:
    ...
  7. Cree el objeto de ClusterClass personalizado.
    kubectl apply -f ccc.yaml -n ccc-ns
    Resultado esperado:
    clusterclass.cluster.x-k8s.io/ccc created
  8. Enumere la ClusterClass personalizada.
    kubectl get cc -n ccc-ns
    Resultado esperado:
    NAME                     AGE
    ccc                      3m14s
    tanzukubernetescluster   29m
    

2: Crear un clúster de TKG basado en la ClusterClass personalizada

Utilice la API v1beta1 del clúster para crear un clúster basado en una ClusterClass.
  1. Cree el manifiesto de ccc-cluster.yaml para aprovisionar el clúster.
    #ccc-cluster.yaml
    apiVersion: cluster.x-k8s.io/v1beta1
    kind: Cluster
    metadata:
      name: ccc-cluster
    spec:
      clusterNetwork:
        pods:
          cidrBlocks:
          - 192.0.2.0/16
        services:
          cidrBlocks:
          - 198.51.100.0/12
        serviceDomain: cluster.local
      topology:
        class: ccc
        version: v1.26.5---vmware.2-fips.1-tkg.1
        controlPlane:
          replicas: 1
        workers:
          machineDeployments:
            - class: node-pool
              name: tkgs-node-pool-1
              replicas: 1
        variables:
        - name: vmClass
          value: guaranteed-small
        - name: storageClass
          value: tkg-storage-profile
    Donde:
    • El valor de metadata.name es el nombre del clúster: ccc-cluster
    • El valor de spec.topology.class es el nombre de la ClusterClass personalizada: ccc
    • El valor de spec.topology.version es la versión de TKR
    • El valor de spec.topology.variables.storageClass es el nombre de la clase de almacenamiento persistente
    Nota: Para fines de prueba, 1 réplica es suficiente para el plano de control y el grupo de nodos de trabajo. En producción, utilice 3 réplicas para el plano de control y al menos 3 réplicas para cada grupo de nodos de trabajo.
  2. Cree el clúster de TKG en función de la ClusterClass personalizada.
    kubectl apply -f ccc-cluster.yaml -n ccc-ns
    Resultado esperado:
    cluster.cluster.x-k8s.io/ccc-cluster created
  3. Compruebe el aprovisionamiento del clúster.
    Ejecute el siguiente comando. Espere a que todos los nodos del clúster aparezcan correctamente.
    kubectl -n ccc-ns get cc,clusters,vsphereclusters,kcp,machinedeployment,machineset,machine,vspheremachine,virtualmachineservice
    Nota: Resultará útil ejecutar este comando en una sesión independiente para que pueda supervisar el progreso de la actualización gradual en el paso 5.

3: Comprobar la existencia de actualizaciones de paquetes

Acceda mediante SSH a uno de los nodos de trabajo para confirmar que hay paquetes que se deben actualizar.
Nota: El objetivo de este paso simplemente es confirmar que hay paquetes para actualizar, no actualizarlos realmente. La ClusterClass personalizada los actualizará cuando se implementen nodos del clúster nuevos (los pasos que siguen a continuación). Este paso y los que se indican a continuación deben ser un ejemplo de lo que se puede hacer con una ClusterClass personalizada.
  1. Ejecute el siguiente comando para obtener el secreto de SSH.
    export CC=ccc-cluster && kubectl get secret -n ccc-ns ${CC}-ssh -o jsonpath={.data.ssh-privatekey} | base64 -d > ${CC}-ssh && chomd 4000 ${CC}-ssh
  2. Ejecute el siguiente comando para obtener la dirección IP de la máquina virtual del nodo de trabajo.
    kubectl -n ccc-ns get vm -o wide
    Nota: Si implementó varios nodos de trabajo, elija uno. No utilice un nodo de plano de control.
  3. Ejecute el siguiente comando para utilizar SSH en la máquina virtual del nodo de trabajo.
    ssh -i ${CC}-ssh vmware-system-user@IP-ADDRESS-OF-WORKER-NODE
    Por ejemplo:
    ssh -i ${CC}-ssh [email protected]
    Nota: Introduzca "yes" para continuar con la conexión.
    Resultado esperado: después de utilizar SSH en el host, debería ver el siguiente mensaje.
    tdnf update info not availble yet!
  4. Ejecute los siguientes comandos y compruebe si hay actualizaciones.
    sudo -i
    tdnf update
  5. En el símbolo del sistema, introduzca "N" para no (no actualizar).
    Resultado esperado:
    Operation aborted
    Nota: El propósito aquí es simplemente comprobar si hay actualizaciones, no iniciar las actualizaciones. Para iniciar las actualizaciones, agregue un comando a la ClusterClass personalizada en la siguiente sección.
  6. Escriba "exit" para cerrar la sesión de SSH y, a continuación, vuelva a escribir "exit".

4: Actualizar la ClusterClass personalizada

Actualice la ClusterClass personalizada con un comando nuevo que realice una actualización de tdnf.
  1. Abra la ClusterClass personalizada denominada ccc para editarla.
    kubectl edit cc ccc -n ccc-ns
  2. Desplácese hacia abajo hasta la siguiente sección con postKubeadmCommands.
      - definitions:
        - jsonPatches:
          - op: add
            path: /spec/template/spec/kubeadmConfigSpec/postKubeadmCommands
            valueFrom:
              template: |
                - touch /root/kubeadm-complete
                - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete'
                - vmware-rpctool 'info-set guestinfo.kubeadm.error ---'
          selector:
            apiVersion: controlplane.cluster.x-k8s.io/v1beta1
            kind: KubeadmControlPlaneTemplate
            matchResources:
              controlPlane: true
        - jsonPatches:
          - op: add
            path: /spec/template/spec/postKubeadmCommands
            valueFrom:
              template: |
                - touch /root/kubeadm-complete
                - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete'
                - vmware-rpctool 'info-set guestinfo.kubeadm.error ---'
          selector:
            apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
            kind: KubeadmConfigTemplate
            matchResources:
              machineDeploymentClass:
                names:
                - node-pool
        name: controlPlanePostKubeadmCommandsSuccess
    
    Agregue el siguiente comando en ambos campos valueFrom.template.
    - tdnf update -y
    Por ejemplo:
      - definitions:
        - jsonPatches:
          - op: add
            path: /spec/template/spec/kubeadmConfigSpec/postKubeadmCommands
            valueFrom:
              template: |
                - touch /root/kubeadm-complete
                - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete'
                - vmware-rpctool 'info-set guestinfo.kubeadm.error ---'
                - tdnf update -y
          selector:
            apiVersion: controlplane.cluster.x-k8s.io/v1beta1
            kind: KubeadmControlPlaneTemplate
            matchResources:
              controlPlane: true
        - jsonPatches:
          - op: add
            path: /spec/template/spec/postKubeadmCommands
            valueFrom:
              template: |
                - touch /root/kubeadm-complete
                - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete'
                - vmware-rpctool 'info-set guestinfo.kubeadm.error ---'
                - tdnf update -y
          selector:
            apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
            kind: KubeadmConfigTemplate
            matchResources:
              machineDeploymentClass:
                names:
                - node-pool
        name: controlPlanePostKubeadmCommandsSuccess
    
  3. Guarde los cambios en la ClusterClass personalizada y cierre el editor.
    wq
    Resultado esperado:
    clusterclass.cluster.x-k8s/ccc edited

5: Comprobar la actualización gradual de los nodos del clúster

La actualización de ClusterClass personalizada activa una actualización gradual de los nodos del clúster para los clústeres aprovisionados en función de esa ClusterClass. Los nodos nuevos aparecen cuando se aplica el comando anterior.
  1. Para comprobar el aprovisionamiento del clúster, ejecute el siguiente comando.
    Espere a que todos los nodos del clúster aparezcan correctamente.
    kubectl -n ccc-ns get cc,clusters,vsphereclusters,kcp,machinedeployment,machineset,machine,vspheremachine,virtualmachineservice
  2. Debería ver que se implementen nodos nuevos con UUID nuevos.
  3. Ejecute el siguiente comando para utilizar SSH en la máquina virtual del nodo de trabajo.
    ssh -i ${CC}-ssh vmware-system-user@IP-ADDRESS-OF-WORKER-NODE
    Resultado esperado: después de utilizar SSH en el host, debería ver el siguiente mensaje.
    tdnf update info not availble yet!
  4. Ejecute los siguientes comandos.
    sudo -i
    tdnf update

    Resultado esperado: debería ver muchos menos paquetes que deben actualizarse.

  5. En el símbolo del sistema, introduzca "N" para no (no actualizar).
    Resultado esperado:
    Operation aborted
  6. Ejecute el siguiente comando para confirmar que tdnf se ejecutó.
    cat /var/log/cloud-init-output.log | grep -i tdnf
  7. Escriba "exit" para cerrar la sesión de SSH y, a continuación, vuelva a escribir "exit".

Mantenimiento de una ClusterClass personalizada

Después de actualizar el Servicio TKG a una nueva versión, debe asegurarse de que la ClusterClass personalizada derivada de la ClusterClass predeterminada de la versión de Servicio TKG anterior se actualice con los cambios para la ClusterClass predeterminada que se enviaron con la nueva versión de Servicio TKG.

Utilice el siguiente flujo de trabajo para mantener la ClusterClass personalizada sincronizada con la ClusterClass proporcionada por el sistema. Tenga en cuenta que estas instrucciones asumen que creó una ClusterClass personalizada inicial como se describe aquí.
  1. Actualizar la versión de Servicio TKG.

    Por ejemplo, actualice de Servicio TKG v3.0 a v3.1.

    Consulte Instalar y actualizar Servicio TKG.

  2. Cree una nueva ClusterClass personalizada siguiendo las instrucciones de este documento.

    Cree manualmente una versión de la nueva ClusterClass personalizada anexando a su nombre la versión de Servicio TKG, como ccc-3.1.

  3. Agregue las variables y las revisiones personalizadas de la ClusterClass personalizada anterior a la nueva ClusterClass personalizada.

    Para ello, abra cat ccc.yaml y copie las variables y las revisiones personalizadas desde ese archivo a ccc-3.1.yaml.

  4. Aplique la nueva ClusterClass personalizada y espere a que la reconciliación se realice correctamente.
  5. Para actualizar los clústeres de TKG mediante la ClusterClass personalizada anterior al nuevo ClusterClass personalizado, edite el campo spec.topology.class en el objeto Cluster.

ClusterClass no administrada

Para vSphere 8 U2 y posterior, hay una anotación que puede agregar a una ClusterClass personalizada si no desea que la controladora TKG la administre. Tenga en cuenta que, si agrega esta anotación, será responsable de crear manualmente todos los objetos de Kubernetes subyacentes, como certificados, secretos, etc. Consulte la documentación de ClusterClass personalizada de vSphere 8 U1 para obtener instrucciones sobre cómo hacerlo.

La anotación es la siguiente:
Clave de anotación Valor
run.tanzu.vmware.com/unmanaged-clusterclass " "
A continuación, se muestra un ejemplo de cómo agregaría la anotación a la ClusterClass personalizada denominada ccc:
apiVersion: cluster.x-k8s.io/v1beta1
kind: ClusterClass
metadata:
  annotations:
    run.tanzu.vmware.com/resolve-tkr: ""
    run.tanzu.vmware.com/unmanaged-clusterclass: ""
  name: ccc
  namespace: ccc-ns
spec:
...