Definisci posizionamento compatto per i nodi GKE


Puoi controllare se i nodi di 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 un criterio di posizionamento compatto, che specifica che i nodi o i carichi di lavoro devono essere posizionati più vicini fisicamente l'uno all'altro all'interno di una zona. La presenza di nodi più vicini tra loro può ridurre la latenza di rete tra i nodi, il che può essere particolarmente utile per i carichi di lavoro batch strettamente associati.

Utilizza il posizionamento compatto con GKE Autopilot

Limitazioni

  • GKE esegue il provisioning dei carichi di lavoro in un posizionamento compatto nella stessa zona.
  • Il posizionamento compatto è disponibile sulle GPU Balanced e A100. Per scoprire di più, consulta i tipi di macchine.
  • Il posizionamento compatto è disponibile per i pod raggruppati su un massimo di 150 nodi.
  • La migrazione live per i nodi non è supportata.

Attiva un criterio 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 posizionamenti compatto.

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

    • cloud.google.com/compute-class: "Balanced"
    • cloud.google.com/gke-accelerator: "nvidia-tesla-a100"

L'esempio seguente è un estratto della specifica di un pod che consente il posizionamento compatto. L'identificatore del gruppo di posizionamenti è placement-group-1, mentre la classe di calcolo è Balanced:

  nodeSelector:
    cloud.google.com/gke-placement-group: "placement-group-1"
    cloud.google.com/compute-class: "Balanced"

Ogni gruppo di posizionamenti è limitato a 150 nodi. Ti consigliamo di limitare un gruppo di posizionamenti solo ai carichi di lavoro che traggono vantaggio dal raggruppamento e di distribuire i carichi di lavoro in gruppi di posizionamenti separati, se possibile.

Utilizza il posizionamento compatto con GKE Standard

Limitazioni

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

Crea un criterio di posizionamento compatto

Per creare criteri di posizionamento compatti, in Google Cloud CLI, devi specificare l'opzione placement-type=COMPACT durante la creazione del pool di nodi o del cluster. Con questa impostazione, GKE tenta di posizionare i nodi all'interno di un pool di nodi più vicini fisicamente l'uno all'altro.

Per utilizzare un criterio delle risorse esistente nel cluster, specifica la località del criterio personalizzato 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 lo stesso criterio 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 i criteri delle risorse personalizzati. Assicurati che venga rispettato il numero massimo di istanze VM 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 un criterio di posizionamento compatto in un nuovo cluster

Quando crei un nuovo cluster, puoi specificare un criterio di posizionamento compatto che verrà applicato 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 al pool di nodi predefinito è applicato un criterio di posizionamento compatto, utilizza il comando seguente:

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 C2 (ad esempio c2-standard-4).
  • --placement-type COMPACT: applica il posizionamento compatto per i nodi nel pool di nodi predefinito.
  • MAX_UNAVAILABLE: numero massimo di nodi che possono essere contemporaneamente non disponibili durante l'upgrade di un pool di nodi. Per un posizionamento compatto, consigliamo upgrade rapidi senza sovratensione per ottimizzare la probabilità di trovare nodi colocati durante gli upgrade.

Crea un criterio di posizionamento compatto su un cluster esistente

Su un cluster esistente, puoi creare un pool di nodi a cui è applicato un criterio di posizionamento compatto.

Per creare un pool di nodi a cui è applicato un criterio di posizionamento compatto, utilizza il comando seguente:

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 C2 (ad esempio c2-standard-4).
  • 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: numero massimo di nodi che possono essere contemporaneamente non disponibili durante l'upgrade di un pool di nodi. Per un posizionamento compatto, consigliamo upgrade rapidi senza sovratensione per ottimizzare la probabilità di trovare nodi colocati durante gli upgrade.

Crea pool di nodi utilizzando un criterio di posizionamento personalizzato condiviso

Puoi creare manualmente un criterio delle risorse e utilizzarlo 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 del criterio delle risorse.
    • REGION: la regione del tuo cluster.
  2. Crea un pool di nodi utilizzando il criterio delle risorse 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 C2 (ad esempio c2-standard-4).
    • CLUSTER_NAME: il nome del cluster esistente.
    • MAX_UNAVAILABLE: numero massimo di nodi che possono essere contemporaneamente non disponibili durante l'upgrade di un pool di nodi. Per un posizionamento compatto, consigliamo upgrade rapidi senza sovratensione per ottimizzare la probabilità di trovare nodi colocati durante gli upgrade.

Usa una prenotazione di Compute Engine con un criterio di posizionamento compatto

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

  1. Crea una prenotazione che specifichi un criterio 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 C2. Ad esempio, per utilizzare un tipo di macchina C2 predefinita con 4 vCPU, specifica c2-standard-4.
    • POLICY_NAME: il nome del criterio delle risorse.
    • ZONE: la zona in cui creare la prenotazione.
  2. Crea un pool di nodi specificando sia il criterio di posizionamento compatto sia la prenotazione che hai creato 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 C2 (ad esempio c2-standard-4).
  • 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 Kubernetes, come l'assegnazione di pod ai nodi e la prevenzione 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'incompatibilità ai nodi nel pool di nodi che ha un criterio di posizionamento compatto:

    kubectl taint nodes -l cloud.google.com/gke-nodepool=NODEPOOL_NAME dedicated-pool=NODEPOOL_NAME:NoSchedule
    
  2. Nella definizione del carico di lavoro, specifica la tolleranza necessaria e un'affinità dei nodi. 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 un criterio di posizionamento compatto. Per limitare le dimensioni di questi pool di nodi a ciò che è necessario, valuta la possibilità di creare un pool di nodi per carico di lavoro che richiede il posizionamento compatto.

Utilizza il posizionamento compatto per il provisioning automatico dei nodi

A partire dalla versione 1.25 di GKE, il provisioning automatico dei nodi supporta il criterio di posizionamento compatto. Con il provisioning automatico dei nodi, GKE esegue automaticamente il provisioning dei pool di nodi in base alla domanda di risorse cluster. Per ulteriori informazioni, consulta Utilizzare il provisioning automatico dei nodi.

Per abilitare il posizionamento compatto per il provisioning automatico dei nodi, 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 posizionamenti compatto.

  • cloud.google.com/machine-family è il nome della famiglia di macchine. Utilizza una delle famiglie di macchine che supportano il posizionamento compatto. Ti consigliamo di utilizzare famiglie di macchine C2 o C2D per carichi di lavoro con requisiti di prestazioni di computing e rete.

L'esempio seguente è una specifica del pod che consente il posizionamento compatto:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
  nodeSelector:
    cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
    cloud.google.com/machine-family: MACHINE_FAMILY

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 l'utilizzo di 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 Come configurare i pod per il consumo di GPU.

Ottimizza 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 tipi diversi di pod nello stesso gruppo di posizionamenti. 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 carichi di lavoro

Passaggi successivi