La API del clúster v1beta1 le permite aprovisionar un clúster en función de una definición ClusterClass predeterminada.

API ClusterClass v1beta1

La API de clúster de Kubernetes es un conjunto de herramientas que admite para aprovisionar, actualizar y operar de forma declarativa los clústeres de Kubernetes. ClusterClass es una evolución de la API de clúster que permite definir plantillas para administrar el ciclo de vida de los conjuntos de clústeres. TKG 2.0 en Supervisor admite ClusterClass mediante la API v1beta1.

TKG 2.0 en Supervisor se incluye con una definición ClusterClass predeterminada denominada tanzukubernetescluster. La definición ClusterClass de tanzukubernetescluster brinda la plantilla para la creación de clústeres de TKG 2.0 en Supervisor mediante la API v1beta. La opción ClusterClass de tanzukubernetescluster se encuentra disponible en todos los espacios de nombres de usuario. Para crear un clúster basado en esta instancia de ClusterClass, haga referencia a esta opción en la especificación del clúster. Consulte los ejemplos de v1beta para obtener instrucciones.

tanzukubernetescluster de ClusterClass predeterminada

La ClusterClass tanzukubernetescluster predeterminada es inmutable. Se proporciona aquí como referencia.
apiVersion: cluster.x-k8s.io/v1beta1
kind: ClusterClass
metadata:
  name: tanzukubernetescluster
  annotations:
    run.tanzu.vmware.com/resolve-tkr: ""
spec:
  controlPlane:
    metadata:
      annotations:
        run.tanzu.vmware.com/resolve-os-image: os-name=photon
    ref:
      apiVersion: controlplane.cluster.x-k8s.io/v1beta1
      kind: KubeadmControlPlaneTemplate
      name: "tkc-control-plane"
    machineInfrastructure:
      ref:
        kind: VSphereMachineTemplate
        apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1
        name: "tkc-control-plane"
    machineHealthCheck:
      maxUnhealthy: 100%
      nodeStartupTimeout: 2h0m0s
      unhealthyConditions:
        - status: Unknown
          timeout: 5m0s
          type: Ready
        - status: "False"
          timeout: 12m0s
          type: Ready
  infrastructure:
    ref:
      apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereClusterTemplate
      name: "tkc-infrastructure"
  workers:
    machineDeployments:
      - class: node-pool  
        template:
          metadata:
            annotations:
              run.tanzu.vmware.com/resolve-os-image: os-name=photon            
          bootstrap:
            ref:
              kind: KubeadmConfigTemplate
              apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
              name: "tkc-md"
          infrastructure:
            ref:
              kind: VSphereMachineTemplate
              apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1
              name: "tkc-md"
        machineHealthCheck:
          maxUnhealthy: 100%
          nodeStartupTimeout: 2h0m0s
          unhealthyConditions:
            - status: Unknown
              timeout: 5m0s
              type: Ready
            - status: "False"
              timeout: 12m0s
              type: Ready
  variables:
    - name: TKR_DATA
      required: false
      schema:
        openAPIV3Schema:
          type: object
          additionalProperties:
            type: object
            properties:
              kubernetesSpec:
                type: object
                properties:
                  version:
                    type: string
                  imageRepository:
                    type: string
                  etcd:
                    type: object
                    properties:
                      imageTag:
                        type: string
                  coredns:
                    type: object
                    properties:
                      imageTag:
                        type: string
              osImageRef:
                type: object
                properties:
                  name:
                    type: string
              labels:
                type: object
                additionalProperties:
                  type: string
    - name: vmClass
      required: true
      schema:
        openAPIV3Schema:
          type: string
    - name: storageClass
      required: true
      schema:
        openAPIV3Schema:
          type: string
    - name: storageClasses
      required: false
      schema:
        openAPIV3Schema:
          type: array
          items:
            type: string
    - name: defaultStorageClass
      required: false
      schema:
        openAPIV3Schema:
          type: string
    - name: extensionCert
      required: false
      schema:
        openAPIV3Schema:
          type: object
          properties:
            contentSecret:
              type: object
              properties:
                name:
                  type: string
                key:
                  type: string
    - name: clusterEncryptionConfigYaml
      required: false
      schema:
        openAPIV3Schema:
          type: string
    - name: defaultRegistrySecret
      required: false
      schema:
        openAPIV3Schema:
          type: object
          properties:
            namespace:
              type: string
            name:
              type: string
            data:
              type: string
    - name: ntp
      required: false
      schema:
        openAPIV3Schema:
          type: string
    - name: user
      required: false
      schema:
        openAPIV3Schema:
          type: object
          properties:
            passwordSecret:
              type: object
              properties:
                name:
                  type: string
                key:
                  type: string
            sshAuthorizedKey:
              type: string
    - name: nodePoolTaints
      required: false
      schema:
        openAPIV3Schema:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
              value:
                type: string
              effect:
                type: string
              timeAdded:
                type: integer
    - name: nodePoolLabels
      required: false
      schema:
        openAPIV3Schema:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
              value:
                type: string
    - name: proxy
      required: false
      schema:
        openAPIV3Schema:
          type: object
          properties:
            httpProxy:
              type: string
            httpsProxy:
              type: string
            noProxy:
              type: array
              items:
                type: string
    - name: trust
      required: false
      schema:
        openAPIV3Schema:
          type: object
          properties:
            additionalTrustedCAs:
              type: array
              items:
                type: object
                properties:
                  name:
                    type: string
    - name: controlPlaneVolumes
      required: false
      schema:
        openAPIV3Schema:
          type: array
          items:
            type: object
            properties:
              storageClass:
                type: string
              mountPath:
                type: string
              name:
                type: string
              capacity:
                type: object
                properties:
                  storage:
                    type: string                   
    - name: nodePoolVolumes
      required: false
      schema:
        openAPIV3Schema:
          type: array
          items:
            type: object
            properties:
              storageClass:
                type: string
              mountPath:
                type: string
              name:
                type: string
              capacity:
                type: object
                properties:
                  storage:
                    type: string

