Applica ComputeClasses ai pod per impostazione predefinita

Questo documento mostra come applicare ComputeClass per impostazione predefinita ai pod Google Kubernetes Engine (GKE) che non selezionano esplicitamente una ComputeClass. Questa pagina contiene le istruzioni per impostare una ComputeClass come predefinita in un namespace e per un intero cluster. Questo documento è destinato agli amministratori di cluster che vogliono ridurre l'overhead manuale causato dalla configurazione dei singoli nodi e carichi di lavoro.

Dovresti già avere familiarità con le ComputeClass personalizzate.

Informazioni su ComputeClass predefinite

Puoi configurare i cluster GKE o spazi dei nomi specifici in modo che abbiano una ComputeClass predefinita. La classe predefinita che configuri si applica a qualsiasi pod nel cluster o nello spazio dei nomi che non seleziona una ComputeClass diversa. Quando esegui il deployment di un pod che non seleziona una ComputeClass, GKE applica le ComputeClass predefinite nel seguente ordine:

  1. Se lo spazio dei nomi ha un oggetto ComputeClass predefinito, GKE modifica la specifica del pod per selezionare ComputeClass.
  2. Se lo spazio dei nomi non ha una ComputeClass predefinita, viene applicata la classe predefinita a livello di cluster. GKE non modifica la specifica del pod.

Se il campo activeMigration.optimizeRulePriority della tua ComputeClass predefinita è impostato su true, questa impostazione potrebbe influire sui carichi di lavoro nei tuoi cluster. Per maggiori informazioni, vedi Migrazione attiva in ComputeClasses predefinite.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installala e poi inizializza gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo il comando gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.

Requisiti

  • Per impostare una ComputeClass come predefinita a livello di cluster, il cluster deve eseguire GKE versione 1.33.1-gke.1744000 o successive.
  • Per impostare una ComputeClass come predefinita a livello di spazio dei nomi solo per i pod non DaemonSet, il cluster deve eseguire GKE versione 1.33.1-gke.1788000 o successiva.

Ruoli e autorizzazioni richiesti

Per ottenere le autorizzazioni necessarie per configurare ComputeClass predefinite a livello di cluster o spazio dei nomi, chiedi all'amministratore di concederti i seguenti ruoli IAM sul progetto Google Cloud :

Per ulteriori informazioni sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questi ruoli predefiniti contengono le autorizzazioni necessarie per configurare ComputeClass predefinite a livello di cluster o spazio dei nomi. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

Per configurare le ComputeClass predefinite a livello di cluster o spazio dei nomi sono necessarie le seguenti autorizzazioni:

  • container.customResourceDefinitions.create
  • container.customResourceDefinitions.update
  • container.customResourceDefinitions.get
  • container.customResourceDefinitions.list
  • container.namespaces.get
  • container.namespaces.list
  • container.pods.get
  • container.nodes.get
  • container.nodes.list
  • container.deployments.create
  • container.deployments.get
  • Aggiungi etichette agli spazi dei nomi: container.namespaces.update
  • Abilita ComputeClass predefinita a livello di cluster: container.clusters.update

Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

Configura una risorsa ComputeClass predefinita per uno spazio dei nomi

Puoi annotare qualsiasi spazio dei nomi Kubernetes nel tuo cluster con il nome di una ComputeClass da utilizzare come predefinita. Se un pod di cui è stato eseguito il deployment in questo spazio dei nomi non seleziona già una ComputeClass, GKE modifica la specifica del pod per selezionare la classe predefinita nello spazio dei nomi. Puoi impostare qualsiasi ComputeClass personalizzata o integrata come predefinita.

  • Per applicare una ComputeClass a tutti i pod di uno spazio dei nomi per impostazione predefinita, aggiungi l'etichetta cloud.google.com/default-compute-class a questo spazio dei nomi:

    kubectl label namespaces NAMESPACE_NAME \
        cloud.google.com/default-compute-class=COMPUTECLASS_NAME
    

    Sostituisci quanto segue:

    • NAMESPACE_NAME: il nome dello spazio dei nomi da aggiornare
    • COMPUTECLASS_NAME: il nome di ComputeClass da impostare come predefinita per lo spazio dei nomi.

    Se il comando non va a buon fine e viene visualizzato il seguente messaggio di errore, lo spazio dei nomi ha già una ComputeClass predefinita:

    error: 'cloud.google.com/default-compute-class' already has a value, and --overwrite is false
    

    Per risolvere questo errore, aggiorna ComputeClass predefinita per lo spazio dei nomi.

  • Per applicare una ComputeClass a tutti i pod non DaemonSet in uno spazio dei nomi per impostazione predefinita, aggiungi l'etichetta cloud.google.com/default-compute-class-non-daemonset a questo spazio dei nomi:

    kubectl label namespaces NAMESPACE_NAME \
        cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME
    

    Se il comando non va a buon fine e viene visualizzato il seguente messaggio di errore, lo spazio dei nomi ha già una ComputeClass predefinita per i pod non DaemonSet:

    error: 'cloud.google.com/default-compute-class-non-daemonset' already has a value, and --overwrite is false
    

    Per risolvere questo errore, aggiorna ComputeClass predefinita per lo spazio dei nomi.

