Conectarse a máquinas virtuales que usan el entorno de ejecución de máquinas virtuales en GDC

Este documento está dirigido a los propietarios de aplicaciones que ejecutan Google Distributed Cloud. En este documento se explica cómo conectarse a máquinas virtuales que usan el entorno de ejecución de máquinas virtuales en GDC. Puedes conectarte a las VMs directamente mediante una dirección IP o con herramientas integradas para acceder a SSH o a la consola.

Antes de empezar

Para completar este documento, necesitas tener acceso a los siguientes recursos:

Configurar el acceso SSH sin contraseña a máquinas virtuales

El acceso SSH directo y sin contraseña a tu máquina virtual se facilita mediante un agente invitado que instala el tiempo de ejecución de la máquina virtual en GDC. Entre otras tareas, el agente invitado instala y caduca las claves SSH. Esta función permite crear un túnel SSH para acceder a tu VM desde clientes que no estén en la red del clúster.

Habilitar el agente invitado

Para habilitar el agente invitado, sigue estos pasos:

  1. Comprueba tu recurso personalizado de VirtualMachine para confirmar que está configurado para habilitar el agente invitado:

    kubectl get gvm VM_NAME -o yaml --kubeconfig KUBECONFIG
    

    El campo spec.osType debe configurarse con el sistema operativo de tu máquina virtual, Linux o Windows. La sección spec.guestEnvironment no debe configurarse explícitamente como vacía. Si la sección está configurada como vacía (guestEnvironment: {}), puedes quitarla por completo para habilitar el agente invitado.

    Tu recurso personalizado VirtualMachine de la VM a la que quieras acceder debería tener este aspecto:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: sample-vm
    spec:
      compute:
        cpu:
          vcpus: 2
        memory:
          capacity: 4Gi
    ...
      osType: Linux
    ...
    
  2. Si es necesario, usa kubectl edit para actualizar el recurso personalizado VirtualMachine.

  3. Para verificar que el agente invitado funciona, compruebe el status en su recurso personalizado de VM:

    kubectl get gvm VM_NAME --kubeconfig KUBECONFIG
    

    Cuando el agente invitado está funcionando, verás status: "True" para las condiciones GuestEnvironmentEnabled y 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
      ...
    

Habilitar el acceso SSH sin contraseña

Para habilitar el acceso SSH sin contraseña a tu VM, sigue estos pasos:

  1. Crea un archivo de manifiesto VirtualMachineAccessRequest, como vm-access-request.yaml, en el editor que prefieras:

    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
    

    Haz los cambios siguientes:

    • VMAR_NAME: nombre del recurso access request.
    • VM_NAMESPACE: el espacio de nombres de la máquina virtual a la que quieras acceder.
    • VM_NAME: el nombre de la VM a la que quieres acceder.
    • USERNAME: nombre de usuario del usuario que accede a la VM.
    • PUBLIC_SSH_KEY: la clave pública para el acceso SSH. Normalmente, se trata del contenido del archivo id_rsa.pub.
    • EXPIRATION_TIME: el campo ttl (tiempo de vida) especifica cuánto tiempo es válida la clave SSH.

      Por ejemplo, si especifica 30m, la clave SSH caducará al cabo de 30 minutos.

      Esta marca usa las siguientes unidades:

      • s segundos
      • m durante minutos
      • h durante horas
      • d durante días
  2. Usa kubectl apply para crear el VirtualMachineAccessRequest a partir del archivo de manifiesto. Por ejemplo, si ha llamado al archivo de manifiesto vm-access-request.yaml,

    kubectl apply -f MANIFEST --kubeconfig KUBECONFIG
    

    Haz los cambios siguientes:

    • MANIFEST: el nombre del archivo de manifiesto de la solicitud de acceso. Por ejemplo, vm-access-request.yaml.
    • KUBECONFIG: la ruta al archivo kubeconfig del clúster que aloja la VM a la que estás accediendo.
  3. Para verificar que la configuración de la solicitud de acceso se ha realizado correctamente, comprueba el estado de la VirtualMachineAccessRequest:

    kubectl get vmar VMAR_NAME -o yaml --kubeconfig KUBECONFIG
    

    Si la configuración se realiza correctamente, la sección status incluye lo siguiente: 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
    

Inhabilitar el agente invitado

Cuando creas una máquina virtual y defines el campo osType, el agente invitado se habilita. Mientras esta función esté en versión preliminar, puedes inhabilitarla editando el recurso personalizado VirtualMachine. Si inhabilitas el agente invitado, se inhabilitará el acceso SSH sin contraseña a tu VM.

Para inhabilitar el agente invitado, sigue estos pasos:

  1. Usa kubectl para detener tu VM antes de hacer cambios en la configuración:

    kubectl virt stop VM_NAME --kubeconfig KUBECONFIG
    
  1. Edita el recurso de la VM:

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  2. Actualice la configuración de VirtualMachine para añadir un spec.guestEnvironment vacío de forma explícita:

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachine
    metadata:
      name: vm-example
      namespace: default
    spec:
      compute:
      ...
      osType: Linux
      guestEnvironment: {}
    
  3. Guarda y cierra el manifiesto de la VM actualizado en tu editor.

  4. Usa kubectl para iniciar la VM:

    kubectl virt start VM_NAME --kubeconfig KUBECONFIG
    

