Definire il posizionamento compatto per i nodi GKE


Puoi controllare se i nodi Google Kubernetes Engine (GKE) si trovano fisicamente l'uno rispetto all'altro all'interno di una zona utilizzando un criterio di posizionamento compatto.

Panoramica

Quando crei pool di nodi e carichi di lavoro in un cluster GKE, puoi definire una policy di posizionamento compatto, che specifica che questi nodi o carichi di lavoro devono essere posizionati più vicini fisicamente tra loro all'interno di una zona. Se i nodi sono più vicini tra loro, la latenza di rete tra i nodi può essere ridotta, il che può essere particolarmente utile per i carichi di lavoro batch ad accoppiamento stretto.

Utilizzare il posizionamento compatto con GKE Autopilot

Nei cluster Autopilot, puoi richiedere il posizionamento compatto per carichi di lavoro specifici aggiungendo selettori di nodi alla specifica del pod. Puoi utilizzare la policy di posizionamento compatto predefinita di Autopilot o una policy di posizionamento compatto di Compute Engine esistente che utilizza la serie di macchine N2 o N2D.

Limitazioni

  • GKE esegue il provisioning dei carichi di lavoro all'interno di un posizionamento compatto nella stessa zona.
  • Disponibile con le classi di calcolo Balanced, Performance e Accelerator.
  • Disponibile solo sui tipi di macchine C2, C2D, C3, C3D, C4D (1.33.0-gke.1439000 o versioni successive), H3, N2 e N2D.
  • Disponibile solo con le GPU A100, L4 e H100.
  • Il posizionamento compatto è disponibile per i pod raggruppati su un massimo di 1500 nodi.

Attivare una policy di posizionamento compatto

Per abilitare il posizionamento compatto per GKE Autopilot, aggiungi un nodeSelector alla specifica del pod con le seguenti chiavi:

  • cloud.google.com/gke-placement-group: l'identificatore che assegni al gruppo di pod che devono essere eseguiti insieme, nello stesso gruppo di posizionamento compatto. Ogni gruppo di posizionamenti è limitato a 1500 nodi. Ti consigliamo di limitare un gruppo di posizionamento solo ai carichi di lavoro che traggono vantaggio dal raggruppamento e di distribuire i carichi di lavoro in gruppi di posizionamento separati, se possibile.

  • Una delle seguenti chiavi per definire il tipo di risorsa:

    • cloud.google.com/compute-class: "Balanced"
    • cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
  • cloud.google.com/placement-policy-name: facoltativamente, il nome di una policy di posizionamento compatto di Compute Engine esistente. Puoi specificare una policy di posizionamento compatto personalizzata solo in GKE versione 1.31.1-gke.2010000 e successive.

    Per istruzioni, consulta la sezione Crea una policy di posizionamento compatto in questa pagina.

La seguente specifica del pod consente il posizionamento compatto con una policy di posizionamento compatto personalizzata:

apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
  nodeSelector:
    cloud.google.com/gke-placement-group: "placement-group-1"
    cloud.google.com/compute-class: "Balanced"
    cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME

Sostituisci PLACEMENT_POLICY_NAME con il nome di una policy di posizionamento compatto di Compute Engine esistente. Per utilizzare la policy di posizionamento compatto predefinita per Autopilot, ometti la riga cloud.google.com/placement-policy-name.

Utilizza una policy di posizionamento compatto personalizzata senza gruppi di posizionamento

Per utilizzare una policy di posizionamento compatto personalizzata senza gruppi di posizionamento, devi aggiungere il selettore di nodi cloud.google.com/placement-policy-name alla specifica del pod o definire una classe di calcolo personalizzata con priorità di posizionamento.

Aggiungi il selettore di nodi cloud.google.com/placement-policy-name alla specifica del pod

Questo approccio può essere utile se vuoi utilizzare un JobSet per pianificare ogni job separatamente, ma vuoi anche utilizzare una policy di posizionamento compatto personalizzata per posizionare i nodi che eseguono lo stesso job più vicini tra loro.

Poiché JobSet non supporta la specifica di selettori di nodi diversi per ogni job, non puoi utilizzare JobSet con i gruppi di posizionamenti in questo scenario. Tuttavia, puoi utilizzare il supporto integrato di JobSet per le topologie esclusive per ottenere lo stesso effetto.

La seguente specifica del pod consente il posizionamento compatto con una policy di posizionamento compatto personalizzata per un carico di lavoro JobSet:

