Connettiti alle VM che utilizzano il runtime VM su GDC

Questo documento è rivolto ai proprietari di applicazioni che eseguono Google Distributed Cloud. Questo documento illustra come connettersi alle macchine virtuali (VM) che utilizzano il runtime VM su GDC. Puoi connetterti alle VM direttamente utilizzando un indirizzo IP o utilizzando gli strumenti integrati per l'accesso SSH o alla console.

Prima di iniziare

Per completare questo documento, devi disporre dell'accesso alle seguenti risorse:

Configurare l'accesso SSH senza password alle VM

L'accesso SSH diretto alla VM senza password è facilitato da un agente guest installato da VM Runtime su GDC. Tra le altre funzioni, l'agente guest installa e scade le chiavi SSH. Questa funzionalità consente di creare un tunnel SSH per accedere alla VM da client esterni alla rete del cluster.

Attivare l'agente ospite

Per attivare l'agente ospite:

  1. Controlla la risorsa personalizzata VirtualMachine per verificare che sia configurata per attivare l'agente ospite:

    kubectl get gvm VM_NAME -o yaml --kubeconfig KUBECONFIG
    

    Il campo spec.osType deve essere impostato sul sistema operativo della VM, Linux o Windows. La sezione spec.guestEnvironment non deve essere configurata esplicitamente come vuota. Se la sezione è configurata come vuota (guestEnvironment: {}), puoi rimuoverla completamente per attivare l'agente invitato.

    La risorsa personalizzata VirtualMachine per la VM a cui vuoi accedere dovrebbe avere il seguente aspetto:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: sample-vm
    spec:
      compute:
        cpu:
          vcpus: 2
        memory:
          capacity: 4Gi
    ...
      osType: Linux
    ...
    
  2. Se necessario, utilizza kubectl edit per aggiornare la risorsa personalizzata VirtualMachine.

  3. Per verificare che l'agente guest funzioni, controlla status nella risorsa personalizzata della VM:

    kubectl get gvm VM_NAME --kubeconfig KUBECONFIG
    

    Quando l'agente ospite è in funzione, viene visualizzato status: "True" per le condizioni GuestEnvironmentEnabled e GuestEnvironmentDataSynced.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      ...
      name: vm-sample-01
      ...
    status:
      conditions:
      - lastTransitionTime: "2022-10-05T22:40:26Z"
        message: ""
        observedGeneration: 1
        reason: UserConfiguration
        status: "True"
        type: GuestEnvironmentEnabled
      - lastTransitionTime: "2022-10-06T21:55:57Z"
        message: ""
        observedGeneration: 1
        reason: GuestEnvironmentDataSynced
        status: "True"
        type: GuestEnvironmentSynced
      ...
    

Attivare l'accesso SSH senza password

