Activer la virtualisation imbriquée pour les instances de VM

Ce document décrit comment procéder pour que la virtualisation imbriquée fonctionne sur les instances de VM Compute Engine. Il aborde également les étapes de base du démarrage et de la configuration d'une VM imbriquée.

La virtualisation imbriquée est compatible avec les instructions de virtualisation du processeur Intel VT-x pour les VM Compute Engine. Grâce à la virtualisation imbriquée, vous pouvez démarrer une instance de VM comme d'habitude sur Compute Engine, puis installer un hyperviseur compatible KVM sur l'instance de VM afin de pouvoir exécuter une autre instance de VM en superposition de cet hyperviseur. Vous pouvez utiliser la virtualisation imbriquée sur n'importe quelle instance de VM Linux exécutée sur un processeur Haswell ou une autre plate-forme plus récente. Pour connaître les autres contraintes, consultez la sous-section restrictions de la virtualisation imbriquée.

La virtualisation imbriquée est idéale pour les applications et les charges de travail basées sur des VM lorsqu'il est impossible de convertir ou d'importer vos images de VM dans Compute Engine. Par exemple, vous pouvez vous servir de la virtualisation imbriquée pour créer une solution de récupération après sinistre pour une charge de travail sur site s'exécutant sur des machines virtuelles KVM, qui peuvent basculer facilement vers des machines virtuelles fonctionnant sur Compute Engine. De cette façon, vous n'avez pas besoin de temps ni d'orchestration supplémentaire pour convertir votre VM basée sur KVM en une image Compute Engine native. La virtualisation imbriquée est également parfaitement adaptée à une charge de travail de framework de validation logicielle qui doit tester et valider les nouvelles versions d'un package logiciel sur plusieurs versions d'OS compatibles KVM. L'exécution de VM imbriquées évite de convertir et de gérer une grande bibliothèque d'images Compute Engine.

Avant de commencer

Fonctionnement de la virtualisation imbriquée

Les VM Compute Engine s'exécutent sur le matériel physique (le serveur hôte) appelé environnement L0. Dans le serveur hôte, un hyperviseur préinstallé permet à un serveur unique d'héberger plusieurs VM Compute Engine, qui sont appelées VM L1 ou natives sur Compute Engine. Lorsque vous utilisez la virtualisation imbriquée, vous installez un autre hyperviseur en superposition de l'OS invité L1 et vous créez des VM imbriquées, nommées VM L2, à l'aide de l'hyperviseur L1. Les VM Compute Engine L1 ou natives exécutant un hyperviseur invité et les VM imbriquées peuvent également être appelées VM hôtes.

Schéma illustrant la virtualisation imbriquée

Restrictions

  • La virtualisation imbriquée ne peut être activée que pour les VM L1 exécutées sur des processeurs de version Haswell ou ultérieure. Si le processeur par défaut d'une zone est Sandy Bridge ou Ivy Bridge, vous pouvez consulter la page sur la sélection d'une configuration minimale de processeur afin de choisir la plate-forme Haswell ou une version plus récente pour une instance donnée. Consultez la page Régions et zones pour déterminer quelles zones sont compatibles avec les processeurs de version Haswell ou ultérieure.
  • La virtualisation imbriquée ne fonctionne qu'avec les hyperviseurs KVM exécutés sur des instances Linux. Les hyperviseurs Hyper-V, ESX et Xen ne sont pas acceptés.
  • Les VM Windows n'acceptent pas la virtualisation imbriquée. En d'autres termes, les VM hôtes doivent exécuter un système d'exploitation Linux. Toutefois, les VM imbriquées peuvent utiliser certains systèmes d'exploitation Windows (indiqués ci-dessous).

Versions KVM testées

Google effectue des tests élémentaires d'intégration et de démarrage de la virtualisation imbriquée à l'aide des combinaisons de VM hôtes et imbriquées suivantes :

  • Debian 9 avec version de noyau 4.9 hébergeant les VM imbriquées suivantes :
    • CentOS 6.5 avec version de noyau 2.6
    • Debian 9 avec version de noyau 4.9
    • RHEL 5.11 avec version de noyau 2.6
    • SLES 12 SP3 avec version de noyau 4.4
    • Ubuntu 16.04 LTS avec version de noyau 4.15
    • Windows Server 2008 R2
    • Windows Server 2016 Datacenter Edition
  • SLES 12 SP3 avec version de noyau 4.4 hébergeant les VM imbriquées suivantes :
    • SLES 12 SP3 avec version de noyau 4.4
  • Ubuntu 16.04 LTS avec version de noyau 4.15 hébergeant les VM imbriquées suivantes :
    • Ubuntu 16.04 LTS avec version de noyau 4.15