Conectarse mediante una dirección IP

Si tu VM tiene una dirección IP accesible y ya tienes las credenciales para acceder a ella, puedes conectarte mediante un protocolo como SSH, VNC o RDP.

Conectarse a través de una dirección IP

Si puedes conectarte directamente a la dirección IP de tu VM, utiliza uno de los siguientes métodos:

SSH

  1. Obtén los detalles de tu VM para ver su dirección IP:

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

    Sustituye los siguientes valores:

    • VM_NAME: nombre de la VM.
    • VM_NAMESPACE: el espacio de nombres de tu VM.

    En el siguiente ejemplo de salida se muestra la información de la VM y la dirección IP:

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. Conéctate a tu VM mediante un cliente SSH:

    ssh USERNAME@IP_ADDRESS -i PATH_TO_KEY
    

    Sustituye los siguientes valores:

    • USERNAME: el nombre de usuario de una cuenta de tu máquina virtual.
    • IP_ADDRESS: la dirección IP de tu VM obtenida en el paso anterior.
    • PATH_TO_KEY: la ruta a la clave SSH privada.

VNC o RDP

Virtual Network Computing (VNC) y Remote Desktop Protocol (RDP) te permiten usar la consola gráfica para acceder a tu VM. Cuando usas una dirección IP, debes habilitar VNC o RDP en el SO invitado para poder usar cualquiera de los dos y conectarte a la VM. Para obtener información sobre cómo habilitar y usar VNC o RDP, consulta la documentación de tu SO invitado.

También necesitas credenciales para iniciar sesión en la VM, como las que definas para crear las credenciales de usuario iniciales al crear una VM.

  1. Obtén los detalles de tu VM para ver su dirección IP:

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

    Sustituye los siguientes valores:

    • VM_NAME: nombre de la VM.
    • VM_NAMESPACE: el espacio de nombres de tu VM.

    En el siguiente ejemplo de salida se muestra la información de la VM y la dirección IP:

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. Conéctate a la dirección IP de tu VM obtenida en el paso anterior mediante una herramienta de cliente y el puerto adecuado, como el puerto VNC 5900 o el puerto RDP 3389.

Conectar con un servicio

Si tu máquina virtual se conecta a pod-network predeterminado y no puedes comunicarte directamente con la dirección IP de tu máquina virtual, expón la máquina virtual detrás de un balanceador de carga Service.

  1. Crea un archivo de manifiesto Service, como my-service-load-balancer.yaml, en el editor que prefieras:

    nano my-service-load-balancer.yaml
    
  2. Copia y pega el siguiente manifiesto 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
    

    En este tipo de manifiesto Service, sustituye los siguientes valores:

    • VM_NAME: el nombre de tu VM que se expondrá para el acceso remoto.
    • PORT_NAME: el nombre de tu protocolo, como ssh, vnc o rdp.
    • PROTOCOL_TYPE: el tipo de protocolo, como TCP para SSH y RDP, o UDP para VNC.
    • EXTERNAL_PORT: número de puerto externo que se va a exponer y que se usa para conectarse.
    • TARGET_PORT: el puerto de destino, como 22 para SSH.
  3. Guarda y cierra el manifiesto de Service en tu editor.

  4. Crea el Service con kubectl:

    kubectl apply -f my-service-load-balancer.yaml  --kubeconfig KUBECONFIG
    
  5. Obtén la dirección EXTERNAL-IP del servicio del balanceador de carga:

    kubectl get service VM_NAME-service --kubeconfig KUBECONFIG
    

    Se muestra la dirección IP del balanceador de carga, tal como se muestra en el siguiente ejemplo de salida:

    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. Conéctate a la dirección EXTERNAL-IP del balanceador de carga con un protocolo estándar, como un cliente SSH:

    ssh USERNAME@LOAD_BALANCER_IP_ADDRESS  -i PATH_TO_KEY
    

    Sustituye los siguientes valores:

    • USERNAME: el nombre de usuario de una cuenta de tu máquina virtual.
    • LOAD_BALANCER_IP_ADDRESS: la dirección IP de tu balanceador de carga.
    • PATH_TO_KEY: la ruta a la clave SSH privada.

Conectarse directamente mediante SSH

Si tu cliente está conectado a la misma red física que los nodos de tu clúster de hardware desnudo y no necesitas usar túneles SSH para conectarte al clúster, puedes conectarte mediante kubectl virt ssh.

  1. Para usar SSH y conectar una máquina virtual Linux desde la consola con el complemento virtctl, sigue estos pasos:

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

    Sustituye los siguientes valores:

    • USERNAME: el nombre de usuario para acceder a tu VM. Esta cuenta se crea si no existe en la VM.
    • VM_NAME: el nombre de tu VM.
  2. Una vez que te hayas conectado correctamente a la VM mediante SSH y ya no necesites la conexión, cierra la sesión SSH:

    exit
    

