Utilizzare le VM nidificate con i cluster GKE

Puoi creare istanze di macchine virtuali (VM) all'interno di altre VM utilizzando la virtualizzazione nidificata. Compute Engine aggiunge istruzioni di virtualizzazione a serie di macchine specifiche in modo che queste istanze VM possano creare VM nidificate. Poiché i nodi Google Kubernetes Engine (GKE) vengono eseguiti su VM Compute Engine, i workload GKE possono creare e utilizzare VM nidificate. Questo documento mostra come abilitare la virtualizzazione nidificata in GKE.

Come funzionano le VM nidificate in GKE

Per utilizzare le VM nidificate in GKE, devi abilitare la virtualizzazione nidificata per nodi o node pool specifici. Le estensioni di virtualizzazione della CPU corrispondenti, come Intel Virtualization Technology (VT-x) o AMD Virtualization (AMD-V) sono abilitate nelle VM sottostanti. Puoi quindi attivare la creazione di VM nidificate dai pod utilizzando software come QEMU o Kata Containers.

In GKE, le VM nidificate sono utili per i seguenti casi d'uso:

  • Esegui codice non attendibile, come gli agenti AI, in VM leggere, come Kata Containers. Per ulteriori informazioni su questo caso d'uso, consulta Utilizzare Kata Containers open source con Agent Sandbox su GKE.
  • Aggiungi un livello di isolamento assistito dall'hardware per i workload multi-tenant.
  • Esegui software specializzati come gli emulatori Android nel cloud.

Impatto sulle prestazioni ridotto

Con la virtualizzazione nidificata assistita dall'hardware, i workload in esecuzione sulle VM nidificate potrebbero subire una riduzione delle prestazioni rispetto alle configurazioni di virtualizzazione non nidificate. L'impatto sulle prestazioni dipende dal profilo del workload specifico, incluse le caratteristiche di utilizzo di I/O e memoria utilizzata.

Inoltre, la creazione di VM nidificate sulle VM sottostanti dei nodi GKE potrebbe influire sulle prestazioni di altri workload in esecuzione su questi nodi.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti attività:

  • Abilita l'API Google Kubernetes Engine.
  • Abilita 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 gcloud components update comando. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.

Requisiti e limitazioni

Prima di abilitare la virtualizzazione nidificata con GKE e consentire ai pod di creare VM nidificate, tieni presente le seguenti informazioni:

  • Puoi configurare i node pool con VM nidificate solo con un numero limitato di serie di macchine VM. Consulta la riga Virtualizzazione nidificata del confronto tra serie di macchine per verificare le serie di macchine supportate.
  • La virtualizzazione nidificata non è supportata nei node pool Windows Server.
  • Non puoi utilizzare la virtualizzazione nidificata se il vincolo Disabilita la virtualizzazione nidificata della VM è applicato alla policy dell'organizzazione.
  • Devi impostare securityContext.privileged:true per consentire ai pod di interagire con le VM nidificate.
  • Se utilizzi GKE Autopilot, non puoi creare nodi pod con privilegi, tranne nei seguenti scenari:

  • Non puoi abilitare la virtualizzazione nidificata nei node pool esistenti.

  • La virtualizzazione nidificata è un'impostazione immutabile in GKE.

  • Se utilizzi ComputeClasses per abilitare la virtualizzazione nidificata, il cluster deve eseguire GKE versione 1.37.0-gke.4713000 o successive.

Abilita virtualizzazione nidificata

Le sezioni seguenti mostrano come abilitare la virtualizzazione nidificata in GKE nei seguenti modi:

  • Utilizza ComputeClasses: in modalità Autopilot o Standard, abilita la virtualizzazione nidificata per configurazioni di nodi specifiche in una ComputeClass. Utilizzando questo metodo, puoi abilitare la virtualizzazione nidificata nei node pool creati automaticamente ed eseguire il fallback tra più configurazioni di nodi con priorità.
  • Utilizza l'API GKE: in modalità Standard, utilizza un client come la Google Cloud console, gcloud CLI o Terraform per creare node pool specifici che utilizzano la virtualizzazione nidificata.