Si vous ne parvenez pas à exécuter des VM imbriquées sur des distributions et des versions de noyau/KVM qui ne sont pas répertoriées sur cette page, reproduisez le problème en utilisant l'un des environnements ci-dessus comme système d'exploitation invité sur l'instance Compute Engine hôte avant de signaler un problème.

Performances

Même avec la virtualisation imbriquée assistée par matériel, les VM imbriquées et les applications ou les charges de travail exécutées à l'intérieur de ces VM vont subir une perte de performances. Bien qu'il soit impossible de prévoir la diminution exacte des performances pour une application ou une charge de travail donnée, prévoyez au moins une perte de 10 % pour les charges de travail liées au processeur, voire beaucoup plus pour les charges de travail liées aux E/S.

Activer la virtualisation imbriquée sur une instance

Deux étapes sont nécessaires pour utiliser la virtualisation imbriquée :

  1. La virtualisation imbriquée est autorisée au niveau du projet, du dossier ou de l'organisation. Il s'agit du paramètre par défaut. Par conséquent, si aucun utilisateur de votre organisation n'a désactivé la virtualisation imbriquée, aucune action n'est nécessaire pour l'activer.

  2. Les instances de VM pour lesquelles vous souhaitez utiliser la virtualisation imbriquée doivent utiliser une image personnalisée avec une clé de licence spéciale. Vous trouverez ci-dessous la procédure à suivre.

Pour que la virtualisation imbriquée fonctionne, vous devez créer une image personnalisée avec une clé de licence spéciale qui active VMX sur l'instance de VM L1 ou hôte, puis utiliser cette image sur une instance conforme aux restrictions applicables à la virtualisation imbriquée. La clé de licence n'entraîne pas de frais supplémentaires.

  1. Créez un disque de démarrage à partir d'une image publique ou d'une image personnalisée avec un système d'exploitation. Vous pouvez également ignorer cette étape et appliquer la licence à un disque existant à partir de l'une de vos instances de VM.

    gcloud

    Créez le disque à partir de l'image du disque de démarrage de votre choix en utilisant l'outil de ligne de commande gcloud. Pour cet exemple, créez un disque nommé disk1 à partir de la famille d'images debian-9 :

    gcloud compute disks create disk1 --image-project debian-cloud --image-family debian-9 --zone us-central1-b

    API

    Créez un disque nommé disk1 à partir de la famille d'images debian-9 :

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks
    
    {
     "name": "disk1",
     "sourceImage": "/projects/debian-cloud/global/images/family/debian-9"
    }

    [PROJECT_ID] correspond à l'ID de votre projet.

  2. À l'aide du disque de démarrage que vous avez créé ou d'un disque de démarrage à partir d'une instance existante, créez une image personnalisée avec la clé de licence spéciale requise pour la virtualisation.

    gcloud

    Si vous créez une image via l'outil de ligne de commande gcloud, indiquez l'URL de licence suivante à l'aide de l'option "--licenses" :

    https://compute.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx

    Par exemple, la commande suivante permet de créer une image nommée "nested-vm-image" à partir d'un disque d'exemple nommé "disk1" :

    gcloud compute images create nested-vm-image \
      --source-disk disk1 --source-disk-zone us-central1-b \
      --licenses "https://compute.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"

    API

    Dans l'API, incluez la propriété "licenses" dans votre requête API :

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/images
    
    {
       "licenses": ["projects/vm-options/global/licenses/enable-vmx"],
       "name": "nested-vm-image",
       "sourceDisk": "zones/us-central1-b/disks/disk1"
    }

    [PROJECT_ID] correspond à l'ID de votre projet.

  3. Après avoir créé l'image avec la licence appropriée, vous pouvez supprimer le disque source si vous n'en avez plus besoin.
  4. Créez une instance de VM à l'aide de la nouvelle image personnalisée avec la licence. Vous devez créer cette instance dans une zone qui fonctionne sur la plate-forme de processeur Haswell ou une version ultérieure. Exemple :
    gcloud compute instances create example-nested-vm --zone us-central1-b \
                  --min-cpu-platform "Intel Haswell" \
                  --image nested-vm-image
  5. Vérifiez que la virtualisation imbriquée est activée dans la VM.
    1. Connectez-vous à l'instance de VM. Exemple :
      gcloud compute ssh example-nested-vm
    2. Vérifiez que la virtualisation imbriquée est activée en exécutant la commande suivante. Une réponse autre que zéro confirme que la virtualisation imbriquée est activée.
      grep -cw vmx /proc/cpuinfo