Conectarse directamente mediante la consola

Si no tienes conectividad de red directa con tu máquina virtual Linux para acceder mediante SSH, conéctate a la consola de la máquina virtual mediante el tiempo de ejecución de la máquina virtual en la consola de GDC. Este método abre una consola serie. Cuando se establece la conexión, se te proporciona un símbolo del sistema en lugar de una consola gráfica.

  1. Para acceder a una VM de Linux desde la consola, usa el complemento virtctl:

    kubectl virt console VM_NAME --kubeconfig KUBECONFIG
    

    Sustituye VM_NAME por el nombre de tu VM.

    Cuando se te pida, introduce las credenciales de usuario de tu VM. Estas credenciales deben existir en la VM o aplicarse cuando se cree la VM. Si es necesario, consulta la sección siguiente para crear las credenciales de usuario iniciales al crear una VM.

  2. Cuando te hayas conectado correctamente a la consola de la VM y ya no necesites la conexión, sal de la sesión de la VM y de la consola:

    Ctrl + ]
    

Conectarse directamente mediante VNC

Puedes usar el comando kubectl virt vnc para abrir la consola gráfica de Virtual Network Computing (VNC) y acceder a tus VMs. Este método funciona en máquinas virtuales que ejecutan un SO invitado Windows o Linux. Cuando usas el comando kubectl virt vnc, VM Runtime en GDC abre VNC por ti, por lo que no es necesario que habilites VNC en el SO invitado.

Necesitas credenciales para iniciar sesión en la VM, como las que definas para crear credenciales de usuario iniciales al crear una VM.

  1. Para acceder a una VM mediante VNC, usa el complemento virtctl:

    kubectl virt vnc VM_NAME --kubeconfig KUBECONFIG
    

    Sustituye VM_NAME por el nombre de tu VM.

    Cuando se te pida, introduce las credenciales de usuario de tu VM.

  2. Una vez que te hayas conectado correctamente a la sesión VNC de la VM y ya no necesites la conexión, cierra la sesión de la VM para cerrar la conexión VNC.

Crear credenciales de usuario iniciales

Cuando te conectas a tu VM mediante la consola, debes especificar las credenciales del usuario. El proceso para crear las credenciales de usuario iniciales es diferente en los sistemas operativos invitados Linux y Windows.

Sistema operativo invitado Linux

En el caso de las VMs Linux, las credenciales de usuario se pueden incluir en las imágenes personalizadas o se pueden especificar al crear una VM.

  • Usa el parámetro --configure-initial-password con el comando kubectl virt create:

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

    Sustituye los siguientes valores:

    • VM_NAME: nombre de la VM.
    • USERNAME: nombre de usuario de la cuenta que se va a crear en la VM.
    • PASSWORD: contraseña de la cuenta de usuario.

    Este comando de ejemplo crea una VM Linux que ejecuta Ubuntu 20.04. Te recomendamos que cambies las credenciales iniciales después de iniciar sesión por primera vez en la VM.

Sistema operativo invitado Windows

Sigue estos pasos para restablecer la contraseña de un usuario o crear la contraseña inicial de un nuevo usuario:

  1. Habilita el agente invitado en tu VM Windows:

    1. Configura la VM para habilitar el agente invitado.

    2. Usa VNC o RDP para conectarte a la VM.

    3. En la VM, ve a la unidad guest agent. En la mayoría de los casos, se trata de drive E:.

    4. Usa PowerShell para ejecutar install.ps1.

      De esta forma, se instala y se inicia el agente invitado. El agente invitado se inicia automáticamente en los reinicios posteriores de la VM.

    5. Cierra la sesión remota.

  2. En tu estación de trabajo de administrador, usa el siguiente comando para restablecer (o definir, si usas un nuevo nombre de usuario) la contraseña de la VM de Windows:

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

    Haz los cambios siguientes:

    • VM_NAME: el nombre de la VM.
    • USERNAME: el nombre de usuario cuya contraseña quieras restablecer o definir. Si el nombre de usuario es nuevo, el comando crea una cuenta de Windows y define la contraseña inicial.
    • VM_NAMESPACE: (Opcional) el espacio de nombres de la VM. Esta marca es opcional. Si no se especifica, se usa el espacio de nombres predeterminado, default.

    Para restablecer (o definir) una contraseña sin que se te pida confirmación, usa la marca opcional --force. Cuando usas la marca --force, la petición te avisa de las consecuencias de restablecer la contraseña de una cuenta. Sin la marca --force, el comando te pedirá que confirmes el cambio de contraseña con el siguiente texto:

    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)?
    

    Después de confirmar (o forzar) el cambio de contraseña, el comando devuelve la nueva contraseña de la máquina virtual y el nombre de usuario especificados:

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

Siguientes pasos