Crea un cluster condiviso per eseguire carichi di lavoro dei container

Questo documento spiega come creare un cluster Kubernetes condiviso in una zona air-gapped di Google Distributed Cloud (GDC). Un cluster condiviso si estende su più progetti e include servizi gestiti da GDC completi che offrono una configurazione del cluster Kubernetes altamente opinionata e meno configurabile rispetto al cluster standard. Per saperne di più sui cluster standard, consulta Configurazione dei cluster Kubernetes.

I cluster condivisi sono una risorsa di zona e non possono estendersi su più zone. Per utilizzare i cluster in un universo multizona, devi creare manualmente i cluster in ogni zona.

Questo documento è destinato a un pubblico come gli sviluppatori di applicazioni all'interno del gruppo di operatori di applicazioni, responsabili della gestione dei carichi di lavoro con container all'interno della propria organizzazione. Per saperne di più, consulta Pubblico per la documentazione air-gapped di GDC.

Prima di iniziare

  • Per la maggior parte dei casi d'uso, valuta la possibilità di utilizzare cluster standard per ospitare i carichi di lavoro con container. I cluster standard sono i più allineati con le autorizzazioni e le funzionalità delle offerte Kubernetes tipiche. Per saperne di più sulle differenze tra cluster condivisi e standard, consulta Opzioni di configurazione.

  • Per ottenere le autorizzazioni necessarie per creare un cluster condiviso, chiedi all'amministratore IAM dell'organizzazione di concederti il ruolo Amministratore del cluster utente (user-cluster-admin). Questo ruolo non è vincolato a uno spazio dei nomi.

  • Per utilizzare l'API o Terraform per creare un cluster condiviso, genera il file kubeconfig del server API di zona per ospitare il cluster. Per saperne di più, consulta Accedere. Imposta la variabile di ambiente MANAGEMENT_API_SERVER sul percorso kubeconfig.

  • Prima di creare un cluster, esamina i limiti dei cluster per le considerazioni sulle risorse.

    • Ti consigliamo di creare almeno tre nodi worker per consentire gli upgrade e gli aggiornamenti del cluster.
    • Per motivi di gestibilità, ti consigliamo di mantenere meno di 20 nodi worker.
    • Per la manutenibilità e la longevità del cluster, ti consigliamo di eseguire il deployment dell'ultima versione di Kubernetes disponibile sulla piattaforma.

Pianificare il blocco CIDR dei pod

Per allocare il blocco CIDR dei pod di dimensioni appropriate per i carichi di lavoro, devi calcolare la quantità di indirizzi IP necessari per il cluster Kubernetes prima di crearlo. La maggior parte dei parametri di rete non può essere modificata dopo la creazione del cluster.

Un cluster Kubernetes segue la logica di elaborazione quando alloca gli indirizzi IP:

  • Kubernetes assegna un blocco CIDR /24 composto da 256 indirizzi a ciascuno dei nodi. Questo importo rispetta il valore massimo predefinito di 110 pod per nodo per i cluster Kubernetes.
  • Le dimensioni del blocco CIDR assegnato a un nodo dipendono dal valore massimo di pod per nodo.
  • Il blocco contiene sempre almeno il doppio degli indirizzi rispetto al numero massimo di pod per nodo.

Vedi l'esempio seguente per capire come è stato calcolato il valore predefinito di Per node mask size= /24 per ospitare 110 pod:

Maximum pods per node = 110
Total number of IP addresses required = 2 * 110 = 220

Per node mask size = /24
Number of IP addresses in a /24 = 2(32 - 24) = 256

Determina la maschera CIDR dei pod richiesta da configurare per il cluster Kubernetes in base al numero di nodi richiesto. Pianifica le aggiunte future di nodi al cluster durante la configurazione dell'intervallo CIDR:

  Total number of nodes supported = 2(Per node mask size - pod CIDR mask)

Dato che esiste un valore predefinito Per node mask size= /24 , consulta la seguente tabella che mappa la maschera CIDR dei pod al numero di nodi supportati.