Démarrer une VM imbriquée

Il existe de nombreuses méthodes pour démarrer une VM imbriquée. Dans cette section, vous trouverez un exemple de démarrage de VM imbriquée à l'aide de qemu-system-x86_64 sur une VM L1 exécutant Debian. Si vous rencontrez des problèmes lors de l'exécution de VM imbriquées en suivant d'autres méthodes, reproduisez le problème à l'aide de la procédure ci-dessous avant de signaler un bug.

  1. Connectez-vous à l'instance de VM. Exemple :

    gcloud compute ssh example-nested-vm
    
  2. Mettez à jour l'instance de VM, puis installez certains packages nécessaires :

    sudo apt-get update && sudo apt-get install qemu-kvm -y
    
  3. Téléchargez une image de l'OS :

    wget https://people.debian.org/~aurel32/qemu/amd64/debian_squeeze_amd64_standard.qcow2
    
  4. Exécutez screen :

    screen
    
  5. Appuyez sur Entrée lorsque l'invite de bienvenue screen s'affiche.

  6. Démarrez la VM imbriquée. Lorsque vous y êtes invité, connectez-vous avec les identifiants user: root et password: root.

    sudo qemu-system-x86_64 -enable-kvm -hda debian_squeeze_amd64_standard.qcow2 -m 512 -curses
    
  7. Vérifiez que votre VM dispose d'un accès externe :

    user@nested-vm:~$ wget google.com && cat index.html
  8. Lorsque vous avez terminé, détachez la session screen en appuyant sur les touches Ctrl+A et Ctrl+D.

Démarrer un pont privé entre l'hôte et les VM imbriquées

Pour activer les connexions entre l'hôte et la VM imbriquée, vous pouvez créer un pont privé. Cet exemple de procédure concerne une VM L1 exécutant Debian.

  1. Connectez-vous à l'instance de VM. Exemple :

    gcloud compute ssh example-nested-vm
    
  2. Mettez à jour l'instance de VM, puis installez certains packages nécessaires :

    sudo apt-get update && sudo apt-get install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  3. Démarrez le réseau par défaut associé au package libvirt :

    sudo virsh net-start default
    
  4. Vérifiez que vous disposez désormais du pont virbr0 :

    sudo ifconfig -a
    
     eth0      Link encap:Ethernet  HWaddr 42:01:0a:80:00:02
               inet addr:10.128.0.2  Bcast:10.128.0.2  Mask:255.255.255.255
               UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
               RX packets:14799 errors:0 dropped:0 overruns:0 frame:0
               TX packets:9294 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:1000
               RX bytes:97352041 (92.8 MiB)  TX bytes:1483175 (1.4 MiB)
    
     lo        Link encap:Local Loopback
               inet addr:127.0.0.1  Mask:255.0.0.0
               inet6 addr: ::1/128 Scope:Host
               UP LOOPBACK RUNNING  MTU:65536  Metric:1
               RX packets:0 errors:0 dropped:0 overruns:0 frame:0
               TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:0
               RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
     virbr0    Link encap:Ethernet  HWaddr 5a:fa:7e:d2:8b:0d
               inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
               UP BROADCAST MULTICAST  MTU:1500  Metric:1
               RX packets:0 errors:0 dropped:0 overruns:0 frame:0
               TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:0
               RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
  5. Créez une interface tun pour passer de la VM hôte à la VM imbriquée :

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  6. Reliez l'interface tun à la VM du pont :

    sudo brctl addif virbr0 tap0
    
  7. Assurez-vous que le réseau du pont est correctement configuré :

    sudo brctl show
    
    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254005085fe       yes              tap0
  8. Téléchargez une image de l'OS :

    wget https://people.debian.org/~aurel32/qemu/amd64/debian_squeeze_amd64_standard.qcow2
    
  9. Exécutez screen :

    screen
    
  10. Appuyez sur Entrée lorsque l'invite de bienvenue screen s'affiche.

  11. Démarrez la VM imbriquée :

    sudo qemu-system-x86_64 -enable-kvm -hda debian_squeeze_amd64_standard.qcow2 -m 512 -net nic -net tap,ifname=tap0,script=no -curses
    
  12. Lorsque vous y êtes invité, connectez-vous avec les identifiants user: root et password: root.

  13. Sur la VM imbriquée, exécutez ifconfig pour vérifier que la VM dispose d'une adresse dans l'espace virbr0, telle que 192.168.122.89 :

    user@nested-vm:~$ ifconfig
  14. Démarrez un serveur Web test sur le port 8000 :

    user@nested-vm:~$ python -m SimpleHTTPServer
  15. Détachez la session screen en appuyant sur les touches Ctrl+A et Ctrl+D.

  16. Vérifiez que votre VM hôte peut pinguer la VM imbriquée :

    curl 192.168.122.89:8000
    

    La VM imbriquée doit renvoyer une réponse de ce type :

    <!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>
    