Variables ClusterClass para personalizar un clúster

Un clúster se personaliza en función de la ClusterClass tanzukubernetescluster mediante variables. Las variables se definen mediante pares nombre-valores. La sintaxis debe cumplir el esquema openAPIV3Schema.

Se requieren dos variables para aprovisionar un clúster mediante la API v1beta1:
  • Clase de VM
  • Clase de almacenamiento
Hay variables adicionales disponibles para personalizar un clúster, como las siguientes:
  • Proxy
  • Certificados TLS
  • claves SSH

En las siguientes secciones se enumeran todas las variables que están disponibles con la ClusterClasstanzukubernetescluster predeterminada.

clusterEncryptionConfigYaml

Utilice la variable clusterEncryptionConfigYaml para configurar el cifrado del clúster.

clusterEncryptionConfigYaml
Cadena que es un archivo YAML que proporciona detalles de configuración de cifrado.
Puede configurar el cifrado de datos en la base de datos de etcd mediante el paquete de Configuración de cifrado kube-apiserver. Consulte Cifrar datos secretos en reposo en la documentación de Kubernetes.
...
    variables:
    #clusterEncryptionConfigYaml specifies the base64 encoded 
    #EncryptionConfiguration YAML
    #the YAML contains a base64 encryption configuration for the cluster identity
    #the key is generated randomly
    - name: clusterEncryptionConfigYaml
      value: string which is name of the EncryptionConfiguration YAML 

controlPlaneCertificateRotation

Utilice la variable controlPlaneCertificateRotation para configurar el sistema para que rote los certificados TLS para los nodos del plano de control. Para ello, active una implementación de estos certificados antes de que caduquen. Si se configura, la rotación de certificados del plano de control estará disponible para todos los nodos de plano de control nuevos y existentes.
controlPlaneCertificateRotation
Booleano para activar la función y número de días antes de la caducidad para rotar los certificados (7 días como mínimo antes de su fecha de caducidad). Consulte Rotación automática de certificados mediante el proveedor de plano de control de Kubeadm para obtener más información.
...
    variables:
    - name: controlPlaneCertificateRotation.activate
      value: true (default is false which means not enabled)
    - name: controlPlaneCertificateRotation.daysBefore
      value: EXPIRY-DAYS 

controlPlaneVolumes

Utilice la variable controlPlaneVolumes para configurar volúmenes persistentes para los nodos del plano de control.
controlPlaneVolumes
Matriz opcional de objetos; cada uno de ellos incluye name, storageClass y mountPath, cada uno de los cuales son cadenas, y un objeto capacity opcional que incluye una cadena storage.
...
    variables:
      #controlPlaneVolumes is an optional set of PVCs to create and
      #attach to each node
      - name: controlPlaneVolumes
        value: |
          #name of the PVC to be used as the suffix (node.name)
          - name: NAME
            #mountPath is the directory where the volume device is mounted
            #takes the form /dir/path
            mountPath: /dir/path
            #storageClass is the storage class to use for the PVC
            storageClass: tkg2-storage-profile
            #capacity is the PVC storage capacity
            capacity:
              #storage sets the capacity for the disk volume
              #if not specified defaults to storageClass capacity
              storage: 4Gi           