Maschera CIDR dei pod Calcolo: 2(Per node mask size - CIDR mask) Numero massimo di nodi supportati, inclusi i nodi del piano di controllo
/21 2(24 - 21) 8
/20 2(24-20) 16
/19 2(24 - 19) 32
/18 2(24 - 18) 64

Dopo aver calcolato il blocco CIDR dei pod per il cluster Kubernetes, configurarlo come parte del flusso di lavoro di creazione del cluster nella sezione successiva.

Creare un cluster condiviso

Completa i seguenti passaggi per creare un cluster Kubernetes condiviso:

Console

  1. Nel menu di navigazione, seleziona Kubernetes Engine > Cluster.

  2. Fai clic su Crea cluster.

  3. Nel campo Nome, specifica un nome per il cluster.

  4. Seleziona la versione di Kubernetes per il cluster.

  5. Seleziona la zona in cui creare il cluster.

  6. Fai clic su Collega progetto e seleziona un progetto esistente da collegare al cluster. Quindi, fai clic su Salva. Puoi collegare o scollegare i progetti dopo aver creato il cluster dalla pagina dei dettagli del progetto. Prima di eseguire il deployment dei carichi di lavoro con container, devi collegare un progetto al cluster.

    Crea un cluster utilizzando la console.

  7. Fai clic su Avanti.

  8. Configura le impostazioni della rete per il cluster. Non puoi modificare queste impostazioni della rete dopo aver creato il cluster. Il protocollo internet predefinito e unico supportato per i cluster Kubernetes è Internet Protocol versione 4 (IPv4).

    1. Se vuoi creare nodi del bilanciatore del carico dedicati, inserisci il numero di nodi da creare. Per impostazione predefinita, ricevi zero nodi e il traffico del bilanciatore del carico passa attraverso i nodi di controllo.

    2. Seleziona il CIDR del servizio (Classless Inter-Domain Routing) da utilizzare. Ai servizi di cui hai eseguito il deployment, come i bilanciatori del carico, vengono allocati indirizzi IP da questo intervallo.

    3. Seleziona il CIDR dei pod da utilizzare. Il cluster alloca gli indirizzi IP da questo intervallo ai pod e alle VM.

    4. Fai clic su Avanti.

  9. Esamina i dettagli del pool di nodi predefinito generato automaticamente per il cluster. Fai clic su Modifica per modificare il pool di nodi predefinito.

  10. Per creare pool di nodi aggiuntivi, seleziona Aggiungi pool di nodi. Quando modifichi il pool di nodi predefinito o aggiungi un nuovo pool di nodi, puoi personalizzarlo con le seguenti opzioni:

    1. Assegna un nome al pool di nodi. Non puoi modificare il nome dopo aver creato il pool di nodi.
    2. Specifica il numero di nodi worker da creare nel pool di nodi.
    3. Seleziona la classe di macchina più adatta ai requisiti del tuo carico di lavoro. Visualizza l'elenco delle seguenti impostazioni:

      • Tipo di macchina
      • CPU
      • Memoria
    4. Fai clic su Salva.

  11. Fai clic su Crea per creare il cluster.

La creazione del cluster condiviso può richiedere fino a 90 minuti.