Per abilitare l'accesso SSH senza password per la VM:

  1. Crea un file manifest VirtualMachineAccessRequest, ad esempio vm-access-request.yaml, nell'editor che preferisci:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineAccessRequest
    metadata:
      name: VMAR_NAME
      namespace: VM_NAMESPACE
    spec:
      vm: VM_NAME
      user: USERNAME
      ssh:
        key: PUBLIC_SSH_KEY
        ttl: EXPIRATION_TIME
    

    Sostituisci quanto segue:

    • VMAR_NAME: il nome della risorsa richiesta di accesso.
    • VM_NAMESPACE: lo spazio dei nomi della VM a cui vuoi accedere.
    • VM_NAME: il nome della VM a cui vuoi accedere.
    • USERNAME: il nome utente dell'utente che accede alla VM.
    • PUBLIC_SSH_KEY: la chiave pubblica per l'accesso SSH. In genere, si tratta dei contenuti del file id_rsa.pub.
    • EXPIRATION_TIME: il campo ttl (time-to-live) specifica la durata della validità della chiave SSH.

      Ad esempio, se specifichi 30m, la chiave SSH scade dopo 30 minuti.

      Questo flag utilizza le seguenti unità:

      • s per secondi
      • m per minuti
      • h per ore
      • d per giorni
  2. Utilizza kubectl apply per creare VirtualMachineAccessRequest dal file manifest. Ad esempio, se hai chiamato il file manifestvm-access-request.yaml,

    kubectl apply -f MANIFEST --kubeconfig KUBECONFIG
    

    Sostituisci quanto segue:

    • MANIFEST: il nome del file manifest della richiesta di accesso. Ad esempio, vm-access-request.yaml.
    • KUBECONFIG: il percorso del file kubeconfig del cluster che ospita la VM a cui stai accedendo.
  3. Per verificare che la configurazione della richiesta di accesso sia andata a buon fine, controlla lo stato del VirtualMachineAccessRequest:

    kubectl get vmar VMAR_NAME -o yaml --kubeconfig KUBECONFIG
    

    Se la configurazione è riuscita, la sezione status include state: configured:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineAccessRequest
    metadata:
      ...
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"vm.cluster.gke.io/v1","kind":"VirtualMachineAccessRequest",
          "metadata":{"annotations":{},"name":"vmar-sample","namespace":"default"},
          "spec":{"ssh":{"key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQ...jMLHFc=
              sample-user@sample-host","ttl":"5h"},"user":"sample-user","vm":"vm-sample-01"}}
      creationTimestamp: "2022-10-06T21:55:57Z"
      finalizers:
      - vm.cluster.gke.io/vmar-finalizer
      generation: 2
      name: vmar-sample
      namespace: default
      resourceVersion: "13033921"
      uid: 282d72ad-f48d-4e89-af22-336940ac9f58
    spec:
      ssh:
        key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQ...jMLHFc= sample-user@sample-host
        ttl: 5m0s
      user: sample-user
      vm: vm-sample-01
    status:
      processedAt: "2022-10-06T21:55:57Z"
      state: configured
    

Disattivare l'agente ospite

Quando crei una nuova VM e imposti il campo osType, l'agente ospite viene attivato. Mentre questa funzionalità è in anteprima, puoi disattivarla modificando la risorsa personalizzata VirtualMachine. La disattivazione dell'agente ospite disattiva l'accesso SSH senza password alla VM.

Per disattivare l'agente ospite:

  1. Usa kubectl per arrestare la VM prima di apportare modifiche alla configurazione:

    kubectl virt stop VM_NAME --kubeconfig KUBECONFIG
    
  1. Modifica la risorsa VM:

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  2. Aggiorna la configurazione di VirtualMachine per aggiungere esplicitamente un spec.guestEnvironment vuoto:

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachine
    metadata:
      name: vm-example
      namespace: default
    spec:
      compute:
      ...
      osType: Linux
      guestEnvironment: {}
    
  3. Salva e chiudi il file manifest della VM aggiornato nell'editor.

  4. Usa kubectl per avviare la VM:

    kubectl virt start VM_NAME --kubeconfig KUBECONFIG
    

Connettersi utilizzando un indirizzo IP

Se la VM ha un indirizzo IP accessibile e disponi già delle credenziali per accedere alla VM, puoi connetterti utilizzando un protocollo come SSH, VNC o RDP.

Connettiti tramite indirizzo IP

Se puoi connetterti direttamente all'indirizzo IP della VM, utilizza uno dei seguenti metodi:

SSH

  1. Visualizza i dettagli della VM per visualizzarne l'indirizzo IP:

    kubectl get gvm VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

    Sostituisci i seguenti valori:

    • VM_NAME: il nome della VM.
    • VM_NAMESPACE: lo spazio dei nomi per la tua VM.

    L'esempio di output seguente mostra le informazioni e l'indirizzo IP della VM:

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. Connettiti alla VM utilizzando un client SSH:

    ssh USERNAME@IP_ADDRESS -i PATH_TO_KEY
    

    Sostituisci i seguenti valori:

    • USERNAME: il nome utente di un account sulla VM.
    • IP_ADDRESS: l'indirizzo IP della VM ottenuto nel passaggio precedente.
    • PATH_TO_KEY: il percorso della chiave SSH privata.

VNC o RDP

Virtual Network Computing (VNC) e Remote Desktop Protocol (RDP) ti consentono di utilizzare la console grafica per accedere alla VM. Quando utilizzi un indirizzo IP, devi attivare VNC o RDP nel sistema operativo guest prima di poterli utilizzare per connetterti alla VM. Per informazioni su come attivare e utilizzare VNC o RDP, consulta la documentazione del sistema operativo guest.

Per accedere alla VM sono necessarie anche credenziali esistenti, ad esempio quelle che definisci per creare le credenziali utente iniziali quando crei una VM.

  1. Visualizza i dettagli della VM per visualizzarne l'indirizzo IP:

    kubectl get gvm VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

    Sostituisci i seguenti valori:

    • VM_NAME: il nome della VM.
    • VM_NAMESPACE: lo spazio dei nomi per la tua VM.

    L'esempio di output seguente mostra le informazioni e l'indirizzo IP della VM:

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. Connettiti all'indirizzo IP della VM ottenuto nel passaggio precedente utilizzando uno strumento client e la porta appropriata, ad esempio la porta VNC 5900 o la porta RDP3389.

Connessione tramite un servizio

Se la VM si connette al valore predefinito pod-network e non riesci a comunicare direttamente con l'indirizzo IP della VM, esponi la VM dietro un bilanciatore del caricoService.

  1. Crea un file manifest Service, ad esempio my-service-load-balancer.yaml, nell'editor che preferisci:

    nano my-service-load-balancer.yaml
    
  2. Copia e incolla il seguente manifest YAML:

    apiVersion: v1
    kind: Service
    metadata:
      name: VM_NAME-service
    spec:
      selector:
        kubevirt/vm: VM_NAME
      ports:
      - name: PORT_NAME
        protocol: PROTOCOL_TYPE
        port: EXTERNAL_PORT
        targetPort: TARGET_PORT
      type: LoadBalancer
    

    In questo tipo di manifest Service, sostituisci i seguenti valori:

    • VM_NAME: il nome della VM da esporre per l'accesso remoto.
    • PORT_NAME: il nome del protocollo, ad esempio ssh, vnc o rdp.
    • PROTOCOL_TYPE: il tipo di protocollo, ad esempio TCP per SSH e RDP o UDP per VNC.
    • EXTERNAL_PORT: il numero di porta esterna da esporre e a cui ti colleghi.
    • TARGET_PORT: la porta di destinazione, ad esempio 22 per SSH.
  3. Salva e chiudi il file manifest Service nell'editor.

  4. Crea il Service utilizzando kubectl:

    kubectl apply -f my-service-load-balancer.yaml  --kubeconfig KUBECONFIG
    
  5. Ottieni l'indirizzo EXTERNAL-IP del servizio del bilanciatore del carico:

    kubectl get service VM_NAME-service --kubeconfig KUBECONFIG
    

    Viene visualizzato l'indirizzo IP del bilanciatore del carico, come mostrato nell'esempio di output seguente:

    NAME          TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    vm1-service   LoadBalancer   172.26.232.167   10.200.0.51   22:31141/TCP   6d20h
    
  6. Connettiti all'indirizzo EXTERNAL-IP del bilanciatore del carico con un protocollo standard, ad esempio utilizzando un client SSH:

    ssh USERNAME@LOAD_BALANCER_IP_ADDRESS  -i PATH_TO_KEY
    

    Sostituisci i seguenti valori:

    • USERNAME: il nome utente di un account sulla VM.
    • LOAD_BALANCER_IP_ADDRESS: l'indirizzo IP del bilanciatore del carico.
    • PATH_TO_KEY: il percorso della chiave SSH privata.

Connettiti direttamente tramite SSH

Se il client è connesso alla stessa rete fisica dei nodi del cluster bare metal e non è necessario l'utilizzo di tunnel SSH per connettersi al cluster, puoi eseguire la connessione utilizzando kubectl virt ssh.

  1. Per utilizzare SSH per connettere una VM Linux dalla console con il componente aggiuntivo virtctl:

    kubectl virt ssh USERNAME@VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

    Sostituisci i seguenti valori:

    • USERNAME: il nome utente per accedere alla VM. Questo account viene creato se non esiste nella VM.
    • VM_NAME: il nome della VM.
  2. Dopo aver eseguito la connessione alla VM tramite SSH e non aver più bisogno della connessione, esci dalla sessione SSH:

    exit
    

Connettiti direttamente utilizzando la console

Se non disponi di connettività di rete diretta alla VM Linux per l'accesso SSH, connettiti alla console della VM utilizzando il runtime della VM nella console GDC. Questo metodo apre una console seriale. Al momento della connessione, viene visualizzato un prompt di comando anziché una console grafica.

  1. Per accedere a una VM Linux dalla console, utilizza il componente aggiuntivo virtctl:

    kubectl virt console VM_NAME --kubeconfig KUBECONFIG
    

    Sostituisci VM_NAME con il nome della VM.

    Quando richiesto, inserisci le credenziali utente per la VM. Queste credenziali devono essere presenti sulla VM o essere applicate al momento della sua creazione. Se necessario, consulta la sezione seguente per creare le credenziali utente iniziali quando crei una VM.

  2. Dopo aver eseguito correttamente la connessione alla console della VM e non aver più bisogno della connessione, esci dalla sessione e dalla console della VM:

    Ctrl + ]
    

Connettiti direttamente tramite VNC

Puoi utilizzare il comando kubectl virt vnc per aprire la console grafica Virtual Network Computing (VNC) per accedere alle VM. Questo metodo funziona per le VM che eseguono un sistema operativo guest Windows o Linux. Quando utilizzi il comando kubectl virt vnc, il runtime della VM su GDC apre VNC per te, quindi non è necessario attivare VNC nel sistema operativo guest.

Per accedere alla VM sono necessarie credenziali esistenti, ad esempio quelle che definisci per creare le credenziali utente iniziali quando crei una VM.

  1. Per accedere a una VM utilizzando VNC, utilizza il componente aggiuntivo virtctl:

    kubectl virt vnc VM_NAME --kubeconfig KUBECONFIG
    

    Sostituisci VM_NAME con il nome della VM.

    Quando richiesto, inserisci le credenziali utente per la VM.

  2. Dopo aver eseguito correttamente la connessione alla sessione VNC della VM e non avere più bisogno della connessione, disconnettiti dalla VM per chiudere la connessione VNC.

Creare le credenziali utente iniziali

Quando ti connetti alla VM utilizzando la console, devi specificare le credenziali dell'utente. La procedura per la creazione delle credenziali utente iniziali è diversa per i sistemi operativi guest Linux e Windows.

Sistema operativo guest Linux

Per le VM Linux, le credenziali utente possono essere integrate nelle immagini personalizzate o possono essere specificate quando crei una VM.

  • Utilizza il parametro --configure-initial-password con il comando kubectl virt create:

    kubectl virt create vm VM_NAME \
        --image ubuntu20.04 \
        --os-type Linux \
        --configure-initial-password USERNAME:PASSWORD \
        --kubeconfig KUBECONFIG
    

    Sostituisci i seguenti valori:

    • VM_NAME: il nome della VM.
    • USERNAME: nome utente per l'account da creare sulla VM.
    • PASSWORD: password per l'account dell'utente.

    Questo comando di esempio crea una VM Linux che esegue Ubuntu 20.04. Ti consigliamo di modificare le credenziali iniziali dopo il primo accesso alla VM.

Sistema operativo guest Windows

Per reimpostare la password di un utente esistente o creare la password iniziale di un nuovo utente, segui questi passaggi:

  1. Abilita l'agente guest nella VM Windows:

    1. Configura la VM per abilitare l'agente guest.

    2. Utilizza VNC o RDP per connetterti alla VM.

    3. Nella VM, vai all'unità guest agent. Nella maggior parte dei casi, si tratta di unità E:.

    4. Utilizza PowerShell per eseguire install.ps1.

      L'agente ospite viene installato e avviato. L'agente guest si avvia automaticamente per i riavvii successivi della VM.

    5. Chiudi la sessione remota.

  2. Nella workstation di amministrazione, utilizza il seguente comando per reimpostare (o impostare se utilizzi un nuovo nome utente) la password della VM Windows:

    kubectl virt reset-windows-password VM_NAME \
        --user=USERNAME \
        --namespace=VM_NAMESPACE
    

    Sostituisci quanto segue:

    • VM_NAME: il nome della VM.
    • USERNAME: il nome utente per cui vuoi reimpostare (o impostare) la password. Se il nome utente è nuovo, il comando crea un nuovo account Windows e imposta la password iniziale.
    • VM_NAMESPACE: (Facoltativo) lo spazio dei nomi della VM. Questo flag è facoltativo. Se non specificato, viene utilizzato lo spazio dei nomi predefinito default.

    Per reimpostare (o impostare) la password senza una richiesta di conferma, utilizza il flag facoltativo --force. Quando utilizzi il flag --force, il prompt ti avvisa delle conseguenze della reimpostazione della password per un account esistente. Senza il flag --force, il comando ti chiede di confermare la reimpostazione della password con il seguente testo:

    This command creates an account and sets an initial password for the
    user USERNAME if the account does not already exist.
    If the account already exists, resetting the password can cause the
    LOSS OF ENCRYPTED DATA secured with the current password, including
    files and stored passwords.
    
    Would you like to set or reset the password for USERNAME (Y/n)?
    

    Dopo aver confermato (o forzato) il ripristino della password, il comando restituisce la nuova password per la VM e il nome utente specificati:

    Resetting and retrieving password for USERNAME on VM_NAME
    
    vm_name:    VM_NAME
    username:   USERNAME
    password:   PASSWORD
    

Passaggi successivi