Preparati a eseguire il deployment di un workload Arm in un cluster standard

Questa pagina spiega come preparare un workload da pianificare sui nodi Arm in un cluster GKE Standard. Per saperne di più sulla pianificazione dei workload Arm con Autopilot, consulta Eseguire il deployment dei workload Autopilot su architettura Arm.

Per pianificare correttamente un workload su un nodo Arm, devi disporre di quanto segue:

Panoramica

Per impostazione predefinita, GKE pianifica i workload solo sui nodi basati su x86, ovvero le serie di macchine Compute Engine con processori Intel o AMD inserendo un' incompatibilità (kubernetes.io/arch=arm64:NoSchedule) su tutti i nodi Arm. Questa incompatibilità impedisce la pianificazione involontaria dei workload compatibili con x86 sui nodi Arm. Se vuoi che i workload compatibili con x86 vengano pianificati sui nodi Arm senza la tolleranza corrispondente, puoi rimuovere questa incompatibilità predefinita. Per saperne di più, consulta Configurare l'incompatibilità predefinita dell'architettura Arm taint.

Se vuoi eseguire il deployment di un workload su un nodo Arm con l'incompatibilità predefinita, utilizza i campi descritti in questo documento per indicare allo scheduler di inviare il workload al tipo di nodo richiesto.

Utilizza uno dei seguenti campi:

Quando utilizzi un selettore di nodi o una regola di affinità dei nodi, GKE pianifica i workload compatibili con Arm solo quando hai dichiarato che l'immagine container del workload può essere eseguita sull'architettura del nodo.

Se pianifichi un workload compatibile con Arm con un selettore di nodi o con una regola di affinità dei nodi come descritto in nelle sezioni seguenti, GKE aggiunge automaticamente una tolleranza alla configurazione del workload in modo che i pod possano essere eseguiti sui nodi Arm.

Questa tolleranza aggiunta al workload corrisponde all'incompatibilità (kubernetes.io/arch=arm64:NoSchedule) aggiunta per impostazione predefinita a tutti i nodi Arm, per consentire la pianificazione del workload sui nodi Arm.

In alcune situazioni, ad esempio quando hai immagini multi-arch che possono essere eseguite su qualsiasi nodo, potresti voler aggiungere manualmente questa tolleranza alla configurazione del workload. Per istruzioni, consulta Utilizzare la tolleranza per pianificare i workload multi-arch su qualsiasi architettura.

Utilizzare un selettore di nodi per pianificare un workload Arm

Aggiungi il seguente selettore di nodi alla specifica:

nodeSelector:
    kubernetes.io/arch: arm64

Il selettore di nodi specifica che questo workload deve essere pianificato solo sui nodi con l'etichetta arm64, che hanno tutti i nodi Arm sui cluster GKE.

Quando questo selettore di nodi è incluso nella configurazione del workload, GKE aggiunge la tolleranza per corrispondere all'incompatibilità e consentire la pianificazione del workload sui nodi Arm.

Utilizzare una regola di affinità dei nodi per pianificare un workload Arm

Puoi anche utilizzare l'affinità dei nodi per pianificare il workload.

Pianificare il workload su una singola architettura

Aggiungi la seguente affinità dei nodi alla specifica:

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/arch
            operator: In
            values:
            - arm64

La regola di affinità dei nodi specifica che il workload deve essere pianificato solo sui nodi con l'etichetta arm64, che hanno tutti i nodi Arm sui cluster GKE.

Quando questa regola di affinità dei nodi è inclusa nella configurazione del workload, GKE aggiunge la tolleranza per corrispondere all'incompatibilità e consentire la pianificazione del workload sui nodi Arm.

Pianificare il workload su architetture x86 e Arm

Se vuoi pianificare un workload su architetture x86 (processori Intel e AMD) e Arm e i tuoi node pool Arm utilizzano il comportamento di incompatibilità predefinito, puoi specificarlo in diversi modi. Le seguenti istruzioni presuppongono che i node pool Arm utilizzino l'incompatibilità predefinita.

Utilizzare la tolleranza per pianificare i workload multi-arch su qualsiasi architettura

