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
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
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.Instala el último paquete de
qemu-kvm
:sudo apt update && sudo apt install qemu-kvm -y
Descarga una imagen de SO compatible con QEMU para usarla en la VM L2.
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.Prueba que tu VM L2 tenga acceso externo:
user@nested-vm:~$ host google.com
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.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
Inicia la red predeterminada que viene con el paquete
libvirt
:sudo virsh net-start default
Ejecuta el siguiente comando para verificar que tienes el puente
virbr0
:ip addr
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
Crea una interfaz
tap
para pasar de la VM L1 a la VM L2:sudo tunctl -t tap0 sudo ifconfig tap0 up
Vincula la interfaz
tap
al puente privado:sudo brctl addif virbr0 tap0
Ejecuta el siguiente comando para verificar la configuración de la red de modo puente:
sudo brctl show
El resultado es similar a este:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nic
Descarga una imagen de SO compatible con QEMU para usarla en la VM L2.
Ejecuta
screen
y presiona Intro en el mensaje de bienvenida:screen
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.En la VM L2, ejecuta
ip addr show
para confirmar que la VM tiene una dirección en el espaciovirbr0
, por ejemplo,192.168.122.89
:user@nested-vm:~$ ip addr
Inicia un servidor web con marcador de posición en el puerto
8000
:user@nested-vm:~$ python -m http.server
Desconéctate de la sesión
screen
conCtrl+A
,Ctrl+D
.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
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>
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 proyectoZONE
: Es la zona en la que se creará la VM.VM_NAME
: El nombre de la VM
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.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
Inicia la red predeterminada que viene con el paquete
libvirt
:sudo virsh net-start default
Ejecuta el siguiente comando para verificar que tienes el puente
virbr0
:user@nested-vm:~$ ip addr
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
Crea una interfaz
tap
para pasar de la VM L1 a la VM L2:sudo tunctl -t tap0 sudo ifconfig tap0 up
Vincula la interfaz
tap
al puente privado:sudo brctl addif virbr0 tap0
Ejecuta el siguiente comando para verificar la configuración de la red de modo puente:
sudo brctl show
Verifica un resultado similar al siguiente:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nic
Descarga una imagen de SO compatible con QEMU para usarla en la VM L2.
Ejecuta
screen
y presiona Intro en el mensaje de bienvenida:screen
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.En la VM L2, ejecuta
ip addr
para confirmar que la VM L2 tenga una dirección en el espacio virbr0, como192.168.122.89
:user@nested-vm:~$ ip addr
Inicia un servidor web con marcador de posición en el puerto
8000
:user@nested-vm:~$ python -m http.server
Desconéctate de la sesión
screen
conCtrl+A
,Ctrl+D
.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
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>
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
Determina la IP de alias de la VM L1:
ip route show table local
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 muestrasudo 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
Ejecuta los siguientes comandos para reenviar el tráfico de la IP de alias de ejemplo
10.128.0.13
a la IP de ejemplo192.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
, consultaiptables
no reenvía tráfico.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
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>
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.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.
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, reemplazasubnet1
por el nombre de tu subred o crea una subred nueva llamadasubnet1
.¿Qué sigue?
Salvo que se indique lo contrario, el contenido de esta página está sujeto a la licencia Atribución 4.0 de Creative Commons, y los ejemplos de código están sujetos a la licencia Apache 2.0. Para obtener más información, consulta las políticas del sitio de Google Developers. Java es una marca registrada de Oracle o sus afiliados.
Última actualización: 2024-11-21 (UTC)
-