Utilizzo dei carichi di lavoro basati su VM

Questa pagina mostra come eseguire il deployment delle VM su Cluster Anthos su Bare Metal utilizzando Anthos VM Runtime. Anthos VM Runtime utilizza KubeVirt per orchestrare le VM su cluster, consentendoti di lavorare con le tue app basate su VM e i tuoi carichi di lavoro in un ambiente di sviluppo uniforme. Puoi abilitare Anthos VM Runtime quando crei un nuovo cluster e su cluster esistenti.

Prima di iniziare

Queste istruzioni presuppongono che il cluster sia attivo e in esecuzione. In caso contrario, puoi seguire le istruzioni sulla guida rapida di Anthos clusters on bare metal per configurare rapidamente un cluster sulla tua workstation.

Abilita Anthos VM Runtime

Il runtime VM di Anthos è disabilitato, per impostazione predefinita. Per abilitare il runtime VM di Anthos, modifica la risorsa personalizzata VMRuntime nel cluster. A partire dalla versione 1.10.0 di Cluster Anthos on bare metal, la risorsa personalizzata VMRuntime viene installata automaticamente nei cluster.

Per abilitare Anthos VM Runtime:

  1. Aggiorna la risorsa personalizzata VMRuntime per impostare enabled su true.

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      # useEmulation default to false if not set.
      useEmulation: true
      # vmImageFormat default to "qcow2" if not set.
      vmImageFormat: qcow2
    
  2. Se il tuo nodo non supporta la virtualizzazione hardware o se hai dubbi, imposta useEmulation su true.

    Se disponibile, la virtualizzazione hardware offre prestazioni migliori rispetto all'emulazione del software. Se non viene specificato, il valore predefinito del campo useEmulation è false.

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      # useEmulation default to false if not set.
      useEmulation: true
      # vmImageFormat default to "qcow2" if not set.
      vmImageFormat: qcow2
    
  3. Puoi cambiare il formato dell'immagine utilizzato per le VM che crei impostando il campo vmImageFormat.

    Il campo vmImageFormat supporta due valori per il formato dell'immagine del disco: raw e qcow2. Se non imposti vmImageFormat, il runtime VM di Anthos utilizza il formato dell'immagine del disco raw per creare VM. Il formato raw potrebbe fornire prestazioni migliori rispetto a qcow2, una copia nel formato di scrittura, ma potrebbe utilizzare più disco. Per ulteriori informazioni sui formati delle immagini per la tua VM, consulta Formati dei file immagine del disco nella documentazione della QEMU.

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      # useEmulation default to false if not set.
      useEmulation: true
      # vmImageFormat default to "qcow2" if not set.
      vmImageFormat: qcow2
    
  4. Salva la configurazione e verifica che la risorsa personalizzata VMRuntime sia abilitata:

    kubectl describe vmruntime vmruntime
    

    I dettagli della risorsa personalizzata VMRuntime includono una sezione Status. Il runtime VM di Anthos è abilitato e funziona quando VMRuntime.Status.Ready è impostato su true.

Aggiornamento dei cluster

La risorsa personalizzata VMRuntime viene installata automaticamente nei cluster aggiornati alla versione 1.10.0 o successive. Quando esegui l'upgrade di un cluster 1.9.x alla versione 1.10.0 e successive, il processo di upgrade controlla le impostazioni del cluster e configura la risorsa personalizzata VMRuntime in modo che corrisponda alle impostazioni di Anthos VM Runtime sul tuo cluster 1.9.x. Se spec.kubevirt è presente nella risorsa cluster 1.9.x, il processo di upgrade abilita Anthos VM Runtime.

Le impostazioni delle risorse personalizzate VMRuntime hanno la precedenza sulle impostazioni precedenti del cluster Anthos VM Runtime, ad esempio spec.kubevirt.useEmulation, nella versione 1.10.0 o successive. Aggiorna la risorsa personalizzata VMRuntime per modificare le impostazioni di runtime VM di Anthos per il cluster 1.10.0 o versioni successive.

Installazione di virtctl

  1. Installa lo strumento dell'interfaccia a riga di comando di virtctl come plug-in kubectl

    export GOOGLE_APPLICATION_CREDENTIALS="bm-gcr.json"
    sudo -E ./bmctl install virtctl
    
  2. Verifica che virtctl sia installato:

    kubectl plugin list
    

    Se virtctl è elencata nella risposta, significa che è installata correttamente.

Crea una VM

Dopo aver abilitato KubeVirt nel cluster e installato il plug-in virtctl per kubectl, puoi iniziare a creare VM nel cluster utilizzando il comando kubectl virt create vm. Prima di eseguire questo comando, ti consigliamo di configurare un file cloud-init per assicurarti di avere l'accesso della console alla VM una volta creata.