Configurer une VM imbriquée pour qu'elle soit accessible de l'extérieur de la VM hôte

Vous pouvez configurer une instance avec plusieurs interfaces réseau ou configurer une instance à l'aide d'une adresse IP d'alias afin que les VM extérieures à la VM hôte puissent pinguer la VM imbriquée.

Dans l'exemple de procédure ci-dessous, votre hôte et votre VM imbriquée sont configurés de sorte que la VM imbriquée soit accessible à partir d'autres VM sur le même réseau à l'aide d'adresses IP d'alias. Cette procédure utilise un sous-réseau imaginaire nommé subnet1 créé au préalable. Vous pouvez remplacer subnet1 par le nom de votre propre sous-réseau ou créer un sous-réseau nommé subnet1.

Enfin, notez que cette procédure concerne une VM L1 exécutant Debian.

  1. Créez une VM en activant la virtualisation imbriquée, mais veillez à inclure une plage d'adresses IP d'alias et la compatibilité avec le trafic HTTP/HTTPS. Exemple :

    gcloud compute instances create example-nested-vm --image nested-vm-image \
        --tags http-server,https-server --can-ip-forward \
        --min-cpu-platform "Intel Haswell" \
        --network-interface subnet=subnet1,aliases=/30
    
  2. Connectez-vous à l'instance de VM. Exemple :

    gcloud compute ssh example-nested-vm
    
  3. Mettez à jour l'instance de VM, puis installez certains packages nécessaires :

    sudo apt-get update && sudo apt-get install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
    
  4. Démarrez le réseau par défaut associé au package libvirt :

    sudo virsh net-start default
    
  5. Vérifiez que vous disposez désormais du pont virbr0 :

    sudo ifconfig -a
     
     eth0      Link encap:Ethernet  HWaddr 42:01:0a:80:00:02
               inet addr:10.128.0.2  Bcast:10.128.0.2  Mask:255.255.255.255
               UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
               RX packets:14799 errors:0 dropped:0 overruns:0 frame:0
               TX packets:9294 errors:0 dropped:0 overruns:0 carrier:0
               collisions:0 txqueuelen:1000
               RX bytes:97352041 (92.8 MiB)  TX bytes:1483175 (1.4 MiB)

    lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

    virbr0 Link encap:Ethernet HWaddr 5a:fa:7e:d2:8b:0d inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

  6. Créez une interface tun pour passer de la VM hôte à la VM imbriquée :

    sudo tunctl -t tap0
    sudo ifconfig tap0 up
    
  7. Reliez l'interface tun à la VM du pont :

    sudo brctl addif virbr0 tap0
    
  8. Assurez-vous que le réseau du pont est correctement configuré :

    sudo brctl show
    
    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254005085fe       yes              tap0
  9. Téléchargez une image de l'OS :

    wget https://people.debian.org/~aurel32/qemu/amd64/debian_squeeze_amd64_standard.qcow2
    
  10. Exécutez screen :

    screen
    
  11. Appuyez sur Entrée lorsque l'invite de bienvenue screen s'affiche.

  12. Démarrez la VM imbriquée :

    sudo qemu-system-x86_64 -enable-kvm -hda debian_squeeze_amd64_standard.qcow2 -m 512 -net nic -net tap,ifname=tap0,script=no -curses
    
  13. Lorsque vous y êtes invité, connectez-vous avec les identifiants user: root et password: root.

  14. Sur la VM imbriquée, exécutez ifconfig pour vérifier que la VM dispose d'une adresse dans l'espace virbr0, telle que 192.168.122.89 :

    user@nested-vm:~$ ifconfig
  15. Démarrez un serveur Web test sur le port 8000 :

    user@nested-vm:~$ python -m SimpleHTTPServer
  16. Détachez la session screen en appuyant sur les touches Ctrl+A et Ctrl+D.

  17. Vérifiez que votre VM hôte peut pinguer la VM imbriquée :

    curl 192.168.122.89:8000
    

    La VM imbriquée doit renvoyer une réponse de ce type :

    <!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>
    
  18. Sur votre VM hôte, configurez iptables pour permettre le transfert depuis votre VM hôte vers votre VM imbriquée. Pour l'image d'invité L2 utilisée dans ces instructions (debian_squeeze_amd64_standard.qcow2), il est nécessaire de vider les tables IP au préalable :

    sudo iptables -F
    

    Déterminez ensuite l'adresse IP d'alias de la VM :

    ip route show table local
    

    La VM doit renvoyer un résultat semblable à celui ci-dessous. Dans cet exemple, deux adresses IP sont associées à l'appareil Ethernet de la VM, eth0. La première, 10.128.0.2, correspond à l'adresse IP principale de la VM, renvoyée par sudo ifconfig -a. La deuxième, 10.128.0.13, correspond à l'adresse IP d'alias de la VM.

    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
    

    Pour transférer le trafic de l'adresse IP d'alias (10.128.0.13) vers la VM imbriquée (192.168.122.89), procédez comme suit :

    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
    
  19. Ensuite, connectez-vous à une autre VM située sur le même réseau que la VM hébergée et envoyez une requête curl à l'adresse IP d'alias. Exemple :

    user@another-vm:~$ curl 10.128.0.13:8000

    La VM imbriquée doit renvoyer une réponse de ce type :

    <!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>
    

