Crear VMs anidadas


La virtualización anidada está permitida de forma predeterminada, por lo que, a menos que alguien modifique la restricción de virtualización anidada, no tendrás que hacer ningún cambio antes de crear máquinas virtuales anidadas en una organización, carpeta o proyecto. Si tu proyecto no pertenece a ninguna organización, la virtualización anidada está permitida de forma predeterminada y no puedes cambiar la restricción. Para obtener información sobre cómo modificar la restricción que determina si puedes crear máquinas virtuales anidadas, consulta Gestionar 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 de nivel 1 que tenga habilitada la virtualización anidada. Para obtener una descripción de las VMs de nivel 1 y nivel 2, consulta la descripción general de la virtualización anidada.

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

  • Crear una VM de nivel 2 con acceso a la red externa
  • Crear una VM de nivel 2 con un puente de red privada a la VM de nivel 1
  • Crear una VM de nivel 2 con acceso a la red desde fuera de la VM de nivel 1

Antes de empezar

  • Si aún no lo has hecho, configura la autenticación. La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

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

    gcloud

    1. Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    2. Set a default region and zone.

    REST

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

      Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    Para obtener más información, consulta el artículo Autenticarse para usar REST de la documentación sobre autenticación de Google Cloud .

Crear una VM de nivel 2 con acceso a la red externa

Crea una VM de nivel 2 con acceso a la red externa siguiendo este procedimiento. En este procedimiento se usa qemu-system-x86_64 para iniciar la VM de nivel 2. Si estás usando otro procedimiento para crear una VM de nivel 2 y tienes problemas, reproduce el problema con este procedimiento antes de ponerte en contacto con el equipo de Asistencia.

  1. Crea una VM de nivel 1 que tenga habilitada la virtualización anidada.

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

    gcloud compute ssh VM_NAME
    

    Sustituye VM_NAME por el nombre de la VM a la que quieras conectarte.

  3. Instala el paquete qemu-kvm más reciente:

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

  5. Usa el siguiente comando para iniciar la VM de nivel 2. Cuando se te solicite, inicia sesión con user: root, password: root.

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

    Sustituye IMAGE_NAME por el nombre de la imagen del SO compatible con QEMU que quieras usar en la VM de nivel 2.

  6. Prueba que tu VM de nivel 2 tenga acceso externo:

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

Crear una VM de nivel 2 con un puente de red privada a la VM de nivel 1

Crea una VM de nivel 2 con un puente de red privada a la VM de nivel 1 que has creado anteriormente siguiendo este procedimiento. Para obtener información sobre cómo cambiar la unidad de transmisión máxima (MTU) predeterminada de tu red de VPC, consulta la descripción general de la unidad de transmisión máxima.

  1. Crea una VM de nivel 1 que tenga habilitada la virtualización anidada.

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

    gcloud compute ssh VM_NAME
    

    Sustituye VM_NAME por el nombre de la VM a la que quieras 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 comprobar que tienes el puente virbr0:

    ip addr
    
  6. El resultado debería ser 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 ir de la VM de nivel 1 a la VM de nivel 2:

    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 puente:

    sudo brctl show
    
  10. El resultado debería ser similar al siguiente:

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

  12. Ejecuta screen y pulsa Intro en la petición de bienvenida:

    screen
    
  13. Usa el siguiente comando para iniciar la VM de nivel 2. Cuando se te solicite, inicia sesión 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
    

    Sustituye IMAGE_NAME por el nombre de la imagen del SO compatible con QEMU que quieras usar en la VM de nivel 2.

  14. En la VM de nivel 2, 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 de marcador de posición en el puerto 8000:

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

  17. Comprueba que tu VM de nivel 1 puede hacer ping a la VM de nivel 2. Para ello, sustituye la siguiente dirección IP por la dirección IP de la VM de nivel 2:

    curl 192.168.122.89:8000
    
  18. El resultado debería ser similar al 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>
    

Crear una VM de nivel 2 con acceso a la red desde fuera de la VM de nivel 1

Puedes configurar una VM de nivel 2 con una IP de alias para que las VMs que no estén en la VM de nivel 1 puedan acceder a la VM de nivel 2. Sigue este procedimiento para crear una VM de nivel 2 con acceso a la red mediante una IP de alias desde fuera de la VM de nivel 1 que has creado anteriormente. Para obtener información sobre cómo crear direcciones IP de alias, consulta Configurar intervalos de IP de alias.

En el siguiente procedimiento se da por supuesta una subred creada anteriormente llamada subnet1. Si ya tienes una subred con otro nombre, sustituye subnet1 por el nombre de tu subred o crea una subred con el nombre subnet1.

  1. Crea una VM de nivel 1 con la virtualización anidada habilitada e incluye un intervalo de IPs 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
    

    Sustituye VM_NAME por el nombre de la VM de nivel 1.

    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
      },
      ...
    }
    

    Haz los cambios siguientes:

    • PROJECT_ID: el ID del proyecto

    • ZONE: 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 máquina virtual, prueba a restablecerla o a modificar las reglas del cortafuegos.

    gcloud compute ssh VM_NAME
    

    Sustituye VM_NAME por el nombre de la VM a la que quieras conectarte.

  3. Actualiza la VM e 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 comprobar que tienes el puente virbr0:

    user@nested-vm:~$ ip addr
    
  6. Verifica que el resultado sea 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 ir de la VM de nivel 1 a la VM de nivel 2:

    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 puente:

    sudo brctl show
    
  10. Verifica que el resultado sea similar al siguiente:

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

  12. Ejecuta screen y pulsa Intro en la petición de bienvenida:

    screen
    
  13. Usa el siguiente comando para iniciar la VM anidada. Cuando se te solicite, inicia sesión 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
    

    Sustituye IMAGE_NAME por el nombre de la imagen del SO compatible con QEMU que quieras usar en la VM de nivel 2.

  14. En la VM de nivel 2, ejecuta ip addr para confirmar que la VM de nivel 2 tiene una dirección en el espacio virbr0, como 192.168.122.89:

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

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

  17. Prueba que tu VM de nivel 1 puede hacer ping a la VM de nivel 2. Para ello, sustituye la dirección IP que aparece a continuación por la dirección IP de la VM de nivel 2:

    curl 192.168.122.89:8000
    
  18. Verifica que la respuesta de la VM de nivel 2 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 de nivel 1, configura iptables para permitir la redirección de la VM de nivel 1 a la VM de nivel 2. En el caso de la imagen del SO de nivel 2 que se usa en estas instrucciones, debes vaciar las tablas de IP:

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

    ip route show table local
    
  21. Comprueba que el resultado sea similar al siguiente. En este ejemplo, hay dos direcciones IP asociadas al dispositivo Ethernet eth0 de la VM de nivel 2. La primera, 10.128.0.2, es la dirección IP principal de la VM de nivel 2, que devuelve sudo ifconfig -a. La segunda, 10.128.0.13, es la dirección IP de alias de la VM de nivel 2.

    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 máquina virtual de nivel 2:

    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 información sobre cómo solucionar problemas con iptables, consulta iptables no reenvía tráfico.

  23. Verifica el acceso a la VM de nivel 2 desde fuera de la VM de nivel 1. Para ello, inicia sesión en otra VM que esté en la misma red que la VM de nivel 1 y haz una solicitud curl a la IP de alias. Sustituye la dirección IP que aparece a continuación por la IP de alias de la VM de nivel 2:

    user@another-vm:~$ curl 10.128.0.13:8000
    
  24. Comprueba que la respuesta de 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>
    

Siguientes pasos