A API do Cluster v1beta1 permite provisionar um Cluster com base em uma definição ClusterClass padrão.

API ClusterClass v1beta1

A API de cluster do Kubernetes é um conjunto de ferramentas que fornece o provisionamento, a atualização e a operação declarativos de clusters do Kubernetes. ClusterClass é uma evolução da API de cluster que permite definir modelos para gerenciar o ciclo de vida de conjuntos de clusters. O TKG 2 em Supervisor é compatível com ClusterClass usando a API v1beta1.

O TKG 2 em Supervisor é fornecido com uma definição ClusterClass padrão chamada tanzukubernetescluster. O tanzukubernetescluster ClusterClass fornece o modelo para a criação de cluster do TKG 2 em Supervisor usando a API v1beta. O tanzukubernetescluster ClusterClass está disponível em todos os namespaces de usuário. Para criar um cluster com base nesse ClusterClass, faça referência a ele na especificação Cluster. Consulte os exemplos da v1beta para obter orientação.

Padrão ClusterClass tanzukubernetescluster

O padrão tanzukubernetescluster ClusterClass é imutável. Ele é fornecido aqui como referência.
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

Variáveis ClusterClass para personalizar um cluster

Você personaliza um Cluster com base no tanzukubernetescluster ClusterClass usando variáveis. As variáveis são definidas usando pares nome-valor. A sintaxe deve estar em conformidade com o openAPIV3Schema.

Duas variáveis são necessárias para provisionar um cluster usando a API v1beta1:
  • Classe de VM
  • Classe de armazenamento
Variáveis adicionais estão disponíveis para personalizar um cluster, como:
  • Proxy
  • Certificados TLS
  • Chaves SSH

As seções a seguir listam todas as variáveis que estão disponíveis com o padrão tanzukubernetescluster ClusterClass.

clusterEncryptionConfigYaml

Use a variável clusterEncryptionConfigYaml para configurar a criptografia do cluster.

clusterEncryptionConfigYaml
String, que é um arquivo YAML que fornece detalhes de configuração de criptografia.
Você pode configurar a criptografia de dados no banco de dados etcd usando o pacote kube-apiserver Encryption Configuration. Consulte Criptografia de dados secretos em repouso na documentação do 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 

controlPlaneVolumes

Use a variável controlPlaneVolumes para configurar volumes persistentes para nós do plano de controle.
controlPlaneVolumes
Matriz opcional de objetos, cada um dos quais inclui name, storageClass e mountPath, cada um dos quais são sequências de caracteres, e um objeto capacity opcional que inclui uma sequência de caracteres storage.
...
    variables:
      #controlPlaneVolumes is an optional set of PVCs to create and
      #attach to each node; use for high-churn components like etcd
      - name: controlPlaneVolumes
        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/etcd
            #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

Use a variável defaultRegistrySecret para configurar um registro de contêiner padrão para o cluster.

defaultRegistrySecret
Objeto que inclui uma chave pública, um nome de certificado e um namespace para um registro de contêiner padrão.
Se você ativar o Harbour Registry em Supervisor, a variável defaultRegistrySecret especificará o certificado do serviço de registro no qual o cluster confia. O segredo do certificado é rotulado com managed-by: vmware-vRegistry. Na criação do cluster, um certificado defaultRegistry é injetado na variável defaultRegistrySecret. Após a criação do cluster, você gerencia a rotação de certificados ou qualquer atualização atualizando manualmente a variável.
...
    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

Use a variável defaultStorageClass para configurar uma classe de armazenamento padrão para o cluster.

defaultStorageClass
String que identifica qual classe de armazenamento deve ser usada como a classe de armazenamento padrão, geralmente exigida por determinados aplicativos, como gráficos do Helm e Pacotes Tanzu.
...
    variables:
    - name: defaultStorageClass
      value: tkg2-storage-profile

extensionCert

Use a variável extensionCert para configurar um certificado TLS.

extensionCert
Objeto que contém um objeto contentSecret que contém as sequências de caracteres name e key. O contentSecret faz referência a um objeto secreto do Kubernetes que foi criado para um 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

Use a variável nodePoolLabels para configurar rótulos para nós de trabalhador.