Gérer la virtualisation imbriquée dans une organisation

Si vous détenez le rôle orgPolicy.policyAdmin, vous pouvez contrôler l'utilisation de la virtualisation imbriquée pour les projets et les dossiers de l'organisation en modifiant la règle d'administration. Pour autoriser ou empêcher la virtualisation imbriquée, mettez à jour la contrainte Désactiver la virtualisation imbriquée sur la VM.

Il est conseillé de définir explicitement la valeur de la contrainte booléenne de la règle d'administration "Désactiver la virtualisation imbriquée sur la VM" pour que vos projets, dossiers ou l'ensemble de votre organisation ne reposent pas sur le paramètre par défaut.

Console

  1. Accédez à la page "Règles d'administration" dans Google Cloud Console.
    Accéder à la page "Règles d'administration"

  2. Dans le menu déroulant situé en haut de la page, sélectionnez le projet, le dossier ou l'organisation dont vous souhaitez modifier les règles d'administration. La page Règles d'administration affiche la liste des contraintes de règles d'administration disponibles.

  3. Sélectionnez la contrainte Désactiver la virtualisation imbriquée sur la VM dans la liste de la page Règles d'administration. La page Détails des règles qui s'affiche décrit la contrainte et fournit des informations sur son application actuelle.

  4. Cliquez sur Modifier pour personnaliser la contrainte.

  5. Sur la page Modifier, sélectionnez Personnaliser.

  6. Sous Application, sélectionnez une option d'application :

    • Pour activer l'application de cette contrainte, sélectionnez Activer.

    • Pour désactiver l'application de cette contrainte, sélectionnez Désactiver.

  7. Cliquez sur Enregistrer.

gcloud

Utilisez l'outil de ligne de commande gcloud pour exécuter la commande enable-enforce ou disable-enforce afin, respectivement, d'empêcher ou d'autoriser la virtualisation imbriquée.

Autoriser la virtualisation imbriquée

gcloud beta resource-manager org-policies disable-enforce \
    compute.disableNestedVirtualization \
    [--project=[PROJECT_ID] | --folder=[FOLDER_ID] | --organization=[ORGANIZATION_ID]]

Empêcher la virtualisation imbriquée

