A virtualização aninhada é permitida por padrão, portanto, a menos que alguém modifique a restrição para virtualização aninhada, você não precisa fazer nenhuma alteração antes de criar VMs aninhadas em uma organização, pasta ou projeto. Se o seu projeto não pertencer a uma organização, a virtualização aninhada será permitida por padrão e você não poderá alterar a restrição. Para obter informações sobre como modificar a restrição que determina se você pode criar VMs aninhadas, consulte Gerenciar a restrição de virtualização aninhada .
Este documento descreve como criar vários tipos de instâncias de máquina virtual (VM) de nível 2 (L2). Antes de criar uma VM aninhada, você deve criar uma VM L1 que tenha a virtualização aninhada habilitada . Para obter uma descrição das VMs L1 e L2, consulte Visão geral da virtualização aninhada .
Depois de criar uma VM L1 com virtualização aninhada habilitada, você pode fazer o seguinte:
- Crie uma VM L2 com acesso à rede externa
- Crie uma VM L2 com uma ponte de rede privada para a VM L1
- Crie uma VM L2 com acesso à rede de fora da VM L1
Antes de começar
- Se ainda não o fez, configure a autenticação. Autenticação é o processo pelo qual sua identidade é verificada para acesso a Google Cloud serviços e APIs. Para executar códigos ou amostras em um ambiente de desenvolvimento local, você pode se autenticar no Compute Engine selecionando uma das seguintes opções:
Select the tab for how you plan to use the samples on this page:
gcloud
-
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
- Set a default region and zone.
Use o comando
gcloud compute ssh
para se conectar à VM:gcloud compute ssh VM_NAME
Substitua
VM_NAME
pelo nome da VM à qual se conectar.Instale o pacote
qemu-kvm
mais recente:sudo apt update && sudo apt install qemu-kvm -y
Baixe uma imagem de sistema operacional compatível com QEMU para usar na VM L2.
Use o seguinte comando para iniciar a VM L2. Quando solicitado, faça login com
user: root
,password: root
.sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -curses
Substitua
IMAGE_NAME
pelo nome da imagem do sistema operacional compatível com QEMU a ser usada para a VM L2.Teste se sua VM L2 tem acesso externo:
user@nested-vm:~$ host google.com
Use o comando
gcloud compute ssh
para se conectar à VM:gcloud compute ssh VM_NAME
Substitua
VM_NAME
pelo nome da VM à qual se conectar.Instale os pacotes necessários para criar a ponte privada:
sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
Inicie a rede padrão que vem com o pacote
libvirt
:sudo virsh net-start default
Execute o seguinte comando para verificar se você possui a ponte
virbr0
:ip addr
A saída é semelhante à seguinte:
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
Crie uma interface
tap
para ir da VM L1 para a VM L2:sudo tunctl -t tap0 sudo ifconfig tap0 up
Vincule a interface
tap
à ponte privada:sudo brctl addif virbr0 tap0
Execute o seguinte comando para verificar a configuração da rede bridge:
sudo brctl show
A saída é semelhante à seguinte:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nic
Baixe uma imagem de sistema operacional compatível com QEMU para usar na VM L2.
Execute
screen
e pressione Enter no prompt de boas-vindas:screen
Use o seguinte comando para iniciar a VM L2. Quando solicitado, faça login com
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
Substitua
IMAGE_NAME
pelo nome da imagem do sistema operacional compatível com QEMU a ser usada para a VM L2.Na VM L2, execute
ip addr show
para confirmar se a VM tem um endereço no espaçovirbr0
— por exemplo,192.168.122.89
:user@nested-vm:~$ ip addr
Inicie um servidor web de espaço reservado na porta
8000
:user@nested-vm:~$ python -m http.server
Desconecte-se da sessão
screen
comCtrl+A
,Ctrl+D
.Teste se sua VM L1 pode executar ping na VM L2, substituindo o seguinte endereço IP pelo endereço IP da VM L2:
curl 192.168.122.89:8000
A saída é semelhante à seguinte:
<!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>
Crie uma VM L1 com virtualização aninhada habilitada e inclua um intervalo de IP de alias e suporte para tráfego 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
Substitua
VM_NAME
pelo nome da VM L1.DESCANSAR
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 }, ... }
Substitua o seguinte:
PROJECT_ID
: o ID do projetoZONE
: a zona para criar a VMVM_NAME
: o nome da VM
Use o comando
gcloud compute ssh
para se conectar à VM. Se tiver problemas para se conectar à VM, tente redefinir a VM ou modificar as regras de firewall.gcloud compute ssh VM_NAME
Substitua
VM_NAME
pelo nome da VM à qual se conectar.Atualize a VM e instale os pacotes necessários:
sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
Inicie a rede padrão que vem com o pacote
libvirt
:sudo virsh net-start default
Execute o seguinte comando para verificar se você possui a ponte
virbr0
:user@nested-vm:~$ ip addr
Verifique a saída semelhante a esta:
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
Crie uma interface
tap
para ir da VM L1 para a VM L2:sudo tunctl -t tap0 sudo ifconfig tap0 up
Vincule a interface
tap
à ponte privada:sudo brctl addif virbr0 tap0
Execute o seguinte comando para verificar a configuração da rede bridge:
sudo brctl show
Verifique a saída semelhante a esta:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nic
Baixe uma imagem de sistema operacional compatível com QEMU para usar na VM L2.
Execute
screen
e pressione Enter no prompt de boas-vindas:screen
Use o comando a seguir para iniciar a VM aninhada. Quando solicitado, faça login com
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
Substitua
IMAGE_NAME
pelo nome da imagem do sistema operacional compatível com QEMU a ser usada para a VM L2.Na VM L2, execute
ip addr
para confirmar se a VM L2 tem um endereço no espaço virbr0, como192.168.122.89
:user@nested-vm:~$ ip addr
Inicie um servidor web de espaço reservado na porta
8000
:user@nested-vm:~$ python -m http.server
Desconecte-se da sessão
screen
comCtrl+A
,Ctrl+D
.Teste se sua VM L1 pode executar ping na VM L2, substitua o endereço IP abaixo pelo endereço IP da VM L2:
curl 192.168.122.89:8000
Verifique se a resposta da VM L2 é semelhante à seguinte:
<!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>
Na VM L1, configure
iptables
para permitir o encaminhamento da VM L1 para a VM L2. Para a imagem L2 OS usada nestas instruções, você deve liberar as tabelas IP:sudo iptables -F
Determine o IP do alias da VM L1:
ip route show table local
Verifique se a saída é semelhante à seguinte. Para este exemplo, há dois endereços IP associados ao dispositivo ethernet
eth0
da VM L2. O primeiro,10.128.0.2
, é o endereço IP primário da VM L2, retornado porsudo ifconfig -a
. O segundo,10.128.0.13
, é o endereço IP do alias da 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
Execute os seguintes comandos para encaminhar o tráfego do IP de alias de exemplo
10.128.0.13
para o IP de exemplo192.168.122.89
para a 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 obter informações sobre solução de problemas
iptables
, consulteiptables
não encaminhando tráfego .Verifique o acesso da VM L2 de fora da VM L1 fazendo login em outra VM que esteja na mesma rede que a VM L1 e fazendo uma solicitação
curl
para o IP do alias, substituindo o endereço IP abaixo pelo IP do alias da VM L2:user@another-vm:~$ curl 10.128.0.13:8000
Verifique se a resposta
curl
é semelhante à seguinte:<!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 as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para gcloud CLI.
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
Para mais informações, consulte Autenticar para usar REST na documentação de autenticação do Google Cloud.
Criando uma VM L2 com acesso à rede externa
Crie uma VM L2 com acesso à rede externa usando o procedimento a seguir. Este procedimento usa
qemu-system-x86_64
para iniciar a VM L2. Se você estiver usando outro procedimento para criar uma VM L2 e tiver problemas, reproduza o problema usando este procedimento antes de entrar em contato com o suporte .Criando uma VM L2 com uma ponte de rede privada para a VM L1
Crie uma VM L2 com uma ponte de rede privada para a VM L1 criada anteriormente usando o procedimento a seguir. Para obter informações sobre como alterar a unidade máxima de transmissão (MTU) padrão da sua rede VPC, consulte a visão geral da unidade máxima de transmissão .
Criando uma VM L2 com acesso à rede de fora da VM L1
Você pode configurar uma VM L2 com um IP de alias para que as VMs fora da VM L1 possam acessar a VM L2. Use o procedimento a seguir para criar uma VM L2 com acesso à rede por meio de um IP de alias de fora da VM L1 criada anteriormente. Para obter informações sobre como criar endereços IP de alias, consulte Configurar intervalos de IP de alias .
O procedimento a seguir pressupõe uma sub-rede criada anteriormente chamada
subnet1
. Se você já tiver uma sub-rede com um nome diferente, substituasubnet1
pelo nome da sua sub-rede ou crie uma nova sub-rede chamadasubnet1
.O que vem a seguir
Exceto em caso de indicação contrária, o conteúdo desta página é licenciado de acordo com a Licença de atribuição 4.0 do Creative Commons, e as amostras de código são licenciadas de acordo com a Licença Apache 2.0. Para mais detalhes, consulte as políticas do site do Google Developers. Java é uma marca registrada da Oracle e/ou afiliadas.
Última atualização 2025-04-21 UTC.
-