defaultRegistrySecret

Utilice la variable defaultRegistrySecret para configurar un registro de contenedor predeterminado para el clúster.

defaultRegistrySecret
Objeto que incluye una clave pública, un nombre de certificado y un espacio de nombres para un registro de contenedor predeterminado.
Si habilita el registro de Harbor en Supervisor, la variable defaultRegistrySecret especifica el certificado del servicio de registro en el que confía el clúster. El secreto de certificado se etiqueta con managed-by: vmware-vRegistry. Al crear un clúster, se inserta un certificado defaultRegistry en la variable defaultRegistrySecret. Después de crear el clúster, puede administrar la rotación de certificados o cualquier actualización mediante la actualización manual de la variable.
...
    variables:
    - name: defaultRegistrySecret
      value:
        #data holds the base64 encoded data.ca\.crt content
        #data.ca\.crt is already encoded, so raw cert data is encoded twice
        data: LS0tLS1CRUdJTiBDRVJU...S0tRU5EIENFUlRJRklDQVRFL
        #name specifies the name of the registry cert secret 
        name: harbor-ca-key-pair
        #namespace specifies the ns of the registry cert secret
        namespace: svc-harbor-domain-c9

defaultStorageClass

Utilice la variable defaultStorageClass para configurar una clase de almacenamiento predeterminada para el clúster.

defaultStorageClass
Cadena que identifica qué clase de almacenamiento se debe utilizar como clase de almacenamiento predeterminada, a menudo la requieren ciertas aplicaciones, como gráficos de Helm y paquetes de Tanzu.
...
    variables:
    - name: defaultStorageClass
      value: tkg2-storage-profile

extensionCert

Utilice la variable extensionCert para configurar un certificado TLS.

extensionCert
Objeto que contiene un objeto de contentSecret que contiene cadenas name y key. contentSecret hace referencia a un objeto secreto de Kubernetes que se creó para un certificado TLS.
...
    variables:
    #extensionCert specifies the cert and key for Extensions Controller
    #self-signed issuer and certificates must be created in advance
    - name: extensionCert
      value: 
        contentSecret:
          #name specifies the name of secret
          name: string
          #key specifies the content of tls\.crt in the secret's data map
          key: string

nodePoolLabels

Utilice la variable nodePoolLabels para configurar etiquetas para los nodos de trabajo.

nodePoolLabels
Matriz de uno o varios objetos; cada objeto contiene un par clave/valor y ambos son cadenas.
Las etiquetas le permiten organizar los objetos del sistema según sus requisitos y, de este modo, facilitar las consultas y la generación de informes. Consulte la documentación de etiquetas de Kubernetes para ver detalles sobre el uso.

nodePoolTaints

Utilice la variable nodePoolTaints para aplicar manchas a los nodos de trabajo.

nodePoolTaints
Matriz de objetos; cada objeto contiene un taint que se aplica a los nodos de trabajo.
Cada objeto taint incluye una key (cadena), un value (cadena) y un effect (cadena). El sistema rellena el campo timeAdded durante la creación o la actualización.

nodePoolVolumes

Utilice la variable nodePoolVolumes para especificar volúmenes persistentes para los nodos del clúster.

nodePoolVolumes
Matriz opcional de objetos; cada uno de ellos incluye name, storageClass y mountPath, cada uno de los cuales son cadenas, y un objeto capacity opcional que incluye una cadena storage.
...
    variables:
      #nodePoolVolumes is an optional set of PVCs to create and
      #attach to each node; use for high-churn components like containerd
      - name: nodePoolVolumes
        value: |
          #name of the PVC to be used as the suffix (node.name)
          - name: etcd
            #mountPath is the directory where the volume device is mounted
            #takes the form /dir/path
            mountPath: /var/lib/containerd
            #storageClass is the storage class to use for the PVC
            storageClass: tkg2-storage-profile
            #capacity is the PVC storage capacity
            capacity:
              #storage sets the capacity for the disk volume
              #if not specified defaults to storageClass capacity
              storage: 4Gi           

ntp

Utilice la variable ntp para configurar un servidor NTP para el clúster.

ntp
Cadena que es el FQDN o la dirección IP de un servidor NTP.
La variable NTP especifica el nombre de dominio del servidor NTP como se muestra en el ejemplo. El servidor NTP se inserta en la variable Clúster al crear el clúster. Después de crear el clúster, puede administrar la rotación de nombres de servidor o cualquier actualización mediante la actualización manual de la variable del clúster.
...
    variables:
    - name: ntp
      value: time1.vmware.com