gcloud beta resource-manager org-policies enable-enforce \
    compute.disableNestedVirtualization \
    [--project=[PROJECT_ID] | --folder=[FOLDER_ID] | --organization=[ORGANIZATION_ID]]

Spécifiez les paramètres --project, --folder ou --organization où :

  • [PROJECT_ID] est l'ID du projet pour lequel la virtualisation imbriquée doit être activée.
  • [FOLDER_ID] est l'ID du dossier pour lequel la virtualisation imbriquée doit être activée.
  • [ORGANIZATION_ID] est l'ID de l'organisation pour laquelle la virtualisation imbriquée doit être activée.

API

Pour activer ou désactiver la virtualisation imbriquée pour un projet, un dossier ou une organisation, envoyez une requête POST à l'URL suivante :

https://cloudresourcemanager.googleapis.com/v1/[RESOURCE]/[RESOURCE_ID]:setOrgPolicy

où :

  • [RESOURCE] correspond aux projects, folders ou organizations.
  • [RESOURCE_ID] est l'ID du projet, du dossier ou de l'organisation, en fonction de la ressource.

Dans le corps de la requête, définissez la valeur enforced sur true (empêche la virtualisation imbriquée) ou sur false (autorise la virtualisation imbriquée) :

{"policy":
    {"booleanPolicy":
        {
            "enforced": false
        },
        "constraint": "constraints/compute.disableNestedVirtualization"
    }
  }

Vous pouvez déterminer si votre projet, dossier ou organisation n'est pas autorisé à utiliser la virtualisation imbriquée si la règle d'administration est définie sur enforced. Par exemple, à l'aide de l'outil gcloud :

gcloud beta resource-manager org-policies describe \
    constraints/compute.disableNestedVirtualization --project=[PROJECT_ID] --effective

[PROJECT_ID] correspond à l'ID de votre projet. Si la réponse affiche une valeur booleanPolicy: {} vide, la virtualisation imbriquée est autorisée. Sinon, la réponse affiche la valeur enforced: true. Pour plus d'informations, consultez la documentation sur les contraintes booléennes.

Dépannage

Google effectue des tests élémentaires d'intégration et de démarrage de la virtualisation imbriquée sur l'instance Compute Engine, à l'aide de distributions Linux et de versions de noyau/KVM spécifiques. Par ailleurs, ces tests reposent sur un processus particulier. Avant de signaler un bug, reproduisez le problème concerné en respectant les conditions ci-dessous :

Je ne parviens pas à démarrer de nouvelles VM avec la virtualisation imbriquée.

Si votre projet fait partie d'une organisation, celle-ci a peut-être désactivé la possibilité de créer des VM avec la virtualisation imbriquée. Assurez-vous que la virtualisation imbriquée est autorisée avant d'essayer de démarrer une VM avec la virtualisation imbriquée.

L'exécution de la commande grep -c vmx /proc/cpuinfo renvoie 0 et indique que ma VM n'est pas activée pour l'imbrication.

  1. Assurez-vous d'avoir démarré votre VM avec une plate-forme de processeur de version Haswell ou ultérieure.
  2. Assurez-vous d'utiliser la bonne licence avec votre image de VM.

Je ne peux pas sortir de ma VM imbriquée.

Si vous n'avez pas exécuté screen avant chaque session de VM imbriquée, vous pouvez arrêter la VM imbriquée ou terminer le processus depuis un autre terminal. Pour arrêter la VM imbriquée, exécutez la commande poweroff depuis celle-ci. Vous pouvez également vous connecter à la VM hôte dans un autre terminal et terminer le processus, puis exécuter screen sur la VM hôte avant de démarrer une nouvelle VM imbriquée.

Mes règles relatives aux iptables ne transfèrent pas le trafic vers ma VM imbriquée.

  • iptables résout les règles de haut en bas. Assurez-vous que vos règles sont prioritaires sur les autres.
  • Vérifiez qu'aucune règle en conflit n'intercepte vos paquets.
  • Pensez à vider vos iptables :

    1. Tout d'abord, définissez les règles par défaut :

      sudo iptables -P INPUT ACCEPT
      sudo iptables -P FORWARD ACCEPT
      sudo iptables -P OUTPUT ACCEPT
      
    2. Videz toutes les tables et les chaînes, puis supprimez les chaînes qui ne sont pas définies par défaut :

      sudo iptables -t nat -F
      sudo iptables -t mangle -F
      sudo iptables -F
      sudo iptables -X