API

  1. Crea la risorsa personalizzata Cluster:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: platform
    spec:
      clusterNetwork:
        podCIDRSize: POD_CIDR
        serviceCIDRSize: SERVICE_CIDR
      initialVersion:
        kubernetesVersion: KUBERNETES_VERSION
      nodePools:
      - machineTypeName: MACHINE_TYPE
        name: NODE_POOL_NAME
        nodeCount: NUMBER_OF_WORKER_NODES
        taints: TAINTS
        labels: LABELS
        acceleratorOptions:
          gpuPartitionScheme: GPU_PARTITION_SCHEME
      releaseChannel:
        channel: UNSPECIFIED
    EOF
    

    Sostituisci quanto segue:

    • MANAGEMENT_API_SERVER: il percorso kubeconfig del server API di zona.
    • CLUSTER_NAME: il nome del cluster. Il nome del cluster non deve terminare con -system. Il suffisso -system è riservato ai cluster creati da GDC.
    • POD_CIDR: le dimensioni degli intervalli di rete da cui vengono allocati gli indirizzi IP virtuali dei pod. Se non viene configurato, viene utilizzato un valore predefinito 21.
    • SERVICE_CIDR: le dimensioni degli intervalli di rete da cui vengono allocati gli indirizzi IP virtuali dei servizi. Se non viene configurato, viene utilizzato un valore predefinito 23.
    • KUBERNETES_VERSION: la versione di Kubernetes del cluster, ad esempio 1.26.5-gke.2100. Per elencare le versioni di Kubernetes disponibili da configurare, consulta Elencare le versioni di Kubernetes disponibili per un cluster.
    • MACHINE_TYPE: il tipo di macchina per i nodi worker del pool di nodi. Visualizza i tipi di macchina disponibili per la configurazione.
    • NODE_POOL_NAME: il nome del pool di nodi.
    • NUMBER_OF_WORKER_NODES: il numero di nodi worker di cui eseguire il provisioning nel pool di nodi.
    • TAINTS: le incompatibilità da applicare ai nodi di questo pool di nodi. Questo è un campo facoltativo.
    • LABELS: le etichette da applicare ai nodi di questo pool di nodi. Contiene un elenco di coppie chiave-valore. Questo è un campo facoltativo.
    • GPU_PARTITION_SCHEME: lo schema di partizionamento della GPU, se esegui carichi di lavoro GPU. Questo è un campo facoltativo. Ad esempio, mixed-2. Se questo campo non è impostato, la GPU non viene partizionata. Per saperne di più sui profili MIG (Multi-Instance GPU) disponibili, consulta Profili MIG supportati.

    La creazione del cluster condiviso può richiedere fino a 90 minuti.

  2. Crea la risorsa personalizzata ProjectBinding:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: resourcemanager.gdc.goog/v1
    kind: ProjectBinding
    metadata:
      name: CLUSTER_NAME-PROJECT_NAME
      namespace: platform
      labels:
        resourcemanager.gdc.goog/projectbinding-for-user-project: "true"
    spec:
      clusterRef:
        name: CLUSTER_NAME
      selector:
        nameSelector:
          matchNames:
          - PROJECT_NAME
    EOF
    

    Sostituisci quanto segue:

    • MANAGEMENT_API_SERVER: il percorso kubeconfig del server API di zona.
    • CLUSTER_NAME: il nome del cluster.
    • PROJECT_NAME: il nome del progetto a cui eseguire il binding. Ogni risorsa ProjectBinding può essere mappata a un solo cluster. Se un progetto richiede l'accesso a più cluster, è necessario creare un ProjectBinding univoco per ogni cluster.

    Prima che uno sviluppatore possa eseguire il deployment dei carichi di lavoro con container nel cluster, devi collegare un progetto al cluster.