Se hai un'immagine multi-arch che vuoi pianificare su qualsiasi tipo di architettura disponibile in un cluster Standard, devi solo aggiungere la tolleranza alla specifica del workload. Non hai bisogno del selettore di nodi o delle regole di affinità dei nodi descritte in questa pagina, poiché il workload può essere pianificato su tutti i tipi di architettura.

Aggiungi la tolleranza:

  tolerations:
    - key: kubernetes.io/arch
      operator: Equal
      value: arm64
      effect: NoSchedule

Utilizzando questa tolleranza, GKE potrebbe pianificare un workload sui nodi con qualsiasi tipo di architettura.

Ad esempio, se hai un cluster con i seguenti node pool:

  • my-c4a-node-pool, che utilizza VM c4a-standard-16 (arm64).
  • my-c2-node-pool, che utilizza VM c2-standard-8 (amd64).
  • my-t2d-node-pool, che utilizza VM t2-standard-48 (amd64).

Se esegui il deployment in questo cluster di un workload che utilizza un'immagine multi-arch e la tolleranza arm64 nella configurazione del workload, GKE potrebbe pianificare il workload su tutti i node pool.

Utilizzare la regola di affinità dei nodi per pianificare i workload multi-arch su qualsiasi architettura

Se vuoi che un workload venga pianificato sui nodi di tutti i tipi di architettura, inclusi x86 e Arm, puoi anche utilizzare una regola di affinità dei nodi. Con le regole di affinità dei nodi, puoi specificare esattamente i tipi di architettura su cui vuoi pianificare il workload. Questo approccio è consigliato per la pianificazione dei workload sui cluster Autopilot. Per saperne di più, consulta Eseguire il deployment dei workload Autopilot su architettura Arm.

Con i workload basati su x86, non hai bisogno di questi selettori di nodi, regole di affinità dei nodi o tolleranze per la pianificazione del workload. Se hai un'immagine che vuoi pianificare solo sui nodi basati su x86, non devi utilizzare questi campi.

Per pianificare i workload su qualsiasi tipo di architettura, elenca arm64 e amd64 nella sezione values del campo di affinità dei nodi. amd64 include tutti i nodi che utilizzano processori x86.

L'esempio seguente specifica che questo workload può essere pianificato sui nodi con processori Arm o x86:

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/arch
            operator: In
            values:
            - arm64
            - amd64

Le etichette per ogni tipo di architettura sono:

Ad esempio, se hai un cluster con i seguenti node pool e la seguente regola di affinità dei nodi:

  • my-c4a-node-pool, che utilizza VM c4a-standard-16 (arm64).
  • my-c2-node-pool, che utilizza VM c2-standard-8 (amd64).
  • my-t2d-node-pool, che utilizza VM t2-standard-48 (amd64).

Se esegui il deployment in questo cluster di un workload che utilizza un'immagine multi-arch e l' affinità dei nodi con arm64 inclusa nell'values elenco, GKE aggiunge la tolleranza nella configurazione del workload e potrebbe pianificare il workload su tutti i node pool.

Configurare l'incompatibilità predefinita dell'architettura Arm

Per impostazione predefinita, GKE applica l'incompatibilità kubernetes.io/arch=arm64:NoSchedule a tutti i nodi Arm. Questa incompatibilità impedisce la pianificazione sui nodi Arm dei workload compatibili solo con l'architettura x86, ma non con l'architettura Arm. Se hai workload compatibili sia con x86 che con Arm, puoi disattivare questa incompatibilità per consentire a GKE di pianificare questi workload sui nodi Arm senza la necessità di una tolleranza corrispondente all'incompatibilità.

Puoi aggiornare il comportamento predefinito solo nei pool di nodi Standard nei cluster GKE in cui il control plane esegue la versione 1.35.0-gke.2141000 o successive oppure con i nodi creati per ComputeClass personalizzate. Per saperne di più, consulta Configurare l'incompatibilità predefinita dell'architettura Arm taint. L'aggiornamento del comportamento di incompatibilità non si applica al deployment dei workload Arm con Autopilot. Per saperne di più, consulta Eseguire il deployment dei workload Autopilot su architettura Arm.

Puoi configurare questo comportamento nelle seguenti situazioni con i node pool Standard:

  • Durante la creazione del cluster, per il pool di nodi Standard predefinito
  • Quando crei o aggiorni un pool di nodi Standard