apiVersion: jobset.x-k8s.io/v1alpha2
kind: JobSet
metadata:
  name: my-jobset
  annotations:
    alpha.jobset.sigs.k8s.io/exclusive-topology: cloud.google.com/gke-nodepool
spec:
 replicatedJobs:
    - name: my-job
      template:
        spec:
          # lines omitted for clarity
          template:
            spec:
              nodeSelector:
                cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
                cloud.google.com/machine-family: "n2"
              # lines omitted for clarity

Sostituisci PLACEMENT_POLICY_NAME con il nome di una policy di posizionamento compatto di Compute Engine esistente.

Utilizzare una classe di computing personalizzata per definire la policy di posizionamento

Per informazioni specifiche, consulta la documentazione relativa alla classe di calcolo personalizzata con priorità di posizionamento.

Invece di aggiungere un nodeSelector con il nome del criterio direttamente alla specifica del carico di lavoro, puoi applicare un criterio di posizionamento compatto impostando il campo placement in una definizione ComputeClass. Per maggiori dettagli, vedi classe di calcolo personalizzata con priorità di posizionamento.

Utilizzare il posizionamento compatto con GKE Standard

Limitazioni

Il posizionamento compatto nei node pool GKE Standard presenta le seguenti limitazioni:

  • Supportato solo nei nuovi pool di nodi. Non puoi attivare o disattivare il posizionamento compatto nei pool di nodi esistenti.
  • Disponibile solo per i node pool che operano in una singola zona.
  • Disponibile solo sui tipi di macchine A2, A3, A4, C2, C2D, C3, C3D, C4, C4D, G2, H3, N2 e N2D. Tuttavia, per A3 Ultra e A4, ti consigliamo di utilizzare prenotazioni mirate a blocchi anziché il posizionamento compatto. Per maggiori dettagli, vedi Riserva capacità.
  • Supporta fino a 1500 istanze VM di Compute Engine in ciascun criterio. Durante la creazione, qualsiasi pool di nodi che supera questo limite in qualsiasi momento viene rifiutato.
  • La fornitura di un criterio di risorsa personalizzato utilizzando il flag placement-policy non è supportata con gli upgrade blu/verde.

Crea una policy di posizionamento compatto

Per creare policy di posizionamento compatto, in Google Cloud CLI specifica l'opzione placement-type=COMPACT durante la creazione pool di nodi o del cluster. Con questa impostazione, GKE tenta di posizionare i nodi all'interno di unpool di nodil in una prossimità fisica più vicina tra loro.

Per utilizzare una policy di risorse esistente nel tuo cluster, specifica la posizione della tua policy personalizzata per il flag placement-policy durante la creazione del pool di nodi o del cluster. Ciò consente la flessibilità di utilizzare posizionamenti riservati, più pool di nodi con la stessa norma di posizionamento e altre opzioni di posizionamento avanzate. Tuttavia, richiede anche più operazioni manuali rispetto alla specifica del flag --placement-type=COMPACT. Ad esempio, devi creare, eliminare e gestire le policy delle risorse personalizzate. Assicurati che il numero massimo di istanze VM sia rispettato in tutti i pool di nodi che utilizzano il criterio delle risorse. Se questo limite viene raggiunto mentre alcuni dei tuoi pool di nodi non hanno raggiunto la dimensione massima, l'aggiunta di altri nodi non andrà a buon fine.

Se non specifichi i flag placement-type e placement-policy, per impostazione predefinita non sono previsti requisiti per il posizionamento dei nodi.

Crea una policy di posizionamento compatto in un nuovo cluster

Quando crei un nuovo cluster, puoi specificare una policy di posizionamento compatto che verrà applicata al pool di nodi predefinito. Per tutti i pool di nodi successivi che crei per il cluster, dovrai specificare se applicare il posizionamento compatto.

Per creare un nuovo cluster in cui è applicata una policy di posizionamento compatto al pool di nodi predefinito, utilizza il seguente comando:

gcloud container clusters create CLUSTER_NAME \
    --machine-type MACHINE_TYPE \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

Sostituisci quanto segue:

  • CLUSTER_NAME: il nome del nuovo cluster.
  • MACHINE_TYPE: il tipo di macchina da utilizzare per i nodi, che deve essere un tipo di macchina supportato elencato nelle limitazioni del cluster Standard.
  • --placement-type COMPACT: applica il posizionamento compatto per i nodi nel pool di nodi predefinito.
  • MAX_UNAVAILABLE: il numero massimo di nodi che possono non essere disponibili contemporaneamente durante l'upgrade di un pool di nodi. Per il posizionamento compatto, consigliamo aggiornamenti rapidi senza picchi per ottimizzare la probabilità di trovare nodi collocati insieme durante gli aggiornamenti.