Abilita utilizzando ComputeClasses

Puoi utilizzare una ComputeClass per abilitare la virtualizzazione nidificata per gruppi di nodi specifici in modalità Autopilot o Standard. ComputeClasses è l'unico metodo con cui puoi abilitare la virtualizzazione nidificata per i node pool creati automaticamente e i nodi Autopilot. Per eseguire il deployment di una ComputeClass di esempio che abilita la virtualizzazione nidificata, segui questi passaggi:

  1. Salva il seguente manifest di ComputeClass come file denominato nested-virt-class.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: nested-virt-class
    spec:
      priorities:
      - machineFamily: c3
        spot: true
        enableNestedVirtualization: true
      - machineFamily: c4
        spot: false
        enableNestedVirtualization: true
      - machineFamily: c4d
        spot: true
        enableNestedVirtualization: true
      nodePoolConfig:
        imageType: "cos_containerd"
      nodePoolAutoCreation:
        enabled: true
      whenUnsatisfiable: DoNotScaleUp
    

    Questa ComputeClass di esempio ha le seguenti proprietà:

    • Dà la priorità alle istanze C3 sulle VM spot, esegue il fallback alle istanze C4 on demand e poi alle istanze C4D sulle VM spot.
    • Abilita la virtualizzazione nidificata per tutte le istanze.
    • Impedisce a GKE di eseguire lo scale up della serie di macchine predefinita del cluster se le istanze con priorità non sono disponibili.
    • Utilizza l'immagine del nodo Container-Optimized OS per tutti i nodi.
    • Abilita la creazione automatica dei pool di nodi, in modo che GKE possa creare nuovi node pool per eseguire i pod quando necessario.

    In alternativa, puoi abilitare la virtualizzazione nidificata per tutte le regole di priorità nella ComputeClass specificando il enableNestedVirtualization: true campo nel spec.priorityDefaults campo.

  2. Crea la ComputeClass:

    kubectl apply -f nested-virt-class.yaml
    

    Quando abiliti la virtualizzazione nidificata in una ComputeClass, GKE verifica la compatibilità delle serie di macchine specificate con le VM nidificate. Se una serie di macchine in una regola di priorità che abilita la virtualizzazione nidificata non è compatibile, GKE ti avvisa. Tuttavia, questo controllo potrebbe non trovare tutte le configurazioni incompatibili.

  3. Per attivare la creazione pool di nodi, crea un pod che seleziona la ComputeClass:

    1. Salva il seguente manifest del pod come file denominato nested-virt-example-pod.yaml:

      apiVersion: v1
      kind: Pod
      metadata:
        name: nested-virt-example-pod
      spec:
        nodeSelector:
          cloud.google.com/compute-class: nested-virt-class
        containers:
        - name: example-container
          image: registry.k8s.io/pause:3.9
      
    2. Crea il pod:

      kubectl apply -f nested-virt-example-pod.yaml
      

I nodi creati da GKE per questa ComputeClass hanno la virtualizzazione nidificata abilitata. Puoi eseguire applicazioni che creano VM nidificate su questi nodi. Tutti i pod che utilizzano la ComputeClass possono creare VM nidificate. Ad esempio, puoi installare Kata Containers su questi nodi specificando un selettore di nodi per l'etichetta cloud.google.com/compute-class="nested-virt-class".

Abilita nei node pool standard

Se non vuoi utilizzare ComputeClasses, puoi abilitare manualmente la virtualizzazione nidificata per nuovi node pool specifici nei cluster standard durante una delle seguenti operazioni:

  • Quando crei un nuovo cluster standard, che abilita la virtualizzazione nidificata per il pool di nodi predefinito. Questa abilitazione si applica solo al pool di nodi predefinito. GKE non abilita automaticamente la virtualizzazione nidificata per i node pool aggiuntivi che crei in un secondo momento.
  • Quando crei un nuovo pool di nodi in un cluster standard esistente.