Se nel cluster sono in esecuzione workload non compatibili con Arm, non rimuovere l'incompatibilità predefinita, perché i workload incompatibili potrebbero essere pianificati sui nodi Arm senza incompatibilità.

Per configurare l'incompatibilità dei nodi predefinita per i nodi Arm, seleziona una delle seguenti opzioni:

gcloud CLI

Per impostare il comportamento di incompatibilità con gcloud CLI, utilizza il flag --node-architecture-taint-behavior quando esegui una delle seguenti operazioni:

  • Crea un cluster Standard con un comportamento di incompatibilità specifico per il pool di nodi predefinito utilizzando il gcloud container cluster create comando:

    gcloud container cluster create CLUSTER_NAME
        --location=CONTROL_PLANE_LOCATION \
        --node-architecture-taint-behavior=BEHAVIOR
    
  • Crea un pool di nodi Standard utilizzando il gcloud container node-pools create comando:

    gcloud container node-pools create POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --node-architecture-taint-behavior=BEHAVIOR
    
  • Aggiorna un pool di nodi Standard utilizzando il gcloud container node-pools update comando:

    gcloud container node-pools update POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --node-architecture-taint-behavior=BEHAVIOR
    

Per questi comandi, sostituisci quanto segue:

  • CLUSTER_NAME: il nome del tuo cluster.
  • CONTROL_PLANE_LOCATION: la località di Compute Engine del piano di controllo del cluster. Fornisci una regione per i cluster regionali o una zona per i cluster zonali.
  • POOL_NAME: il nome del tuo pool di nodi.
  • BEHAVIOR: una delle seguenti impostazioni:

    • none: GKE omette l'incompatibilità predefinita di kubernetes.io/arch=arm64:NoSchedule.
    • arm: imposta esplicitamente il comportamento predefinito, che aggiunge le incompatibilità kubernetes.io/arch=arm64:NoSchedule per tutti i nodi nel pool di nodi Arm.

Quando modifichi il comportamento di incompatibilità dell'architettura dei nodi per un pool di nodi Standard, GKE aggiorna immediatamente le incompatibilità senza dover ricreare i nodi.

Terraform

Aggiungi il seguente blocco taint_config in node_config per configurare il comportamento di incompatibilità dell'architettura:

taint_config {
  architecture_taint_behavior = "BEHAVIOR"
}

Sostituisci BEHAVIOR con una delle seguenti impostazioni:

  • NONE: GKE omette l'incompatibilità predefinita di kubernetes.io/arch=arm64:NoSchedule.
  • ARM: imposta esplicitamente il comportamento predefinito, che aggiunge le incompatibilità kubernetes.io/arch=arm64:NoSchedule per tutti i nodi nel node pool Arm.

Un node_config completo per un pool di nodi Standard che include questo blocco è simile al seguente:

resource "google_container_node_pool" "primary_preemptible_nodes" {
  name       = "NODE_POOL_NAME"
  location   = "NODE_POOL_LOCATION"
  cluster    = google_container_cluster.primary.name
  node_count = 1

  node_config {
    preemptible  = true
    machine_type = "ARM_MACHINE_TYPE"

    # Google recommends custom service accounts that have cloud-platform scope and permissions granted via IAM Roles.
    service_account = google_service_account.default.email
    oauth_scopes    = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
    taint_config {
      architecture_taint_behavior = "BEHAVIOR"
    }
  }
}

In questo esempio, NODE_POOL_NAME rappresenta il nome del pool di nodi e NODE_POOL_LOCATION rappresenta la località del control plane del cluster.

Eseguire il deployment del workload

Ora che hai specificato dove devono essere pianificati i workload compatibili con Arm, puoi eseguire il deployment del workload.

Quando esegui il deployment di un workload in un cluster GKE, le istruzioni sono le stesse per tutti i tipi di architettura. Puoi eseguire il deployment di un workload compatibile con Arm come faresti con qualsiasi altro workload, a condizione che tu abbia completato i passaggi dei prerequisiti. Per vedere esempi di deployment di workload, consulta le seguenti pagine:

Risoluzione dei problemi

Per informazioni sugli errori comuni e sulla risoluzione dei problemi, consulta Risoluzione dei problemi dei workload Arm.

Passaggi successivi