Le modifiche si applicano a tutti i nuovi pod in quello spazio dei nomi. I Pod esistenti non sono interessati.

Aggiorna la ComputeClass predefinita esistente in uno spazio dei nomi

Per sovrascrivere la ComputeClass predefinita esistente per uno spazio dei nomi, esegui uno dei seguenti comandi:

  • Aggiorna ComputeClass predefinita per tutti i pod nello spazio dei nomi:

    kubectl label namespaces NAMESPACE_NAME   \
        cloud.google.com/default-compute-class=COMPUTECLASS_NAME \
        --overwrite
    

    Sostituisci quanto segue:

    • NAMESPACE_NAME: il nome dello spazio dei nomi da aggiornare
    • COMPUTECLASS_NAME: il nome di ComputeClass da impostare come nuovo valore predefinito per lo spazio dei nomi.
  • Sovrascrivi la ComputeClass predefinita per i pod non DaemonSet nello spazio dei nomi:

    kubectl label namespaces NAMESPACE_NAME \
        cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME \
        --overwrite
    

Le modifiche si applicano a tutti i nuovi pod in quello spazio dei nomi. I Pod esistenti non sono interessati.

Configura una ComputeClass predefinita per un cluster

Questa sezione mostra come impostare una ComputeClass come predefinita per il tuo cluster. Per le ComputeClass predefinite a livello di cluster, non specificare manualmente i taint dei nodi e le etichette dei nodi per i node pool esistenti nel cluster. GKE non esegue lo scale dei node pool con taint dei nodi per ComputeClass. Se aggiungi manualmente un'etichetta per default ComputeClass, GKE può scalare il pool di nodi. Tuttavia, questa configurazione manuale non è necessaria per utilizzare una ComputeClass predefinita a livello di cluster.

  1. Per abilitare l'impostazione di una ComputeClass predefinita a livello di cluster per un cluster, esegui il comando gcloud container clusters update con il flag --enable-default-compute-class:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --enable-default-compute-class
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del tuo cluster.
    • CONTROL_PLANE_LOCATION: la posizione del control plane del cluster, ad esempio us-central1.

    Puoi anche specificare questo flag quando crei un cluster Autopilot o Standard.

  2. Salva il seguente manifest, che definisce un ComputeClass denominato default:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: default
    spec:
      priorities:
      - machineFamily: n4
      - machineFamily: n2
      whenUnsatisfiable: ScaleUpAnyway
      nodePoolAutoCreation:
        enabled: true
    

    Questo manifest di esempio richiede nodi che utilizzano istanze N4. Se le istanze N4 non sono disponibili, ComputeClass richiede invece istanze N2. Puoi configurare default ComputeClass con uno qualsiasi dei campi disponibili nella CustomResourceDefinition di ComputeClass.

  3. Applica il manifest al cluster:

    kubectl apply -f PATH_TO_MANIFEST
    

    Sostituisci PATH_TO_MANIFEST con il percorso del manifest per ComputeClass.

Dopo aver impostato una ComputeClass predefinita a livello di cluster, GKE scala i pool di nodi che soddisfano entrambi i seguenti requisiti:

  • La configurazione del nodo è la stessa della configurazione di default ComputeClass.
  • Il pool di nodi non ha taint o etichette per una ComputeClass diversa. GKE può scalare i pool di nodi con un taint e un'etichetta per la default ComputeClass.

Ad esempio, se default ComputeClass specifica la serie di macchine N4, GKE può scalare un pool di nodi esistente che utilizza istanze N4 e non ha taint o etichette per una ComputeClass diversa.

