Conéctate a las VMs que usan el entorno de ejecución de VM en GDC

Este documento está dirigido a propietarios de aplicaciones que ejecutan GKE en Bare Metal. En este documento, se muestra cómo conectarse a las máquinas virtuales (VM) que usan el entorno de ejecución de VM en GDC. Puedes conectarte directamente a las VM mediante una dirección IP o herramientas integradas para acceder a SSH o a la consola.

Antes de comenzar

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

Configurar el acceso SSH sin contraseña a las VMs

El acceso SSH directo y sin contraseña a la VM se proporciona mediante un agente invitado que instala el entorno de ejecución de VM en GDC. Entre otras tareas, el agente invitado instala y vence las claves SSH. Esta función habilita un túnel SSH para acceder a tu VM desde clientes fuera de la red del clúster.

Habilita el agente invitado

Para habilitar el agente invitado, haz lo siguiente:

  1. Verifica tu recurso personalizado VirtualMachine a fin de confirmar que esté configurado para habilitar el agente invitado:

    kubectl get gvm VM_NAME -o yaml --kubeconfig KUBECONFIG
    

    El campo spec.osType debe configurarse como el sistema operativo de la VM, 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.

    El recurso personalizado VirtualMachine de la VM a la que deseas acceder debería verse de la siguiente manera:

    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 funcione, consulta status en tu recurso personalizado de VM:

    kubectl get gvm VM_NAME --kubeconfig KUBECONFIG
    

    Cuando el agente invitado esté trabajando, 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 en 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
    

    Reemplaza lo siguiente:

    • VMAR_NAME: Es el nombre del recurso de solicitud de acceso.
    • VM_NAMESPACE: Es el espacio de nombres de la VM a la que deseas acceder.
    • VM_NAME: Es el nombre de la VM a la que deseas acceder.
    • USERNAME: Es el nombre de usuario del usuario que accede a la VM.
    • PUBLIC_SSH_KEY: Es la clave pública para el acceso SSH. Por lo general, este es el contenido del archivo id_rsa.pub.
    • EXPIRATION_TIME: El campo ttl (tiempo de actividad) especifica el tiempo de validez de la Llave SSH.

      Por ejemplo, si especificas 30m, la clave SSH vence después de 30 minutos.

      En esta marca, se usan las siguientes unidades:

      • s para los segundos
      • m para los minutos
      • h para las horas
      • d para los días
  2. Usa kubectl apply para crear el VirtualMachineAccessRequest a partir del archivo de manifiesto. Por ejemplo, si le asignaste el nombre vm-access-request.yaml a tu archivo de manifiesto,

    kubectl apply -f MANIFEST --kubeconfig KUBECONFIG
    

    Reemplaza lo siguiente:

    • MANIFEST: Es el nombre del archivo de manifiesto de la solicitud de acceso. Por ejemplo, vm-access-request.yaml
    • KUBECONFIG: Es la ruta de acceso al archivo kubeconfig del clúster que aloja la VM a la que accedes.
  3. Para verificar que la configuración de tu solicitud de acceso se haya realizado de forma correcta, verifica el estado de VirtualMachineAccessRequest:

    kubectl get vmar VMAR_NAME -o yaml --kubeconfig KUBECONFIG
    

    Cuando la configuración se completa de forma correcta, la sección status incluye 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
    

Inhabilita el agente invitado

Cuando creas una VM nueva y configuras el campo osType, el agente invitado se habilita. Mientras esta función se encuentra en versión preliminar, puedes inhabilitarla si editas el recurso personalizado VirtualMachine. Si inhabilitas el agente invitado, se inhabilita el acceso SSH sin contraseña a tu VM.

Para inhabilitar el agente invitado, haz lo siguiente:

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

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

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  2. Actualiza la configuración de VirtualMachine para agregar un spec.guestEnvironment vacío de manera 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 VM actualizado en el editor.

  4. Usa kubectl para iniciar la VM:

    kubectl virt start VM_NAME --kubeconfig KUBECONFIG
    

Conéctate con una dirección IP

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

Conéctate a través de la dirección IP

Si puedes conectarte directamente a la dirección IP de tu VM, usa 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
    

    Reemplaza los siguientes valores:

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

    En el siguiente resultado de ejemplo, 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 VM con un cliente SSH:

    ssh USERNAME@IP_ADDRESS -i PATH_TO_KEY
    

    Reemplaza los siguientes valores:

    • USERNAME: Es el nombre de usuario de una cuenta en tu VM.
    • IP_ADDRESS: La dirección IP de la VM que obtuviste en el paso anterior
    • PATH_TO_KEY: Es la ruta de acceso a la clave SSH privada.

VNC o RDP

El procesamiento de red virtual (VNC) y el protocolo de escritorio remoto (RDP) te permiten usar la consola gráfica para acceder a la VM. Cuando usas una dirección IP, debes habilitar VNC o RDP en el SO invitado antes de poder usar cualquiera de ellos para 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 existentes para acceder a la VM, como las que defines para crear credenciales de usuario iniciales cuando creas 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
    

    Reemplaza los siguientes valores:

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

    En el siguiente resultado de ejemplo, 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 con una herramienta cliente y el puerto adecuado, como el puerto VNC 5900 o el puerto RDP 3389.

