Crear VMs anidadas


La virtualización anidada está habilitada de forma predeterminada, por lo que, a menos que alguien modifique la restricción de la virtualización anidada, no es necesario realizar ningún cambio antes de crear VM anidadas en una organización, carpeta o proyecto. Si el proyecto no pertenece a una organización, la virtualización anidada estará habilitada de forma predeterminada y no podrás cambiarla. Para obtener más información sobre cómo modificar la restricción que determina si puedes crear VMs anidadas, consulta Administra la restricción de virtualización anidada.

En este documento, se describe cómo crear varios tipos de instancias de máquina virtual (VM) de nivel 2 (L2). Antes de crear una VM anidada, debes crear una VM L1 que tenga habilitada la virtualización anidada. Para obtener una descripción de las VMs L1 y L2, consulta la Descripción general de la virtualización anidada.

Después de crear una VM L1 con la virtualización anidada habilitada, puedes hacer lo siguiente:

  • Crear una VM L2 con acceso de red externo
  • Crear una VM L2 con un puente de red privado a la VM L1
  • Crear una VM L2 con acceso de red desde fuera de la VM L1

Antes de empezar

  • Configura la autenticación si aún no lo hiciste. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud. Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine de la siguiente manera.

    Select the tab for how you plan to use the samples on this page:

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporcionas a la CLI de gcloud.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Si deseas obtener más información, consulta Autentica para usar REST en la documentación de autenticación de Google Cloud.

Crear una VM L2 con acceso a red externa

Crear una VM L2 con acceso de red externo mediante el siguiente procedimiento. En este procedimiento, se usa qemu-system-x86_64 para iniciar la VM L2. Si usas otro procedimiento para crear una VM L2 y tienes problemas, reproduce el problema con este procedimiento antes de comunicarte con el servicio de asistencia.

  1. Crea una VM L1 con la virtualización anidada habilitada.

  2. Usa el comando gcloud compute ssh para conectarte a la VM:

    gcloud compute ssh VM_NAME
    

    Reemplaza VM_NAME por el nombre de la instancia a la que deseas conectarte.

  3. Instala el último paquete de qemu-kvm:

    sudo apt update && sudo apt install qemu-kvm -y
    
  4. Descarga una imagen de SO compatible con QEMU para usarla en la VM L2.

  5. Usa el siguiente comando para iniciar la VM L2. Cuando se te solicite, accede con user: root, password: root.

    sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -curses
    

    Reemplaza IMAGE_NAME por el nombre de la imagen de SO compatible con QEMU que se usará para la VM L2.

  6. Prueba que tu VM L2 tenga acceso externo:

    user@nested-vm:~$ host google.com
    

Crea una VM L2 con un puente de red privada a la VM L1

Crea una VM L2 con un puente de red privada a la VM L1 que se creó con anterioridad mediante el siguiente procedimiento. Para obtener más información sobre cómo cambiar la unidad de transmisión máxima (MTU) predeterminada para tu red de VPC, consulta la descripción general de la unidad de transmisión máxima.

  1. Crea una VM L1 con la virtualización anidada habilitada.

  2. Usa el comando gcloud compute ssh para conectarte a la VM:

    gcloud compute ssh VM_NAME
    

    Reemplaza VM_NAME por el nombre de la instancia a la que deseas conectarte.

  3. Instala los paquetes necesarios para crear el puente privado:

    sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  4. Inicia la red predeterminada que viene con el paquete libvirt:

    sudo virsh net-start default
    
  5. Ejecuta el siguiente comando para verificar que tienes el puente virbr0:

    ip addr
    
  6. El resultado es similar a este:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 42:01:0a:80:00:15 brd ff:ff:ff:ff:ff:ff
        inet 10.128.0.21/32 brd 10.128.0.21 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::4001:aff:fe80:15/64 scope link
           valid_lft forever preferred_lft forever
    3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
        link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
        inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
           valid_lft forever preferred_lft forever
    4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
        link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
    
  7. Crea una interfaz tap para pasar de la VM L1 a la VM L2:

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  8. Vincula la interfaz tap al puente privado:

    sudo brctl addif virbr0 tap0
    
  9. Ejecuta el siguiente comando para verificar la configuración de la red de modo puente:

    sudo brctl show
    
  10. El resultado es similar a este:

    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254008ca6a1       yes             tap0
                                                            virbr0-nic
    
  11. Descarga una imagen de SO compatible con QEMU para usarla en la VM L2.

  12. Ejecuta screen y presiona Intro en el mensaje de bienvenida:

    screen
    
  13. Usa el siguiente comando para iniciar la VM L2. Cuando se te solicite, accede con user: root, password: root.

    sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -net nic -net tap,ifname=tap0,script=no -curses
    

    Reemplaza IMAGE_NAME por el nombre de la imagen de SO compatible con QEMU que se usará para la VM L2.

  14. En la VM L2, ejecuta ip addr show para confirmar que la VM tiene una dirección en el espacio virbr0, por ejemplo, 192.168.122.89:

    user@nested-vm:~$ ip addr
    
  15. Inicia un servidor web con marcador de posición en el puerto 8000:

    user@nested-vm:~$ python -m http.server
    
  16. Desconéctate de la sesión screen con Ctrl+A, Ctrl+D.

  17. Prueba que la VM L1 pueda hacer ping a la VM L2 y reemplaza la siguiente dirección IP por la dirección IP de la VM L2:

    curl 192.168.122.89:8000
    
  18. El resultado es similar a este:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    