Crea una policy di posizionamento compatto su un cluster esistente

In un cluster esistente, puoi creare un pool di nodi a cui è applicata una policy di posizionamento compatto.

Per creare un pool di nodi a cui è applicata una policy di posizionamento compatto, utilizza il seguente comando:

gcloud container node-pools create NODEPOOL_NAME \
    --machine-type MACHINE_TYPE \
    --cluster CLUSTER_NAME \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

Sostituisci quanto segue:

  • NODEPOOL_NAME: il nome del nuovo pool di nodi.
  • MACHINE_TYPE: il tipo di macchina da utilizzare per i nodi, che deve essere un tipo di macchina supportato elencato nelle limitazioni del cluster Standard.
  • CLUSTER_NAME: il nome del cluster esistente.
  • --placement-type COMPACT: indica di applicare il posizionamento compatto per i nodi nel nuovo pool di nodi.
  • MAX_UNAVAILABLE: il numero massimo di nodi che possono non essere disponibili contemporaneamente durante l'upgrade di un pool di nodi. Per il posizionamento compatto, consigliamo aggiornamenti rapidi senza picchi per ottimizzare la probabilità di trovare nodi collocati insieme durante gli aggiornamenti.

Creare pool di nodi utilizzando una policy di posizionamento personalizzata condivisa

Puoi creare manualmente una policy delle risorse e utilizzarla in più pool di nodi.

  1. Crea il criterio delle risorse nella regione Google Cloud del cluster:

    gcloud compute resource-policies create group-placement POLICY_NAME \
        --region REGION \
        --collocation collocated
    

    Sostituisci quanto segue:

    • POLICY_NAME: il nome della policy di risorse.
    • REGION: la regione del cluster.
  2. Crea un pool di nodi utilizzando il criterio di risorsa personalizzato:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

    Sostituisci quanto segue:

    • NODEPOOL_NAME: il nome del nuovo pool di nodi.
    • MACHINE_TYPE: il tipo di macchina da utilizzare per i nodi, che deve essere un tipo di macchina supportato elencato nelle limitazioni del cluster standard.
    • CLUSTER_NAME: il nome del cluster esistente.
    • MAX_UNAVAILABLE: il numero massimo di nodi che possono non essere disponibili contemporaneamente durante l'upgrade di un pool di nodi. Per il posizionamento compatto, consigliamo aggiornamenti rapidi senza picchi per ottimizzare la probabilità di trovare nodi collocati insieme durante gli aggiornamenti.

Utilizzare una prenotazione Compute Engine con una policy di posizionamento compatto

Le prenotazioni ti aiutano a garantire che l'hardware sia disponibile in una zona specificata, riducendo il rischio di errore di creazione del pool di nodi causato da hardware insufficiente.

  1. Crea una prenotazione che specifichi una policy di posizionamento compatto:

    gcloud compute reservations create RESERVATION_NAME \
        --vm-count MACHINE_COUNT \
        --machine-type MACHINE_TYPE \
        --resource-policies policy=POLICY_NAME \
        --zone ZONE \
        --require-specific-reservation
    

    Sostituisci quanto segue:

    • RESERVATION_NAME: il nome della prenotazione.
    • MACHINE_COUNT: Il numero di nodi riservati.
    • MACHINE_TYPE: il tipo di macchina da utilizzare per i nodi, che deve essere un tipo di macchina supportato elencato nelle limitazioni del cluster standard.
    • POLICY_NAME: il nome della policy di risorse.
    • ZONE: la zona in cui creare la prenotazione.
  2. Crea un pool di nodi specificando sia la policy di posizionamento compatto sia la prenotazione creata nel passaggio precedente:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --reservation-affinity specific \
        --reservation RESERVATION_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

Sostituisci quanto segue:

  • NODEPOOL_NAME: il nome del nuovo pool di nodi.
  • MACHINE_TYPE: il tipo di macchina da utilizzare per i nodi, che deve essere un tipo di macchina supportato elencato nelle limitazioni del cluster Standard.
  • CLUSTER_NAME: il nome del cluster esistente.

Crea un carico di lavoro sui nodi che utilizzano il posizionamento compatto

Per eseguire carichi di lavoro su nodi dedicati che utilizzano il posizionamento compatto, puoi utilizzare diversi meccanismi di Kubernetes, ad esempio l'assegnazione di pod ai nodi e l'impedimento della pianificazione di pod indesiderati su un gruppo di nodi.