proxy

Utilice la variable proxy para configurar un servidor proxy para el clúster.

proxy
Objeto con parámetros que hacen referencia a un servidor proxy para las conexiones de clústeres salientes.
Los parámetros requeridos del proxy son httpProxy, httpsProxy y noProxy. Los tres campos son obligatorios si incluye la variable proxy en la definición del clúster.
Los campos httpProxy y httpsProxy toman los valores de cadenas que hacen referencia al URI de un servidor proxy que está configurado para administrar las conexiones HTTP y HTTPS salientes desde el clúster de TKG. Puede conectarse al servidor proxy mediante HTTP. No se admiten conexiones HTTPS.
El campo noProxy es una matriz de cadenas. Obtenga los valores noProxy de la red de cargas de trabajo de Supervisor. Debe incluir en el campo noProxy las subredes de red de espacio de nombres, entrada y salida.
No es necesario incluir la subred de servicios en el campo noProxy. El clúster de TKG no interactúa con esta subred.
No es necesario incluir clusterNetwork.services.cidrBlocks y clusterNetwork.pods.cidrBlocks en el campo noProxy. Estos endpoints no son objeto de proxy automáticamente.
No es necesario incluir localhost y 127.0.0.1 en el campo noProxy. Estos endpoints no son objeto de proxy automáticamente.
...
    variables:
    #proxy specifies a proxy server to be used for the cluster
    #if omitted no proxy is configured
    - name: proxy
      value:
        #httpProxy is the proxy URI for HTTP connections
        #to endpoints outside the cluster
        httpProxy: http://<user>:<pwd>@<ip>:<port>
        #httpsProxy is the proxy URL for HTTPS connections 
        #to endpoints outside the cluster
        httpsProxy: http://<user>:<pwd>@<ip>:<port>
        #noProxy is the list of destination domain names, domains, 
        #IP addresses, and other network CIDRs to exclude from proxying
        #must include Supervisor Pod, Egress, Ingress CIDRs
        noProxy: [array of strings, comma-separated]

storageClass

Utilice la variable storageClass para configurar una clase de almacenamiento para el clúster.

storageClass
Cadena que es el nombre de un perfil de almacenamiento de vSphere que se ha asignado al espacio de nombres de vSphere en el que se aprovisiona el clúster de TKG.
...
    variables:
    - name: storageClass
      value: tkg2-storage-profile 
Utilice el siguiente comando para enumerar las clases de almacenamiento disponibles:
kubectl describe namespace VSPHERE-NAMESPACE-NAME
O bien, si tiene privilegios de administrador de vSphere:
kubectl describe storageclasses

storageClasses

Utilice la variable storageClasses para configurar una matriz de clases de almacenamiento para el clúster.

storageClasses
Matriz de una o varias cadenas; cada cadena es el nombre de un perfil de almacenamiento de vSphere que se ha asignado al espacio de nombres de vSphere en el que se aprovisiona el clúster de TKG.
...
    variables:
    - name: storageClasses
      value: [tkg2-storage-profile, tkg2-storage-profile-latebinding] 
Utilice el siguiente comando para enumerar las clases de almacenamiento disponibles:
kubectl describe namespace VSPHERE-NAMESPACE-NAME
O bien, si tiene privilegios de administrador de vSphere:
kubectl describe storageclasses

TKR_DATA

Utilice la variable TKR_DATA para especificar la información de TKR.

TKR_DATA
Objeto que utiliza para especificar la versión de TKR y otros detalles.
version es una cadena con el formato TKR NAME que utilizarán los nodos del clúster.
Solo las TKR que no tengan la etiqueta legacy-tkr son compatibles con TKG en el supervisor de vSphere 9. Consulte Usar versiones de Tanzu Kubernetes con clústeres de TKG en Supervisor.
El sistema operativo predeterminado es PhotonOS. Utilice anotaciones para especificar la TKR de Ubuntu.

trust

Utilice la variable trust para especificar uno o varios certificados de CA de confianza para el clúster.