Creare un file cloud-it personalizzato per l'accesso alla console

Esistono due modi per creare un file cloud-init personalizzato. Il modo più semplice è specificare il flag --os=<OPERATING_SYSTEM> durante la creazione della VM. Questo metodo configura automaticamente un semplice file cloud-init e funziona per i seguenti sistemi operativi.

  • Ubuntu
  • CentOS
  • Debian
  • Fedora

Dopo aver creato la VM, puoi accedervi per la prima volta utilizzando le seguenti credenziali e poi cambiare la password:

user: root
password: changeme

Se l'immagine contiene un altro sistema operativo basato su Linux o hai bisogno di una configurazione più avanzata, puoi creare manualmente un file cloud-init personalizzato e specificare il percorso del file specificando il flag --cloud-init-file=<path/to/file>. Nella sua forma più semplice, il file cloud-init è un file YAML che contiene quanto segue:

#cloud-config
user: root
password: changeme
lock_passwd: false
chpasswd: {expire: false}
disable_root: false
ssh_authorized_keys:
- <ssh-key>

Per configurazioni più avanzate, consulta Esempi di configurazione Cloud.

Dopo aver stabilito quale metodo utilizzare, puoi creare una VM.

Esegui il comando kubectl virt create vm

Puoi creare VM da immagini pubbliche o personalizzate.

Immagine pubblica

Se il cluster ha una connessione esterna, puoi creare una VM da un'immagine pubblica eseguendo:

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class="DISK_CLASS" \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=IMAGE_NAME \
    --memory=MEMORY_SIZE

Sostituisci quanto segue:

  • VM_NAME con il nome della VM che vuoi creare.
  • MODE con la modalità di accesso del disco di avvio. I valori possibili sono ReadWriteOnce (valore predefinito) o ReadWriteMany.
  • DISK_SIZE con le dimensioni che vuoi applicare al disco di avvio. Il valore predefinito è 20Gi.
  • DISK_CLASS con la classe di archiviazione del disco di avvio. Il valore predefinito è local-shared. Per un elenco delle classi di archiviazione disponibili, esegui kubectl get storageclass.
  • FILE_PATH con il percorso completo del file cloud-init personalizzato. A seconda dell'immagine, ciò potrebbe essere necessario per ottenere l'accesso alla console dalla VM dopo averla creata. Se prevedi di configurare automaticamente il file cloud-init con il flag --os, non specificare il flag --cloud-init-file. Se specifichi il flag --cloud-init-file, il flag --os viene ignorato. I valori accettabili per --os sono ubuntu, centos, debian e fedora.
  • CPU_NUMBER con il numero di CPU che vuoi configurare per la VM. Il valore predefinito è 1.
  • IMAGE_NAME con l'immagine VM, che può essere ubuntu20.04 (impostazione predefinita) centos8 o un URL dell'immagine.
  • MEMORY_SIZE con le dimensioni della memoria della VM. Il valore predefinito è 4Gi.

Immagine personalizzata

Quando crei una VM da un'immagine personalizzata, puoi specificare un'immagine da un server immagine HTTP o un'immagine archiviata localmente.

Server immagine HTTP

Puoi configurare un server HTTP utilizzando Apache o nginx e caricare l'immagine personalizzata nella cartella esposta. Puoi quindi creare una VM dall'immagine personalizzata eseguendo:

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=DISK_ACCESS_MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class=DISK_CLASS \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=http://SERVER_IP/IMAGE_NAME \
    --memory=MEMORY_SIZE

Sostituisci quanto segue:

  • VM_NAME con il nome della VM che vuoi creare.
  • DISK_ACCESS_MODE con la modalità di accesso del disco di avvio. I valori possibili sono ReadWriteOnce (predefinito) o ReadWriteMany.
  • DISK_SIZE con le dimensioni che vuoi applicare al disco di avvio. Il valore predefinito è 20Gi.
  • DISK_CLASS con la classe di archiviazione del disco di avvio. Il valore predefinito è local-shared. Per un elenco delle classi di archiviazione disponibili, esegui kubectl get storageclass.
  • FILE_PATH con il percorso completo del file cloud-init personalizzato. A seconda dell'immagine, ciò potrebbe essere necessario per ottenere l'accesso alla console dalla VM dopo averla creata. Se prevedi di configurare automaticamente il file cloud-init con il flag --os, non specificare il flag --cloud-init-file. Se specifichi il flag --cloud-init-file, il flag --os viene ignorato. I valori accessibili per --os sono ubuntu, centos, debian e fedora.
  • CPU_NUMBER con il numero di CPU che vuoi configurare per la VM. Il valore predefinito è 1.
  • SERVER_IP con l'indirizzo IP del server che ospita l'immagine.
  • IMAGE_NAME con il nome file dell'immagine personalizzata.
  • MEMORY_SIZE con le dimensioni della memoria della VM. Il valore predefinito è 4Gi.