nodePoolLabels
Matriz de um ou mais objetos, cada objeto contendo um par chave/valor, sendo que ambos são cadeias de caracteres.
Os rótulos permitem que você organize objetos do sistema de acordo com seus requisitos para facilitar as consultas e os relatórios. Consulte a documentação de rótulos do Kubernetes para obter detalhes de uso.

nodePoolTaints

Use a variável nodePoolTaints para aplicar manchas nos nós do trabalhador.

nodePoolTaints
Matriz de objetos, cada objeto contém um taint que se aplica aos nós do trabalhador.
Cada objeto de contaminação inclui um key (string), um value (string) e um effect (string). O sistema preenche o campo timeAdded na criação ou atualização.

nodePoolVolumes

Use a variável nodePoolVolumes para especificar volumes persistentes para nós de cluster.

nodePoolVolumes
Matriz opcional de objetos, cada um dos quais inclui name, storageClass e mountPath, cada um dos quais são sequências de caracteres, e um objeto capacity opcional que inclui uma sequência de caracteres 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

Use a variável ntp para configurar um servidor NTP para o cluster.

ntp
String que é o FQDN ou o endereço IP de um servidor NTP.
A variável NTP especifica o nome de domínio do servidor NTP, conforme mostrado no exemplo. O servidor NTP é injetado na variável Cluster na criação do cluster. Após a criação do cluster, você gerencia a rotação do nome do servidor ou qualquer atualização atualizando manualmente a variável de cluster.
...
    variables:
    - name: ntp
      value: time1.vmware.com

procurador

Use a variável proxy para configurar um servidor proxy para o cluster.

procurador
Objeto com parâmetros que fazem referência a um servidor proxy para conexões de cluster de saída.
Os parâmetros proxy necessários são httpProxy, httpsProxy e noProxy. Todos os três campos são obrigatórios se você incluir a variável proxy na definição do cluster.
Os campos httpProxy e httpsProxy aceitam valores de cadeia de caracteres que fazem referência ao URI de um servidor proxy configurado para gerenciar conexões HTTP e HTTPS de saída do cluster TKG. Você pode se conectar ao servidor proxy usando HTTP. Não há suporte para conexões HTTPS.
O campo noProxy é uma matriz de cadeias de caracteres. Obtenha os valores noProxy da SupervisorWorkload Network. Você deve incluir no campo noProxy as sub-redes Rede de Namespace, Entrada e Saída.
Você não precisa incluir a sub-rede Serviços no campo noProxy. O cluster TKG não interage com esta sub-rede.
Você não precisa incluir o clusterNetwork.services.cidrBlocks e o clusterNetwork.pods.cidrBlocks no campo noProxy. Esses endpoints não são automaticamente processados por proxy para você.
Você não precisa incluir localhost e 127.0.0.1 no campo noProxy. Esses endpoints não são automaticamente processados por proxy para você.
...
    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

Use a variável storageClass para configurar uma classe de armazenamento para o cluster.

storageClass
String que é o nome de um perfil de armazenamento vSphere que foi atribuído ao vSphere Namespace em que o cluster TKG é provisionado.
...
    variables:
    - name: storageClass
      value: tkg2-storage-profile 
Use o seguinte comando para listar as classes de armazenamento disponíveis:
kubectl describe namespace VSPHERE-NAMESPACE-NAME
Ou, se você tiver vSphere privilégios de administrador:
kubectl describe storageclasses

storageClasses

Use a variável storageClasses para configurar uma matriz de classes de armazenamento para o cluster.

storageClasses
Matriz de uma ou mais sequências, sendo cada sequência o nome de um perfil de armazenamento vSphere que foi atribuído ao vSphere Namespace em que o cluster TKG é provisionado.
...
    variables:
    - name: storageClasses
      value: [tkg2-storage-profile, tkg2-storage-profile-latebinding] 
Use o seguinte comando para listar as classes de armazenamento disponíveis:
kubectl describe namespace VSPHERE-NAMESPACE-NAME
Ou, se você tiver vSphere privilégios de administrador:
kubectl describe storageclasses

TKR_DATA

Use a variável TKR_DATA para especificar informações de TKR.

