Vous pouvez créer des instances de machines virtuelles (VM) dans d'autres VM à l'aide de la virtualisation imbriquée. Compute Engine ajoute des instructions de virtualisation à des séries de machines spécifiques afin que ces instances de VM puissent créer des VM imbriquées. Étant donné que les nœuds Google Kubernetes Engine (GKE) s'exécutent sur des VM Compute Engine, vos charges de travail GKE peuvent créer et utiliser des VM imbriquées. Ce document explique comment activer la virtualisation imbriquée dans GKE.
Fonctionnement des VM imbriquées dans GKE
Pour utiliser des VM imbriquées dans GKE, vous devez activer la virtualisation imbriquée pour des nœuds ou des pools de nœuds spécifiques. Les extensions de virtualisation du processeur correspondantes, telles que Intel Virtualization Technology (VT-x) ou AMD Virtualization (AMD-V), sont activées dans les VM sous-jacentes. Vous pouvez ensuite déclencher la création de VM imbriquées à partir de pods à l'aide de logiciels tels que QEMU ou Kata Containers.
Dans GKE, les VM imbriquées sont utiles pour les cas d'utilisation suivants :
- Exécutez du code non fiable, comme des agents d'IA, dans des VM légères, telles que Kata Containers. Pour en savoir plus sur ce cas d'utilisation, consultez Utiliser les conteneurs Kata Open Source avec GKE Agent Sandbox.
- Ajoutez une couche d'isolation assistée par matériel pour les charges de travail mutualisées.
- Exécutez des logiciels spécialisés tels que des émulateurs Android dans le cloud.
Réduction de l'impact sur les performances
Avec la virtualisation imbriquée assistée par matériel, les charges de travail exécutées sur les VM imbriquées peuvent enregistrer une baisse de performances par rapport aux configurations de virtualisation non imbriquées. L'impact sur les performances dépend du profil de charge de travail spécifique, y compris de ses caractéristiques d'E/S et d'utilisation de mémoire.
De plus, la création de VM imbriquées sur les VM sous-jacentes des nœuds GKE peut avoir un impact sur les performances d'autres charges de travail exécutées sur ces nœuds.
Avant de commencer
Avant de commencer, effectuez les tâches suivantes :
- Activez l'API Google Kubernetes Engine. Activer l'API Google Kubernetes Engine
- Pour utiliser Google Cloud CLI pour cette tâche, installez puis initialisez la gcloud CLI. Si vous avez déjà installé la gcloud CLI, obtenez la dernière version en exécutant la commande
gcloud components update. Il est possible que les versions antérieures de la gcloud CLI ne permettent pas d'exécuter les commandes de ce document.
- Assurez-vous que votre règle d'administration autorise la création de VM imbriquées.
- Consultez les restrictions concernant les VM imbriquées.
Conditions requises et limites
Tenez compte des informations suivantes avant d'activer la virtualisation imbriquée avec GKE et d'autoriser vos pods à créer des VM imbriquées :
- Vous ne pouvez configurer des pools de nœuds avec des VM imbriquées qu'avec un nombre limité de séries de machines VM. Consultez la ligne virtualisation imbriquée de la comparaison des séries de machines pour vérifier les séries de machines compatibles.
- La virtualisation imbriquée n'est pas compatible avec les pools de nœuds Windows Server.
- Vous ne pouvez pas utiliser la virtualisation imbriquée si la contrainte Désactiver la virtualisation imbriquée sur la VM est appliquée à votre règle d'administration.
- Vous devez définir
securityContext.privileged:truepour que les pods interagissent avec les VM imbriquées. Si vous utilisez GKE Autopilot, vous ne pouvez pas créer de nœuds de pods privilégiés, sauf dans les cas suivants :
- Les pods appartiennent à GKE, à un partenaire GKE ou à un projet Open Source approuvé.
- Les pods vous appartiennent et sont inclus dans une WorkloadAllowlist.
Vous ne pouvez pas activer la virtualisation imbriquée dans les pools de nœuds existants.
La virtualisation imbriquée est un paramètre immuable dans GKE.
Si vous utilisez ComputeClasses pour activer la virtualisation imbriquée, votre cluster doit exécuter GKE version 1.37.0-gke.4713000 ou ultérieure.
Activer la virtualisation imbriquée
Les sections suivantes vous expliquent comment activer la virtualisation imbriquée dans GKE :
- Utiliser des ComputeClasses : en mode Autopilot ou Standard, activez la virtualisation imbriquée pour des configurations de nœud spécifiques dans une ComputeClass. Cette méthode vous permet d'activer la virtualisation imbriquée dans les pools de nœuds créés automatiquement et de revenir à plusieurs configurations de nœuds prioritaires.
- Utilisez l'API GKE : en mode Standard, utilisez un client tel que la console Google Cloud , gcloud CLI ou Terraform pour créer des pools de nœuds spécifiques qui utilisent la virtualisation imbriquée.
Activer à l'aide de ComputeClasses
Vous pouvez utiliser une ComputeClass pour activer la virtualisation imbriquée pour des groupes de nœuds spécifiques en mode Autopilot ou Standard. Les ComputeClasses sont la seule méthode permettant d'activer la virtualisation imbriquée pour les pools de nœuds créés automatiquement et les nœuds Autopilot. Pour déployer un exemple de ComputeClass qui active la virtualisation imbriquée, procédez comme suit :
Enregistrez le fichier manifeste ComputeClass suivant dans un fichier nommé
nested-virt-class.yaml:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: nested-virt-class spec: priorities: - machineFamily: c3 spot: true enableNestedVirtualization: true - machineFamily: c4 spot: false enableNestedVirtualization: true - machineFamily: c4d spot: true enableNestedVirtualization: true nodePoolConfig: imageType: "cos_containerd" nodePoolAutoCreation: enabled: true whenUnsatisfiable: DoNotScaleUpCette classe ComputeClass présente les propriétés suivantes :
- Priorise les instances C3 sur les VM Spot, puis les instances C4 à la demande, puis les instances C4D sur les VM Spot.
- Active la virtualisation imbriquée pour toutes les instances.
- Empêche GKE de faire évoluer la série de machines par défaut du cluster si les instances prioritaires ne sont pas disponibles.
- Utilise l'image de nœud Container-Optimized OS pour tous les nœuds.
- Active la création automatique de pools de nœuds afin que GKE puisse créer de nouveaux pools de nœuds pour exécuter des pods si nécessaire.
Vous pouvez également activer la virtualisation imbriquée pour toutes les règles de priorité de votre ComputeClass en spécifiant le champ
enableNestedVirtualization: truedans le champspec.priorityDefaults.Créez la ComputeClass :
kubectl apply -f nested-virt-class.yamlLorsque vous activez la virtualisation imbriquée dans une ComputeClass, GKE vérifie que la série de machines spécifiée est compatible avec les VM imbriquées. Si une série de machines dans une règle de priorité qui active la virtualisation imbriquée n'est pas compatible, GKE vous avertit. Toutefois, il est possible que cette vérification ne détecte pas toutes les configurations incompatibles.
Pour déclencher la création d'un pool de nœuds, créez un pod qui sélectionne la classe de calcul :
Enregistrez le fichier manifeste de pod suivant dans un fichier nommé
nested-virt-example-pod.yaml:apiVersion: v1 kind: Pod metadata: name: nested-virt-example-pod spec: nodeSelector: cloud.google.com/compute-class: nested-virt-class containers: - name: example-container image: registry.k8s.io/pause:3.9Créez le pod :
kubectl apply -f nested-virt-example-pod.yaml
Les nœuds que GKE crée pour cette ComputeClass sont associés à la virtualisation imbriquée. Vous pouvez exécuter des applications qui créent des VM imbriquées sur ces nœuds. Tous les pods qui utilisent la ComputeClass peuvent créer des VM imbriquées. Par exemple, vous pouvez installer Kata Containers sur ces nœuds en spécifiant un sélecteur de nœuds pour le libellé cloud.google.com/compute-class="nested-virt-class".
Activer dans les pools de nœuds Standard
Si vous ne souhaitez pas utiliser les ComputeClasses, vous pouvez activer manuellement la virtualisation imbriquée pour des pools de nœuds spécifiques dans les clusters Standard lors de l'une des opérations suivantes :
- Lorsque vous créez un cluster Standard, la virtualisation imbriquée est activée pour le pool de nœuds par défaut. Cette activation ne s'applique qu'au pool de nœuds par défaut. GKE n'active pas automatiquement la virtualisation imbriquée pour les pools de nœuds supplémentaires que vous créez ultérieurement.
- Lorsque vous créez un pool de nœuds dans un cluster standard existant.
Pour activer la virtualisation imbriquée dans les pools de nœuds créés manuellement, sélectionnez l'une des options suivantes :
Console
Activez la virtualisation imbriquée pour le pool de nœuds par défaut d'un nouveau cluster :
- Dans la console Google Cloud , accédez à la page Créer un cluster Kubernetes.
- Configurez les paramètres de base de votre cluster.
- Dans la section Pools de nœuds du menu de navigation, développez la section default-pool, puis cliquez sur Nœuds.
- Dans la section Configuration de la machine, sélectionnez un type de machine compatible (voir la ligne Virtualisation imbriquée).
- Après la section Réservations, cochez la case Activer la virtualisation imbriquée.
- Pour créer le cluster, cliquez sur Créer.
Activez la virtualisation imbriquée pour un nouveau pool de nœuds dans un cluster existant :
Dans la console Google Cloud , accédez à la page Clusters Kubernetes.
Cliquez sur le nom du cluster dans lequel vous souhaitez créer le pool de nœuds.
Configurez votre pool de nœuds.
Cliquez sur l'onglet Nœuds.
Dans l'en-tête de la section Pools de nœuds, cliquez sur add_box Créer un pool de nœuds géré par l'utilisateur.
Dans le menu de navigation, sélectionnez Nœuds.
Dans la section Configuration de la machine, sélectionnez une série de machines compatible avec la virtualisation imbriquée. Pour en savoir plus, filtrez le tableau comparatif des séries de machines sur la propriété Virtualisation imbriquée.
Cochez la case Activer la virtualisation imbriquée. Si cette case est désactivée, vérifiez que vous avez sélectionné une série de machines compatible avec la virtualisation imbriquée.
Cliquez sur Créer.
gcloud
Activez la virtualisation imbriquée pour le pool de nœuds par défaut d'un nouveau cluster :
gcloud container clusters create CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION --enable-nested-virtualization \ --node-labels=nested-virtualization=enabled \ --machine-type=MACHINE_TYPERemplacez les éléments suivants :
CLUSTER_NAME: nom du cluster.CONTROL_PLANE_LOCATION: région ou zone du plan de contrôle du cluster.MACHINE_TYPE: type de machine compatible avec la virtualisation imbriquée, par exemplen4-standard-8. Pour en savoir plus, filtrez le tableau comparatif des séries de machines sur la propriété Virtualisation imbriquée.
Activez la virtualisation imbriquée pour un nouveau pool de nœuds dans un cluster existant :
gcloud container node-pools create NODEPOOL_NAME \ --enable-nested-virtualization \ --node-labels=nested-virtualization=enabled \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --machine-type=MACHINE_TYPERemplacez les éléments suivants :
NODEPOOL_NAME: nom du pool de nœuds.CLUSTER_NAME: nom de votre cluster existant.CONTROL_PLANE_LOCATION: emplacement du plan de contrôle du cluster.MACHINE_TYPE: type de machine compatible avec la virtualisation imbriquée, par exemplen4-standard-8. Pour en savoir plus, filtrez le tableau comparatif des séries de machines sur la propriété Virtualisation imbriquée.
Après avoir créé le cluster ou le pool de nœuds, vous pouvez vérifier si la virtualisation imbriquée est activée.
Les nœuds de ces pools de nœuds comportent le libellé de nœud Kubernetes nested-virtualization=enabled, que vous pouvez utiliser pour planifier des pods qui créent des VM imbriquées.
Planifier un pod sur un nœud compatible avec la virtualisation imbriquée
Pour planifier un pod sur un nœud sur lequel la virtualisation imbriquée est activée, ajoutez le sélecteur de nœud suivant à la spécification :
nodeSelector:
nested-virtualization: enabled
En outre, pour que le pod se connecte à une VM imbriquée, vous devez le définir avec des privilèges en configurant securityContext.privileged:true.