Immagine archiviata localmente

Puoi archiviare l'immagine personalizzata in locale e creare da lì una VM eseguendo:

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=DISK_ACCESS_MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class=DISK_CLASS \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=IMAGE_PATH \
    --memory=MEMORY_SIZE \

Sostituisci quanto segue:

  • VM_NAME con il nome della VM che vuoi creare.
  • DISK_ACCESS_MODE con la modalità di accesso del disco di avvio. I valori possibili sono ReadWriteOnce (predefinito) o ReadWriteMany.
  • DISK_SIZE con le dimensioni che vuoi applicare al disco di avvio. Il valore predefinito è 20Gi.
  • DISK_CLASS con la classe di archiviazione del disco di avvio. Il valore predefinito è local-shared.
  • FILE_PATH con il percorso completo del file cloud-init personalizzato. A seconda dell'immagine, ciò potrebbe essere necessario per ottenere l'accesso alla console dalla VM dopo averla creata. Se prevedi di configurare automaticamente il file cloud-init con il flag --os, non specificare il flag --cloud-init-file. Se specifichi il flag --cloud-init-file, il flag --os viene ignorato. I valori accessibili per --os sono ubuntu, centos, debian e fedora.
  • CPU_NUMBER con il numero di CPU che vuoi configurare per la VM. Il valore predefinito è 1.
  • IMAGE_PATH con il percorso del file locale per l'immagine personalizzata.
  • MEMORY_SIZE con le dimensioni della memoria della VM. Il valore predefinito è 4Gi.

Modifica i valori predefiniti per i flag

Il comando kubectl virt create vm utilizza valori predefiniti per compilare automaticamente i flag non specificati quando viene eseguito. Puoi modificare questi valori predefiniti eseguendo:

kubectl virt config default FLAG

Sostituisci FLAG con il flag del parametro per cui vuoi modificare il valore predefinito.

Esempio: il seguente comando cambia la configurazione predefinita della CPU dall'impostazione predefinita iniziale di 1 in 2:

kubectl virt config default --cpu=2

Per un elenco dei flag supportati e i relativi valori predefiniti attuali, esegui:

kubectl virt config default -h

Le configurazioni predefinite vengono archiviate sul lato client come file locale denominato ~/.virtctl.default. Puoi anche modificare le configurazioni predefinite modificando questo file.

Accedi alla tua VM

Puoi accedere alle VM utilizzando i seguenti metodi:

Accesso alla console

Per accedere a una VM dalla console, esegui questo comando:

kubectl virt console VM_NAME

Sostituisci VM_NAME con il nome della VM a cui vuoi accedere.

Accesso VNC

Per accedere a una VM tramite VNC, esegui:

# This requires remote-viewer from the virt-viewer package and a graphical desktop from where you run virtctl
kubectl virt vnc VM_NAME

Sostituisci VM_NAME con il nome della VM a cui vuoi accedere.

Accesso interno

Gli indirizzi IP delle VM del cluster sono accessibili direttamente da tutti gli altri pod del cluster. Per trovare l'indirizzo IP di una VM, esegui:

kubectl get vmi VM_NAME

Sostituisci VM_NAME con il nome della VM a cui vuoi accedere.

Il comando restituisce un messaggio simile al seguente:

NAME     AGE   PHASE     IP              NODENAME
vm1      13m   Running   192.168.1.194   upgi-bm002

Accesso esterno

Le VM create nel cluster hanno indirizzi di rete dei pod a cui è possibile accedere solo dall'interno del cluster. Per accedere alle VM del cluster esternamente:

  1. Esponi la VM come servizio di bilanciamento del carico:

    kubectl virt expose vm VM_NAME \
        --port=LB_PORT \
        --target-port=VM_PORT \
        --type=LoadBalancer \
        --name=SERVICE_NAME
    

    Sostituisci quanto segue:

    • VM_NAME con il nome della VM a cui vuoi accedere.
    • LB_PORT con la porta del servizio bilanciatore del carico esposto.
    • VM_PORT con la porta sulla VM a cui vuoi accedere tramite il servizio bilanciatore del carico.
    • SERVICE_NAME con il nome che vuoi assegnare a questo servizio di bilanciamento del carico.
  2. Recupera l'indirizzo IP esterno del servizio bilanciatore del carico:

    kubectl get svc SERVICE_NAME
    

    Sostituisci SERVICE_NAME con il nome del servizio bilanciatore del carico che espone la VM.

    Puoi accedere alla porta di destinazione della VM tramite l'indirizzo IP indicato nel campo EXTERNAL-IP della risposta.