Le modifiche vengono applicate a tutti i nuovi pod nel cluster che non hanno già una ComputeClass. I pod esistenti potrebbero essere interessati a seconda delle impostazioni di migrazione attive della ComputeClass predefinita a livello di cluster. Per ulteriori informazioni, vedi Migrazione attiva in ComputeClasses predefinite.

Verifica il comportamento predefinito di ComputeClass

Per verificare se la ComputeClass predefinita che hai impostato per uno spazio dei nomi o per un cluster funziona come previsto, procedi nel seguente modo:

  1. Esamina il seguente esempio di deployment:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloweb
      labels:
        app: hello
    spec:
      selector:
        matchLabels:
          app: hello
          tier: web
      template:
        metadata:
          labels:
            app: hello
            tier: web
        spec:
          containers:
          - name: hello-app
            image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
            ports:
            - containerPort: 8080
            resources:
              requests:
                cpu: 200m

    Questo deployment non richiede esplicitamente una ComputeClass.

  2. Crea il deployment:

    kubectl apply --namespace=NAMESPACE_NAME \
        -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/refs/heads/main/quickstarts/hello-app/manifests/helloweb-deployment.yaml
    

    Sostituisci NAMESPACE_NAME con uno dei seguenti valori, a seconda di ciò che vuoi verificare:

    • Il nome di uno spazio dei nomi con una ComputeClass predefinita.
    • Il nome di uno spazio dei nomi che non ha una ComputeClass predefinita.

    GKE potrebbe impiegare un po' di tempo per creare nuovi nodi per eseguire i pod.

  3. Identifica i nodi che eseguono i pod del deployment di esempio:

    kubectl get pods --namespace=NAMESPACE_NAME \
        --selector=app=hello -o=wide
    

    L'output è simile al seguente:

    NAME                        READY   STATUS    RESTARTS   AGE     IP          NODE                                                  NOMINATED NODE   READINESS GATES
    helloweb-7795fbf856-58n5l   1/1     Running   0          9m21s   10.52.2.3   gke-cluster-1-nap-n2-highcpu-2-3muqi8-f213e529-rx7d   <none>           <none>
    
  4. Recupera le etichette del nodo:

    kubectl get node NODE_NAME --show-labels \
        | grep "cloud.google.com/compute-class"
    

    Sostituisci NODE_NAME con il nome del nodo dall'output del passaggio precedente.

    L'output è simile al seguente:

    NODE_NAME   Ready    <none>   22m   v1.32.4-gke.1236007
    # lines are omitted from this output
    cloud.google.com/compute-class=COMPUTECLASS_NAME,cloud.google.com/gke-boot-disk=pd-balanced,cloud.google.com/gke-container-runtime=containerd
    

    Il valore in COMPUTECLASS_NAME è uno dei seguenti:

    • ComputeClass predefinita a livello di cluster: default per i nodi creati da GKE Autopilot o dalla creazione automatica del pool di nodi. I nodi nei pool di nodi esistenti creati manualmente potrebbero non avere l'etichetta cloud.google.com/compute-class.
    • ComputeClass predefinita a livello di spazio dei nomi: il nome di ComputeClass che hai configurato come predefinita per lo spazio dei nomi.

Disattiva la risorsa ComputeClass predefinita

Per disattivare ComputeClass predefinita in uno spazio dei nomi o in un cluster, esegui una delle seguenti operazioni:

  • Per disattivare la ComputeClass predefinita a livello di spazio dei nomi per tutti i pod, rimuovi l'etichetta cloud.google.com/default-compute-class dallo spazio dei nomi:

    kubectl label namespaces NAMESPACE_NAME \
      cloud.google.com/default-compute-class-
    

    Il carattere - alla fine della chiave dell'etichetta rimuove tutte le etichette con quella chiave dall'oggetto Namespace nell'API Kubernetes.

  • Per disattivare ComputeClass predefinita a livello di spazio dei nomi per i pod non DaemonSet, rimuovi l'etichetta cloud.google.com/default-compute-class-non-daemonset dallo spazio dei nomi:

    kubectl label namespaces NAMESPACE_NAME \
      cloud.google.com/default-compute-class-non-daemonset-
    
  • Per disattivare ComputeClass predefinita a livello di cluster, utilizza il comando gcloud container clusters update con il flag --no-enable-default-compute-class:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --no-enable-default-compute-class
    

Passaggi successivi