Nell'esempio seguente, aggiungiamo un'incompatibilità ai nodi dedicati e aggiungiamo una tolleranza e un'affinità corrispondenti ai pod.

  1. Aggiungi un taint ai nodi nel pool di nodi con una policy di posizionamento compatto:

    kubectl taint nodes -l cloud.google.com/gke-nodepool=NODEPOOL_NAME dedicated-pool=NODEPOOL_NAME:NoSchedule
    
  2. Nella definizione del workload, specifica la tolleranza necessaria e un'affinità del nodo. Ecco un esempio con un singolo pod:

    apiVersion: v1
    kind: Pod
    metadata:
      ...
    spec:
      ...
      tolerations:
      - key: dedicated-pool
        operator: "Equal"
        value: "NODEPOOL_NAME"
        effect: "NoSchedule"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: dedicated-pool
                operator: In
                values:
                - NODEPOOL_NAME
    

In alcune località, potrebbe non essere possibile creare un pool di nodi di grandi dimensioni utilizzando una policy di posizionamento compatto. Per limitare le dimensioni di questi pool di nodi a quanto necessario, ti consigliamo di creare un pool di nodi per ogni carico di lavoro che richiede un posizionamento compatto.

Utilizza il posizionamento compatto per il provisioning automatico dei nodi

Con il provisioning automatico dei nodi, GKE esegue automaticamente il provisioning dei pool di nodi in base alla domanda di risorse del cluster. Per saperne di più, vedi Utilizzo del provisioning automatico dei nodi.

Per abilitare il posizionamento compatto per il provisioning automatico dei nodi, aggiungi un nodeSelector alla specifica del pod come nel seguente esempio:

apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
  nodeSelector:
    cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
    cloud.google.com/machine-family: MACHINE_FAMILY
    cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
# lines omitted for clarity

Sostituisci quanto segue:

  • PLACEMENT_GROUP_IDENTIFIER: l'identificatore che assegni al gruppo di pod che devono essere eseguiti insieme, nello stesso gruppo di posizionamento compatto.
  • MACHINE_FAMILY: il nome della famiglia di macchine. Utilizza una delle famiglie di macchine che supportano il posizionamento compatto. Ti consigliamo di utilizzare le famiglie di macchine C2 o C2D per i carichi di lavoro con requisiti di prestazioni di calcolo e networking.
  • PLACEMENT_POLICY_NAME: facoltativamente, il nome di una policy di posizionamento compatto di Compute Engine esistente. GKE utilizza la policy di posizionamento compatto specificata quando il provisioning automatico dei nodi crea un nuovo pool di nodi per raggruppare i pod. Puoi specificare solo una policy di posizionamento compatto personalizzata in GKE versione 1.31.1-gke.2010000 e successive.

    Per istruzioni, consulta la sezione Crea una policy di posizionamento compatto in questa pagina.

Puoi omettere la chiave cloud.google.com/machine-family se la configurazione del pod definisce già un tipo di macchina supportato con il posizionamento compatto. Ad esempio, se la specifica del pod include nvidia.com/gpu e il cluster è configurato per utilizzare GPU A100, non è necessario includere la chiave cloud.google.com/machine-family.

L'esempio seguente è una specifica del pod che definisce la richiesta nvidia.com/gpu e il cluster è configurato per utilizzare le GPU A100. Questo Pod spec non include la chiave cloud.google.com/machine-family:

  apiVersion: v1
  kind: Pod
  metadata:
    ...
  spec:
    ...
    nodeSelector:
      cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
      cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
    resources:
      limits:
        nvidia.com/gpu: 2

Per saperne di più, consulta la pagina su come configurare i pod per utilizzare le GPU.

Ottimizzare le dimensioni del gruppo di posizionamenti

Poiché GKE trova il posizionamento migliore per i deployment più piccoli, ti consigliamo di indicare a GKE di evitare di eseguire diversi tipi di pod nello stesso gruppo di posizionamento. Aggiungi una chiave di tolleranza con la chiave cloud.google.com/gke-placement-group e l'identificatore di posizionamento compatto che hai definito.

L'esempio seguente è una specifica del pod che definisce una tolleranza del pod con posizionamento compatto:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
  tolerations:
  - key: cloud.google.com/gke-placement-group
    operator: "Equal"
    value: PLACEMENT_GROUP_IDENTIFIER
    effect: "NoSchedule"

Per ulteriori informazioni sul provisioning automatico dei nodi con la tolleranza dei pod, consulta Separazione dei workload.

Passaggi successivi