Esempio

Se hai una VM denominata galaxy a cui vuoi accedere dall'esterno del cluster tramite SSH, esegui questo comando:

kubectl virt expose vm galaxy \
   --port=25022 \
   --target-port=22 \
   --type=LoadBalancer \
   --name=galaxy-ssh

Quindi recupera l'indirizzo IP del bilanciatore del carico:

kubectl get svc galaxy-ssh

Il comando restituisce un messaggio simile al seguente:

NAME        TYPE          CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
galaxy-ssh  LoadBalancer  10.96.250.76   21.1.38.202   25000:30499/TCP   4m40s

Ora puoi accedere alla VM tramite SSH tramite 21.1.38.202:25022 (VIP:port) dall'esterno del cluster:

ssh root@21.1.38.202:22 -p 25022

Ispeziona la telemetria e i log della console VM

La telemetria delle VM e i log della console sono stati integrati in Google Cloud Console. Le informazioni di telemetria e i dati di log sono fondamentali per monitorare lo stato delle VM e risolvere eventuali problemi con le VM del cluster.

Telemetria delle VM

La dashboard Anthos VM status, fornisce dati in tempo reale sulla telemetria delle VM del cluster.

Per visualizzare le informazioni di telemetria per le VM del cluster:

  1. Nella console Google Cloud, seleziona Monitoring o fai clic sul seguente pulsante:

    Vai a Monitoring

  2. Seleziona Dashboard.

    Dashboard dello stato delle VM del cluster Anthos nell'elenco delle dashboard di Monitoring

  3. Fai clic su Stato VM Anthos nell'elenco Tutte le dashboard.

    Dettagli sullo stato della VM del cluster Anthos

Log della console VM

I log della console seriale delle VM vengono trasmessi in streaming a Cloud Logging e possono essere visualizzati in Esplora log.

Esplora log che mostra i dati delle VM del cluster Anthos

Elimina le VM e le relative risorse

Eliminazione solo della VM

kubectl virt delete vm VM_NAME

Sostituisci VM_NAME con il nome della VM che vuoi eliminare.

Eliminazione solo dei dischi VM

kubectl virt delete disk DISK_NAME

Sostituisci DISK_NAME con il nome del disco che vuoi eliminare. Se tenti di eliminare un disco VM prima di eliminarlo, il disco viene contrassegnato per l'eliminazione in attesa dell'eliminazione della VM.

Eliminazione di VM e risorse

kubectl virt delete vm VM_NAME --all

Sostituisci VM_NAME con il nome della VM che vuoi eliminare.

Se vuoi controllare le risorse utilizzate dalla VM che verranno eliminate, puoi specificare il flag --dry-run insieme a --all.

Disabilita il runtime VM di Anthos

Quando non hai più bisogno di utilizzare Anthos VM Runtime, puoi disabilitare questa funzionalità.

mmctl

  • Per disattivare il runtime, utilizza lo strumento bmctl:

    bmctl disable vmruntime --kubeconfig KUBECONFIG_PATH \
      --timeout TIMEOUT_IN_MINUTES \
      --force true
    

    Specifica il percorso del file kubeconfig per il cluster e i valori delle seguenti opzioni di configurazione:

    • --timeout: TIMEOUT_IN_MINUTES in attesa di risorse esistenti delle VM da eliminare. Il valore predefinito è 10 minuti.
    • --force: imposta su true per confermare che vuoi eliminare le risorse VM esistenti. Il valore predefinito è false.

Risorsa personalizzata

Prima di poter disabilitare il runtime VM di Anthos in un cluster modificando la risorsa personalizzata VMRuntime, devi assicurarti che tutte le VM nel cluster siano state eliminate.

Per disabilitare il runtime, aggiorna la risorsa personalizzata VMRuntime:

  1. Verifica la presenza di VM esistenti nel cluster:

    kubectl get vm
    

    Se il comando mostra che nel cluster sono ancora presenti VM, devi eliminarle prima di procedere.

  2. Modifica la risorsa personalizzata VMRuntime:

    kubectl edit vmruntime
    
  3. Imposta enabled:false nella specifica:

    apiVersion: vm.cluster.gke.io/v1`
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: false
      useEmulation: true
      vmImageFormat: qcow2
    
  4. Salva nell'editor la specifica aggiornata delle risorse personalizzate.

  5. Per verificare che la risorsa personalizzata VMRuntime sia disabilitata, visualizza i pod eseguiti nello spazio dei nomi vm-system:

    kubectl get pods --namespace vm-system
    

    Il runtime VM di Anthos è disabilitato quando solo i pod che appartengono al deployment vmruntime-controller-manager sono in esecuzione nello spazio dei nomi.

Passaggi successivi