La virtualizzazione nidificata è consentita per impostazione predefinita, quindi a meno che qualcuno non modifichi per la virtualizzazione nidificata, non devi apportare modifiche crei VM nidificate in un'organizzazione, una cartella o un progetto. Se il tuo progetto non appartiene a un'organizzazione, la virtualizzazione nidificata è consentita per impostazione predefinita e non puoi modificarlo. Per informazioni su come modificare che determina se è possibile creare VM nidificate. Vedi Gestire il vincolo di virtualizzazione nidificata.
Questo documento descrive come creare vari tipi di macchine virtuali di livello 2 (L2) di Compute Engine (VM). Prima di creare una VM nidificata, devi creare una VM L1 con la virtualizzazione nidificata abilitata. Per una descrizione delle VM L1 e L2, consulta la panoramica sulla virtualizzazione nidificata.
Dopo aver creato una VM L1 in cui è abilitata la virtualizzazione nidificata, puoi eseguire qualsiasi dei seguenti:
- Crea una VM L2 con accesso alla rete esterna
- Crea una VM L2 con un bridge di rete privato sulla VM L1
- Crea una VM L2 con accesso alla rete dall'esterno della VM L1
Prima di iniziare
-
Se non l'hai già fatto, configura l'autenticazione.
Autenticazione è
Il processo di verifica dell'identità per l'accesso ai servizi e alle API di Google Cloud.
Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi eseguire l'autenticazione
Compute Engine come segue.
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.
REST
Per utilizzare gli esempi di API REST in questa pagina in un ambiente di sviluppo locale, utilizzi le credenziali che fornisci a gcloud CLI.
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
Per ulteriori informazioni, vedi Esegui l'autenticazione per l'utilizzo di REST nella documentazione sull'autenticazione di Google Cloud.
-
Creazione di una VM L2 con accesso alla rete esterna
Crea una VM L2 con accesso alla rete esterna utilizzando la procedura seguente.
Questa procedura utilizza qemu-system-x86_64
per avviare la VM L2. Se utilizzi
di un'altra procedura per creare una VM L2 e, se riscontri problemi,
utilizzando questa procedura prima di contattare l'assistenza.
Usa il comando
gcloud compute ssh
per connettiti alla VM:gcloud compute ssh VM_NAME
Sostituisci
VM_NAME
con il nome della VM da connettere a.Installa il pacchetto
qemu-kvm
più recente:sudo apt update && sudo apt install qemu-kvm -y
Scarica un'immagine del sistema operativo compatibile con QEMU da utilizzare per la VM L2.
Utilizza il comando seguente per avviare la VM L2. Quando richiesto, accedi con
user: root
epassword: root
.sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -curses
Sostituisci
IMAGE_NAME
con il nome del Immagine del sistema operativo compatibile con QEMU da utilizzare per la VM L2.Verifica che la tua VM L2 abbia accesso esterno:
user@nested-vm:~$ host google.com
Creazione di una VM L2 con un bridge di rete privato sulla VM L1
Crea una VM L2 con un bridge di rete privato sulla VM L1 creata in precedenza utilizzando la seguente procedura. Per informazioni su come modificare l'unità massima di trasmissione (MTU) predefinita per la rete VPC, consulta la panoramica dell'unità massima di trasmissione.
Crea una VM L1 con la virtualizzazione nidificata abilitata.
Usa il comando
gcloud compute ssh
per connettiti alla VM:gcloud compute ssh VM_NAME
Sostituisci
VM_NAME
con il nome della VM da connettere a.Installa i pacchetti necessari per creare il bridge privato:
sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
Avvia la rete predefinita fornita con il pacchetto
libvirt
:sudo virsh net-start default
Esegui il seguente comando per verificare di avere il bridge
virbr0
:ip addr
L'output è simile al seguente:
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 un'interfaccia
tap
per passare dalla VM L1 alla VM L2:sudo tunctl -t tap0 sudo ifconfig tap0 up
Collega l'interfaccia
tap
al bridge privato:sudo brctl addif virbr0 tap0
Esegui il seguente comando per verificare la configurazione della rete bridge:
sudo brctl show
L'output è simile al seguente:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nic
Scarica un'immagine del sistema operativo compatibile con QEMU da utilizzare per la VM L2.
Esegui
screen
e premi Invio al prompt di benvenuto:screen
Utilizza il comando seguente per avviare la VM L2. Quando richiesto, accedi con
user: root
epassword: root
.sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -net nic -net tap,ifname=tap0,script=no -curses
Sostituisci
IMAGE_NAME
con il nome dell'immagine del sistema operativo compatibile con QEMU da utilizzare per la VM L2.Sulla VM L2, esegui
ip addr show
per confermare che la VM abbia un indirizzo nella Spaziovirbr0
, ad esempio192.168.122.89
:user@nested-vm:~$ ip addr
Avvia un server web segnaposto sulla porta
8000
:user@nested-vm:~$ python -m http.server
Scollega dalla sessione
screen
conCtrl+A
,Ctrl+D
.Verifica che la VM L1 possa inviare un ping alla VM L2, sostituendo il seguente indirizzo IP con l'indirizzo IP della VM L2:
curl 192.168.122.89:8000
L'output è simile al seguente:
<!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>
Creazione di una VM L2 con accesso alla rete dall'esterno della VM L1
Puoi configurare una VM L2 con un IP alias, in modo che le VM esterne alla VM L1 possano per accedere alla VM L2. Usa la procedura seguente per creare una VM L2 con rete l'accesso tramite IP alias dall'esterno della VM L1 creata in precedenza. Per informazioni sulla creazione di indirizzi IP alias, consulta Configurare intervalli IP alias.
La procedura seguente presuppone una subnet creata in precedenza denominata subnet1
. Se
hai già una subnet con un nome diverso, sostituisci subnet1
con il nome
della subnet o creane una nuova denominata subnet1
.
Crea una VM L1 con virtualizzazione nidificata abilitata e includi un IP alias e il supporto per il traffico 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
Sostituisci
VM_NAME
con il nome della 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 }, ... }
Sostituisci quanto segue:
PROJECT_ID
: l'ID progettoZONE
: la zona in cui creare la VMVM_NAME
: il nome della VM
Usa il comando
gcloud compute ssh
per connettersi alla VM. Se hai problemi di connessione alla VM, prova a reimpostare sulla VM o la modifica delle regole del firewall.gcloud compute ssh VM_NAME
Sostituisci
VM_NAME
con il nome della VM da connettere a.Aggiorna la VM e installa i pacchetti necessari:
sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
Avvia la rete predefinita fornita con il pacchetto
libvirt
:sudo virsh net-start default
Esegui il seguente comando per verificare di avere il bridge
virbr0
:user@nested-vm:~$ ip addr
Verifica un output simile al seguente:
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 un'interfaccia
tap
per passare dalla VM L1 alla VM L2:sudo tunctl -t tap0 sudo ifconfig tap0 up
Collega l'interfaccia
tap
al bridge privato:sudo brctl addif virbr0 tap0
Esegui questo comando per verificare la configurazione della rete bridge:
sudo brctl show
Verifica che l'output sia simile al seguente:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nic
Scarica un'immagine del sistema operativo compatibile con QEMU da utilizzare per la VM L2.
Esegui
screen
e premi Invio al prompt di benvenuto:screen
Utilizza il comando seguente per avviare la VM nidificata. Quando richiesto, esegui l'accesso 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
Sostituisci
IMAGE_NAME
con il nome del Immagine del sistema operativo compatibile con QEMU da utilizzare per la VM L2.Sulla VM L2, esegui
ip addr
per confermare che la VM L2 abbia un indirizzo nella spazio virbr0, ad esempio192.168.122.89
:user@nested-vm:~$ ip addr
Avvia un server web segnaposto sulla porta
8000
:user@nested-vm:~$ python -m http.server
Scollega dalla sessione
screen
conCtrl+A
,Ctrl+D
.Verifica che la tua VM L1 possa inviare un ping alla VM L2. Sostituisci l'indirizzo IP di seguito con l'indirizzo IP della VM L2:
curl 192.168.122.89:8000
Verifica che la risposta dalla VM L2 sia simile alla seguente:
<!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>
Sulla VM L1, configura
iptables
per consentire l'inoltro dalla VM L1 alla VM L2 VM. Per l'immagine del sistema operativo L2 utilizzata in queste istruzioni, devi eseguire il flush dell'indirizzo IP tabelle:sudo iptables -F
Determina l'IP alias della VM L1:
ip route show table local
Verifica che l'output sia simile al seguente. Per questo esempio, esistono due indirizzi IP associati al dispositivo Ethernet
eth0
della VM L2. Il primo,10.128.0.2
, è l'indirizzo IP principale della VM L2, restituito dasudo ifconfig -a
. Il secondo,10.128.0.13
, è l'IP alias della 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
Esegui questi comandi per inoltrare il traffico dall'esempio
10.128.0.13
IP alias all'IP di esempio192.168.122.89
per 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
Per informazioni sulla risoluzione dei problemi relativi a
iptables
, consulta l'articoloiptables
non inoltra il traffico.Verifica l'accesso alla VM L2 dall'esterno della VM L1 accedendo a un'altra VM sulla stessa rete della VM L1 e invia una richiesta
curl
all'alias , sostituendo l'indirizzo IP riportato di seguito con l'IP alias della VM L2:user@another-vm:~$ curl 10.128.0.13:8000
Verifica che la risposta
curl
sia simile alla seguente:<!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>