Terraform

  1. In un file di configurazione di Terraform, inserisci il seguente snippet di codice per creare la risorsa personalizzata Cluster:

    provider "kubernetes" {
      config_path = "MANAGEMENT_API_SERVER"
    }
    
    resource "kubernetes_manifest" "CLUSTER_RESOURCE_NAME" {
      manifest = {
        "apiVersion" = "cluster.gdc.goog/v1"
        "kind" = "Cluster"
        "metadata" = {
          "name" = "CLUSTER_NAME"
          "namespace" = "platform"
        }
        "spec" = {
          "clusterNetwork" = {
            "podCIDRSize" = "POD_CIDR"
            "serviceCIDRSize" = "SERVICE_CIDR"
          }
          "initialVersion" = {
            "kubernetesVersion" = "KUBERNETES_VERSION"
          }
          "nodePools" = [{
            "machineTypeName" = "MACHINE_TYPE"
            "name" = "NODE_POOL_NAME"
            "nodeCount" = "NUMBER_OF_WORKER_NODES"
            "taints" = "TAINTS"
            "labels" = "LABELS"
            "acceleratorOptions" = {
              "gpuPartitionScheme" = "GPU_PARTITION_SCHEME"
            }
          }]
          "releaseChannel" = {
            "channel" = "UNSPECIFIED"
          }
        }
      }
    }
    

    Sostituisci quanto segue:

    • MANAGEMENT_API_SERVER: il percorso kubeconfig del server API di zona.
    • CLUSTER_RESOURCE_NAME: il nome della risorsa Terraform univoca del cluster, ad esempio cluster-1. Questo nome viene utilizzato da Terraform per identificare il cluster e non viene utilizzato da GDC.
    • CLUSTER_NAME: il nome del cluster. Il nome del cluster non deve terminare con -system. Il suffisso -system è riservato ai cluster creati da GDC.
    • POD_CIDR: le dimensioni degli intervalli di rete da cui vengono allocati gli indirizzi IP virtuali dei pod. Se non viene configurato, viene utilizzato un valore predefinito 21.
    • SERVICE_CIDR: le dimensioni degli intervalli di rete da cui vengono allocati gli indirizzi IP virtuali dei servizi. Se non viene configurato, viene utilizzato un valore predefinito 23.
    • KUBERNETES_VERSION: la versione di Kubernetes del cluster, ad esempio 1.26.5-gke.2100. Per elencare le versioni di Kubernetes disponibili da configurare, consulta Elencare le versioni di Kubernetes disponibili per un cluster.
    • MACHINE_TYPE: il tipo di macchina per i nodi worker del pool di nodi. Visualizza i tipi di macchina disponibili per la configurazione.
    • NODE_POOL_NAME: il nome del pool di nodi.
    • NUMBER_OF_WORKER_NODES: il numero di nodi worker di cui eseguire il provisioning nel pool di nodi.
    • TAINTS: le incompatibilità da applicare ai nodi di questo pool di nodi. Questo è un campo facoltativo.
    • LABELS: le etichette da applicare ai nodi di questo pool di nodi. Contiene un elenco di coppie chiave-valore. Questo è un campo facoltativo.
    • GPU_PARTITION_SCHEME: lo schema di partizionamento della GPU, se esegui carichi di lavoro GPU. Questo è un campo facoltativo. Ad esempio, mixed-2. Se questo campo non è impostato, la GPU non viene partizionata. Per saperne di più sui profili MIG (Multi-Instance GPU) disponibili, consulta Profili MIG supportati.
  2. In un file di configurazione di Terraform, inserisci il seguente snippet di codice per creare la risorsa personalizzata ProjectBinding:

    provider "kubernetes" {
      config_path = "MANAGEMENT_API_SERVER"
    }
    
    resource "kubernetes_manifest" "PROJECT_BINDING_RESOURCE_NAME" {
      manifest = {
        "apiVersion" = "resourcemanager.gdc.goog/v1"
        "kind" = "ProjectBinding"
        "metadata" = {
          "name" = "CLUSTER_NAME-PROJECT_NAME"
          "namespace" = "platform"
          "labels" = {
            "resourcemanager.gdc.goog/projectbinding-for-user-project" = "true"
          }
        }
        "spec" = {
          "clusterRef" = {
            "name" = "CLUSTER_NAME"
          }
          "selector" = {
            "nameSelector" = {
              "matchNames" = [
                "PROJECT_NAME",
              ]
            }
          }
        }
      }
    }
    

    Sostituisci quanto segue:

    • MANAGEMENT_API_SERVER: il percorso kubeconfig del server API di zona.
    • PROJECT_BINDING_RESOURCE_NAME: il nome della risorsa Terraform del binding del progetto, ad esempio project-binding-1. Questo nome viene utilizzato da Terraform per identificare il binding del progetto e non viene utilizzato da GDC.
    • CLUSTER_NAME: il nome del cluster.
    • PROJECT_NAME: il nome del progetto a cui eseguire il binding. Ogni risorsa ProjectBinding può essere mappata a un solo cluster. Se un progetto richiede l'accesso a più cluster, è necessario creare un ProjectBinding univoco per ogni cluster.

    Prima che uno sviluppatore possa eseguire il deployment dei carichi di lavoro con container nel cluster, devi collegare un progetto al cluster.

  3. Applica le nuove risorse personalizzate utilizzando Terraform:

    terraform apply
    

La creazione del cluster condiviso può richiedere fino a 90 minuti.

Passaggi successivi