Conéctate a través de un objeto Service

Si tu VM se conecta a pod-network predeterminada y no puedes comunicarte directamente con la dirección IP de tu VM, expón la VM detrás de un balanceador de cargas Service.

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

    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, reemplaza los siguientes valores:

    • VM_NAME: el nombre de tu VM que se va a exponer 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: el número de puerto externo que se va a exponer y que usas para conectarte.
    • TARGET_PORT: el puerto de destino, como 22 para SSH.
  3. Guarda y cierra el manifiesto Service en tu editor.

  4. Crea Service mediante kubectl:

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

    kubectl get service VM_NAME-service --kubeconfig KUBECONFIG
    

    Se muestra la dirección IP del balanceador de cargas, como se muestra en el siguiente resultado de ejemplo:

    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 cargas con un protocolo estándar, como el uso de un cliente SSH:

    ssh USERNAME@LOAD_BALANCER_IP_ADDRESS  -i PATH_TO_KEY
    

    Reemplaza los siguientes valores:

    • USERNAME: el nombre de usuario de una cuenta en tu VM.
    • LOAD_BALANCER_IP_ADDRESS: la dirección IP de tu balanceador de cargas.
    • PATH_TO_KEY: Es la ruta de acceso a la clave SSH privada.

Conéctate directamente con SSH

Si tu cliente está conectado a la misma red física que tu clúster de Anthos alojado en nodos de equipos físicos y no necesitas el uso de túneles SSH para conectarte al clúster, puedes conectarte mediante kubectl virt ssh.

  1. Si quieres usar SSH para conectar una VM de Linux desde la consola con el complemento virtctl, sigue estos pasos:

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

    Reemplaza 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. Después de conectarte de forma correcta con SSH a la VM y de que ya no necesites la conexión, sal de la sesión de SSH:

    exit
    

Conéctate directamente con la consola

Si no tienes conectividad de red directa a tu VM de Linux para el acceso SSH, conéctate a la consola de la VM mediante el entorno de ejecución de la VM en la consola de GDC. Este método abre una consola en serie. Luego de 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
    

    Reemplaza VM_NAME por el nombre de tu VM.

    Cuando se te solicite, ingresa las credenciales de usuario para la VM. Estas credenciales deben existir en la VM o aplicarse cuando se crea la VM. Si es necesario, consulta la siguiente sección para crear credenciales de usuario iniciales cuando crees una VM.

  2. Después de conectarte de forma correcta a la consola de la VM y de que ya no necesites la conexión, sal de la sesión de VM y de la consola:

    Ctrl + ]
    

Conéctate directamente con VNC

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

Necesitas credenciales existentes para acceder a la VM, como las que defines para crear credenciales de usuario iniciales cuando creas una VM.

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

    kubectl virt vnc VM_NAME --kubeconfig KUBECONFIG
    

    Reemplaza VM_NAME por el nombre de tu VM.

    Cuando se te solicite, ingresa las credenciales de usuario para la VM.

  2. Después de conectarte de forma correcta a la sesión de VNC de la VM y de que ya no necesites la conexión, sal de la VM para cerrar la conexión.

Crea credenciales de usuario iniciales

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

SO invitado de Linux

Para las VM de Linux, las credenciales de usuario pueden integrarse en tus imágenes personalizadas o se pueden especificar cuando creas 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
    

    Reemplaza los siguientes valores:

    • VM_NAME: el nombre de tu VM.
    • USERNAME: Es el nombre de usuario de la cuenta que se creará en la VM.
    • PASSWORD: Es la contraseña de la cuenta de usuario.

    Este comando de ejemplo crea una VM de Linux que ejecuta Ubuntu 20.04. Se recomienda que cambies las credenciales iniciales después de acceder a la VM por primera vez.

SO invitado de Windows

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

  1. Habilita el agente invitado en tu VM de Windows:

    1. Configura la VM para habilitar el agente invitado.

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

    3. En la VM, navega a la unidad guest agent. En la mayoría de los casos, es la unidad E:.

    4. Usa PowerShell para ejecutar install.ps1.

      Con esta acción, se instalará y, luego, se iniciará el agente invitado. El agente invitado se inicia de forma automática en los reinicios posteriores de VM.

    5. Cierra la sesión remota.

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

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

    Reemplaza lo siguiente:

    • VM_NAME: el nombre de la VM.
    • USERNAME: Es el nombre de usuario para el que deseas restablecer (o establecer) la contraseña. Si el nombre de usuario es nuevo, el comando crea una cuenta de Windows nueva y establece la contraseña inicial.
    • VM_NAMESPACE: Es el espacio de nombres de la VM (opcional). Esta marca es opcional. Si no se especifica, se usa el espacio de nombres predeterminado, default.

    Para restablecer (o establecer) la contraseña sin un mensaje de confirmación, usa la marca opcional --force. Cuando usas la marca --force, el mensaje te advierte sobre las consecuencias de restablecer la contraseña para una cuenta existente. Sin la marca --force, el comando te solicita que confirmes el restablecimiento de la 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 restablecimiento de la contraseña, el comando muestra la contraseña nueva para la VM y el nombre de usuario especificados:

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

¿Qué sigue?