Cómo crear una VM L2 con acceso de red desde fuera de la VM L1

Puedes configurar una VM L2 con un alias de IP para que las VM fuera de la VM L1 puedan acceder a la VM L2. Usa el siguiente procedimiento para crear una VM L2 con acceso a la red mediante una IP de alias desde fuera de la VM L1 que se creó con anterioridad. Para obtener más información sobre cómo crear alias de direcciones IP, consulta Configura rangos de alias de IP.

En el siguiente procedimiento, se supone que hay una subred creada con anterioridad llamada subnet1. Si ya tienes una subred con un nombre diferente, reemplaza subnet1 por el nombre de tu subred o crea una subred nueva llamada subnet1.

  1. Crea una VM L1 con la virtualización anidada habilitada y, además, incluye un rango de IP de alias y compatibilidad con el tráfico HTTP/HTTPS:

    gcloud

    gcloud compute instances create VM_NAME --enable-nested-virtualization \
        --tags http-server,https-server --can-ip-forward \
        --min-cpu-platform "Intel Haswell" \
        --network-interface subnet=subnet1,aliases=/30
    

    Reemplaza VM_NAME por el nombre para la VM L1.

    REST

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    
    {
      ...
      "name": VM_NAME,
      "tags": {
        "items": [
          http-server,https-server
        ],
      },
      "canIpForward": true,
      "networkInterfaces": [
        {
          "subnetwork": "subnet1",
          "aliasIpRanges": [
            {
              "ipCidrRange": "/30"
            }
          ],
        }
      ],
      "minCpuPlatform": "Intel Haswell",
      "advancedMachineFeatures": {
        "enableNestedVirtualization": true
      },
      ...
    }
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto

    • ZONE: Es la zona en la que se creará la VM.

    • VM_NAME: El nombre de la VM

  2. Usa el comando gcloud compute ssh para conectarte a la VM. Si tienes problemas para conectarte a la VM, intenta restablecer la VM o modificar las reglas del firewall.

    gcloud compute ssh VM_NAME
    

    Reemplaza VM_NAME por el nombre de la instancia a la que deseas conectarte.

  3. Actualiza la VM y, luego, instala los paquetes necesarios:

    sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  4. Inicia la red predeterminada que viene con el paquete libvirt:

    sudo virsh net-start default
    
  5. Ejecuta el siguiente comando para verificar que tienes el puente virbr0:

    user@nested-vm:~$ ip addr
    
  6. Verifica un resultado similar al siguiente:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 42:01:0a:80:00:15 brd ff:ff:ff:ff:ff:ff
        inet 10.128.0.21/32 brd 10.128.0.21 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::4001:aff:fe80:15/64 scope link
           valid_lft forever preferred_lft forever
    3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
        link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
        inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
           valid_lft forever preferred_lft forever
    4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
        link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
    
  7. Crea una interfaz tap para pasar de la VM L1 a la VM L2:

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  8. Vincula la interfaz tap al puente privado:

    sudo brctl addif virbr0 tap0
    
  9. Ejecuta el siguiente comando para verificar la configuración de la red de modo puente:

    sudo brctl show
    
  10. Verifica un resultado similar al siguiente:

    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254008ca6a1       yes             tap0
                                                            virbr0-nic
    
  11. Descarga una imagen de SO compatible con QEMU para usarla en la VM L2.

  12. Ejecuta screen y presiona Intro en el mensaje de bienvenida:

    screen
    
  13. Usa el siguiente comando para iniciar la VM anidada. Cuando se te solicite, accede con user: root, password: root.

    sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -net nic -net tap,ifname=tap0,script=no -curses
    

    Reemplaza IMAGE_NAME por el nombre de la imagen de SO compatible con QEMU que se usará para la VM L2.

  14. En la VM L2, ejecuta ip addr para confirmar que la VM L2 tenga una dirección en el espacio virbr0, como 192.168.122.89:

    user@nested-vm:~$ ip addr
    
  15. Inicia un servidor web con marcador de posición en el puerto 8000:

    user@nested-vm:~$ python -m http.server
    
  16. Desconéctate de la sesión screen con Ctrl+A, Ctrl+D.

  17. Prueba que la VM L1 pueda hacer ping a la VM L2, reemplaza la siguiente dirección IP por la de la VM L2:

    curl 192.168.122.89:8000
    
  18. Verifica que la respuesta de la VM L2 sea similar a la siguiente:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    
  19. En la VM L1, configura iptables para permitir el reenvío de la VM L1 a la VM L2. Para la imagen de SO de L2 que se usa en estas instrucciones, debes limpiar las tablas de IP:

    sudo iptables -F
    
  20. Determina la IP de alias de la VM L1:

    ip route show table local
    
  21. Verifica que el resultado sea similar al siguiente. Para este ejemplo, hay dos direcciones IP asociadas con el dispositivo de ethernet eth0 de la VM L2. La primera, 10.128.0.2, es la dirección IP principal de la VM L2 que muestra sudo ifconfig -a. La segunda, 10.128.0.13, es la dirección IP del alias de la VM L2.

    local 10.128.0.2 dev eth0 proto kernel scope host src 10.128.0.2
    broadcast 10.128.0.2 dev eth0 proto kernel scope link src 10.128.0.2
    local 10.128.0.13/30 dev eth0 proto 66 scope host
    broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
    local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
    local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
    broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
    broadcast 192.168.122.0 dev virbr0 proto kernel scope link src
    192.168.122.1 linkdown
    local 192.168.122.1 dev virbr0 proto kernel scope host src 192.168.122.1
    broadcast 192.168.122.255 dev virbr0 proto kernel scope link src
    192.168.122.1 linkdown
    
  22. Ejecuta los siguientes comandos para reenviar el tráfico de la IP de alias de ejemplo 10.128.0.13 a la IP de ejemplo 192.168.122.89 de la VM L2:

    echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
    sudo iptables -t nat -A PREROUTING -d 10.128.0.13 -j DNAT --to-destination 192.168.122.89
    sudo iptables -t nat -A POSTROUTING -s 192.168.122.89 -j MASQUERADE
    sudo iptables -A INPUT -p udp -j ACCEPT
    sudo iptables -A FORWARD -p tcp -j ACCEPT
    sudo iptables -A OUTPUT -p tcp -j ACCEPT
    sudo iptables -A OUTPUT -p udp -j ACCEPT
    

    Para obtener más información sobre cómo solucionar problemas de iptables, consulta iptables no reenvía tráfico.

  23. Para verificar el acceso a la VM L2 desde fuera de la VM L1, accede a otra VM que esté en la misma red que la VM L1 y realiza una solicitud curl a la IP de alias, reemplaza la dirección IP a continuación por la IP de alias de la VM L2:

    user@another-vm:~$ curl 10.128.0.13:8000
    
  24. Verifica que la respuesta curl sea similar a la siguiente:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
    <title>Directory listing for /</title>
    <body>
    <h2>Directory listing for /</h2>
    <hr>
    <ol>
    <li><a href=".aptitude/">.aptitude/</a>
    <li><a href=".bashrc">.bashrc</a>
    <li><a href=".profile">.profile</a>
    </ol>
    <hr>
    </body>
    </html>
    

¿Qué sigue?