TKR_DATA
Objeto que você usa para especificar a versão do TKR e outros detalhes.
O version é uma cadeia de caracteres no formato TKR NAME a ser usada pelos nós do cluster.
Somente os TKRs que não têm o rótulo legacy-tkr são compatíveis com o TKG 2. Consulte Usando versões do Tanzu Kubernetes com clusters TKG 2 no Supervisor.
O sistema operacional padrão é o PhotonOS. Use anotações para especificar o Ubuntu TKR.

confiar

Use a variável trust para especificar um ou mais certificados de autoridade de certificação confiáveis para o cluster.

confiar
Objeto para adicionar certificados TLS ao Cluster, CAs adicionais ou certificados finais.
O valor é AdditionalTrustedCAs, que é uma matriz de cadeias de caracteres. Cada string é o nome do segredo do Kubernetes que contém o conteúdo do certificado confiável adicional na string codificada em base64 do formato PEM.
Para configurar uma variável trust:
  1. Crie um arquivo YAML de definição de segredo do Kubernetes com o seguinte conteúdo.
    apiVersion: v1
    data:
      additional-ca-1: TFMwdExTMUNSGlSzZ3Jaa...VVNVWkpRMEMwdExTMHRDZz09
    kind: Secret
    metadata:
      name: cluster01-user-trusted-ca-secret
      namespace: tkg2-cluster-ns
    type: Opaque
    O conteúdo do mapa de dados do segredo é um nome definido pelo usuário para o certificado ( additional-ca-1) cujo valor é um certificado codificado em base64 dupla.
    Observação: A codificação base64 dupla é necessária. Se o conteúdo do valor do mapa de dados não for codificado em base6 dupla, o arquivo PEM resultante não poderá ser processado.

    Nomeie o segredo CLUSTER-NAME-user-trusted-ca-secret, em que CLUSTER-NAME é o nome do cluster. Esse segredo deve ser criado no mesmo vSphere Namespace que o cluster.

  2. Crie o segredo do Kubernetes usando kubectl -f apply additional-ca-1.yaml.
  3. Verifique a criação do segredo.
    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. Inclua a variável trust na especificação de cluster que faz referência ao valor name do mapa de dados para o segredo, que neste exemplo é 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: tkg2-storage-profile
        - name: trust
          value:
            additionalTrustedCAs:
            - name: additional-ca-1

usuário

Use a variável user para especificar as credenciais do usuário do cluster.

usuário
Objeto que inclui um objeto passwordSecret, com cadeias de caracteres de nome e chave, e a cadeia de caracteres sshAuthorizedKey. Você pode usar essa variável para adicionar a chave SSH de um usuário aos nós de cluster para acesso SSH remoto.
A variável User especifica as credenciais de login do SSH, incluindo a senha e as chaves autorizadas. O nome de usuário por padrão é vmware-system-user. A senha precisa ter um hash e ser armazenada em um segredo no mesmo namespace em que o cluster é provisionado. O objeto passwordSecret faz referência a esse segredo. Por exemplo, no Linux, você pode gerar um hash seguro usando mkpasswd --method=SHA-512 --rounds=4096. Consulte Incluindo usuários e grupos para obter detalhes.
...
    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

Use a variável vmClass para configurar a classe de VM para nós de cluster.

vmClass
String necessária que é mapeada para o nome de uma classe de VM que está associada ao vSphere Namespace em que o cluster TKG é provisionado.
vmClass é o nome do VirtualMachineClass que descreve as configurações de hardware virtual a serem usadas para nós de cluster. O VirtualMachineClass controla a CPU e a memória disponíveis para o nó e as solicitações e os limites desses recursos. Consulte Usando classes de máquina virtual com clusters TKG 2 em Supervisor.
Você só pode usar classes de VM que estão associadas ao vSphere Namespace em que o cluster TKG está sendo provisionado. Use o comando kubectl get virtualmachineclassbinding para listar as classes associadas.
É possível definir a variável vmClass em diferentes escopos para que você possa usar diferentes classes de VM para nós do plano de controle e nós do trabalhador do pool de nós.
Por exemplo, aqui uma variável vmClass embutida overrides é a variável vmClass primária para esta topologia machineDeployment específica.
...
    workers:
      machineDeployments:
      - class: tkg-worker
        name: compute
        replicas: 3
        variables:
          overrides:
          - name: vmClass
            value: guaranteed-large