Per abilitare la virtualizzazione nidificata nei node pool creati manualmente, seleziona una delle seguenti opzioni:

Console

  • Abilita la virtualizzazione nidificata per il pool di nodi predefinito di un nuovo cluster:

    1. Nella Google Cloud console, vai alla pagina Crea un cluster Kubernetes.

      Vai a Crea un cluster Kubernetes

    2. Configura le impostazioni di base per il cluster.
    3. Nel menu di navigazione, nella sezione Node pool, espandi la sezione default-pool e fai clic su Nodi.
    4. Nella sezione Configurazione macchina, scegli un tipo di macchina supportato (vedi la riga Virtualizzazione nidificata).
    5. Dopo la sezione Prenotazioni, seleziona la casella di controllo Abilita virtualizzazione nidificata.
    6. Per creare il cluster, fai clic su Crea.
  • Abilita la virtualizzazione nidificata per un nuovo pool di nodi in un cluster esistente:

    1. Nella Google Cloud console, vai alla pagina Cluster Kubernetes.

      Vai a Cluster Kubernetes

    2. Fai clic sul nome del cluster in cui vuoi creare il nuovo node pool.

    3. Configura il pool di nodi.

    4. Fai clic sulla scheda Nodi.

    5. Nell'intestazione della sezione Node pool, fai clic su Crea node pool gestito dall'utente.

    6. Nel menu di navigazione, seleziona Nodi.

    7. Nella sezione Configurazione macchina, scegli una serie di macchine che supporta la virtualizzazione nidificata. Per ulteriori informazioni, filtra la tabella di confronto tra serie di macchine per la proprietà Virtualizzazione nidificata.

    8. Seleziona la casella di controllo Abilita virtualizzazione nidificata. Se questa casella di controllo è disabilitata, verifica di aver selezionato una serie di macchine che supporta la virtualizzazione nidificata.

    9. Fai clic su Crea.

gcloud

  • Abilita la virtualizzazione nidificata per il pool di nodi predefinito di un nuovo cluster:

    gcloud container clusters create CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
        --enable-nested-virtualization \
        --node-labels=nested-virtualization=enabled \
        --machine-type=MACHINE_TYPE
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: un nome per il cluster.
    • CONTROL_PLANE_LOCATION: la regione o la zona per il piano di controllo del cluster.
    • MACHINE_TYPE: un tipo di macchina che supporta la virtualizzazione nidificata, ad esempio n4-standard-8. Per ulteriori informazioni, filtra la tabella di confronto tra serie di macchine per la proprietà Virtualizzazione nidificata.
  • Abilita la virtualizzazione nidificata per un nuovo pool di nodi in un cluster esistente:

    gcloud container node-pools create NODEPOOL_NAME \
        --enable-nested-virtualization \
        --node-labels=nested-virtualization=enabled \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --machine-type=MACHINE_TYPE
    

    Sostituisci quanto segue:

    • NODEPOOL_NAME: un nome per il pool di nodi.
    • CLUSTER_NAME: il nome del cluster esistente.
    • CONTROL_PLANE_LOCATION: la località del piano di controllo del cluster.
    • MACHINE_TYPE: un tipo di macchina che supporta la virtualizzazione nidificata, ad esempio n4-standard-8. Per ulteriori informazioni, filtra la tabella di confronto tra serie di macchine per la proprietà Virtualizzazione nidificata.

Dopo aver creato il cluster o pool di nodi, puoi verificare se la virtualizzazione nidificata è abilitata. I nodi in questi node pool hanno l'etichetta del nodo nested-virtualization=enabled Kubernetes, che puoi utilizzare per pianificare i pod che creano VM nidificate.

Pianifica un pod su un nodo che supporta la virtualizzazione nidificata

Per pianificare un pod su un nodo con la virtualizzazione nidificata abilitata, aggiungi il seguente selettore di nodi alla specifica:

nodeSelector:
  nested-virtualization: enabled

Inoltre, affinché il pod si connetta a una VM nidificata, devi impostarlo come privilegiato configurando securityContext.privileged:true.

Passaggi successivi