trust
Objeto para agregar certificados TLS al clúster, ya sean certificados de entidad de certificación adicionales o finales.
El valor es additionalTrustedCAs, que es una matriz de cadenas. Cada cadena es el nombre del secreto de Kubernetes que incluye el contenido del certificado de confianza adicional en la cadena codificada en base64 de formato PEM.
Para configurar una variable trust:
  1. Cree un archivo YAML de definición de secreto de Kubernetes con el siguiente contenido.
    apiVersion: v1
    data:
      additional-ca-1: TFMwdExTMUNSGlSzZ3Jaa...VVNVWkpRMEMwdExTMHRDZz09
    kind: Secret
    metadata:
      name: cluster01-user-trusted-ca-secret
      namespace: tkg-cluster-ns
    type: Opaque
    El contenido de la asignación de datos del secreto es un nombre definido por el usuario para el certificado ( additional-ca-1) cuyo valor es un certificado con doble codificación Base64.
    Nota: Se requiere doble codificación base64. Si el contenido del valor de la asignación de datos no está doblemente codificado con Base64, no se puede procesar el archivo PEM resultante.

    Asigne el secreto CLUSTER-NAME-user-trusted-ca-secret, donde CLUSTER-NAME es el nombre del clúster. Este secreto se debe crear en el mismo espacio de nombres de vSphere que el clúster.

  2. Cree el secreto de Kubernetes mediante kubectl -f apply additional-ca-1.yaml.
  3. Compruebe la creación del secreto.
    kubeclt get secret -n tkg2-cluster-ns cluster01-user-trusted-ca-secret
    NAME                                             TYPE     DATA   AGE
    cluster01-user-trusted-ca-secret                   Opaque   12     2d22h
    
  4. Incluya la variable trust en la especificación del clúster que hace referencia al valor name de la asignación de datos del secreto, que en este ejemplo es additional-ca-1.
    spec:
      clusterNetwork:
        pods:
          cidrBlocks:
          - 193.0.0.0/16
        serviceDomain: cluster.local
        services:
          cidrBlocks:
          - 198.201.0.0/16
      topology:
        class: tanzukubernetescluster
        controlPlane:
          metadata: {}
          replicas: 3
        variables:
        - name: storageClass
          value: tkg-storage-profile
        - name: trust
          value:
            additionalTrustedCAs:
            - name: additional-ca-1

usuario

Utilice la variable user para especificar las credenciales de usuario del clúster.

usuario
Objeto que incluye un objeto passwordSecret, con cadenas de nombre y clave, y una cadena sshAuthorizedKey. Puede utilizar esta variable para agregar la clave SSH de un usuario a los nodos del clúster para el acceso SSH remoto.
La variable Usuario especifica las credenciales de inicio de sesión SSH, incluidas la contraseña y las claves autorizadas. El nombre de usuario de forma predeterminada es vmware-system-user. La contraseña debe estar cifrada con hash y almacenada en un secreto en el mismo espacio de nombres en el que se aprovisiona el clúster. El objeto passwordSecret hace referencia a este secreto. Por ejemplo, en Linux, puede generar un hash seguro mediante mkpasswd --method=SHA-512 --rounds=4096. Consulte Incluir usuarios y grupos para obtener información más detallada.
...
    variables:
    #user specifies an authorized user and credentials
    - name: user
      value:
        #passwordSecret is an object that contains a Kubernetes secret and key
        passwordSecret:
          #name specifies the secret name
          name: string
          #key specifies the key value pair in the secret's data map
          key: string
        sshAuthorizedKey: string that is the base64-encoded public key

vmClass

Utilice la variable vmClass para configurar la clase de máquina virtual para los nodos del clúster.

vmClass
Cadena obligatoria que se asigna al nombre de una clase de máquina virtual que está enlazada al espacio de nombres de vSphere en el que se aprovisiona el clúster de TKG.
vmClass es el nombre de la VirtualMachineClass que describe la configuración del hardware virtual que se utilizará para los nodos del clúster. VirtualMachineClass controla la CPU y la memoria disponibles para el nodo, así como las solicitudes y los límites de esos recursos. Consulte Usar clases de máquinas virtuales con clústeres de TKG en Supervisor.
Solo puede utilizar clases de máquinas virtuales que estén enlazadas al espacio de nombres de vSphere en el que se aprovisiona el clúster de TKG. Utilice el comando kubectl get virtualmachineclassbinding para enumerar las clases enlazadas.
Puede definir la variable vmClass en diferentes ámbitos para poder utilizar diferentes clases de máquina virtual para los nodos de plano de control y los nodos de trabajo del grupo de nodos.
Por ejemplo, aquí una variable vmClass en línea overrides la variable vmClass principal para esta topología de machineDeployment específica.
...
    workers:
      machineDeployments:
      - class: tkg-worker
        name: compute
        replicas: 3
        variables:
          overrides:
          - name: vmClass
            value: guaranteed-large