Puedes crear instancias de máquina virtual (VM) dentro de otras VMs con la virtualización anidada. Compute Engine agrega instrucciones de virtualización a series de máquinas específicas para que esas instancias de VM puedan crear VMs anidadas. Debido a que los nodos de Google Kubernetes Engine (GKE) se ejecutan en VMs de Compute Engine, tus cargas de trabajo de GKE pueden crear y usar VMs anidadas. En este documento, se muestra cómo habilitar la virtualización anidada en GKE.
Cómo funcionan las VMs anidadas en GKE
Para usar VMs anidadas en GKE, debes habilitar la virtualización anidada para nodos o grupos de nodos específicos. Las extensiones de virtualización de CPU correspondientes, como la tecnología de virtualización Intel (VT-x) o la virtualización AMD (AMD-V) están habilitadas en las VMs subyacentes. Luego, puedes activar la creación de VMs anidadas desde Pods con software como QEMU o Kata Containers.
En GKE, las VMs anidadas son útiles para los siguientes casos de uso:
- Ejecuta código no confiable, como agentes de IA, en VMs ligeras, como Kata Containers. Para obtener más información sobre este caso de uso, consulta Usa Kata Containers de código abierto con Agent Sandbox en GKE.
- Agrega una capa de aislamiento asistido por hardware para cargas de trabajo de varios usuarios.
- Ejecuta software especializado, como emuladores de Android, en la nube.
Implicaciones de rendimiento reducido
Con la virtualización anidada asistida por hardware, las cargas de trabajo que se ejecutan en las VMs anidadas pueden experimentar un rendimiento reducido en comparación con las configuraciones de virtualización no anidadas. La cantidad del impacto en el rendimiento depende del perfil de carga de trabajo específico, incluidas las características de uso de E/S y memoria.
Además, crear VMs anidadas en las VMs subyacentes de los nodos de GKE puede afectar el rendimiento de otras cargas de trabajo que se ejecutan en esos nodos.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea,
instala y, luego,
inicializa the
gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando
gcloud components updatepara obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos de este documento.
- Asegúrate de que la política de la organización admita la creación de VMs anidadas.
- Revisa las restricciones de las VMs anidadas.
Requisitos y limitaciones
Ten en cuenta la siguiente información antes de habilitar la virtualización anidada con GKE y permitir que tus Pods creen VMs anidadas:
- Solo puedes configurar grupos de nodos con VMs anidadas en una cantidad limitada de series de máquinas de VM. Consulta la fila Nested virtualization de la comparación de series de máquinas para confirmar las series de máquinas compatibles.
- La virtualización anidada no es compatible con los grupos de nodos de Windows Server.
- No puedes usar la virtualización anidada si se aplica la restricción Inhabilitar la virtualización anidada de VMs para la política de la organización.
- Debes configurar
securityContext.privileged:truepara que los Pods interactúen con las VMs anidadas. Si usas GKE Autopilot, no puedes crear nodos de Pods con privilegios, excepto en los siguientes casos:
- Los Pods son propiedad de GKE, un socio de GKE, o un proyecto de código abierto aprobado.
- Los Pods son de tu propiedad y se incluyen en una WorkloadAllowlist.
No puedes habilitar la virtualización anidada en grupos de nodos existentes.
La virtualización anidada es una configuración inmutable en GKE.
Si usas ComputeClasses para habilitar la virtualización anidada, tu clúster debe ejecutar la versión 1.37.0-gke.4713000 de GKE o una posterior.
Habilitar la virtualización anidada
En las siguientes secciones, se muestra cómo habilitar la virtualización anidada en GKE de las siguientes maneras:
- Usa ComputeClasses: En el modo Autopilot o Standard, habilita la virtualización anidada para configuraciones de nodos específicas en una ComputeClass. Con este método, puedes habilitar la virtualización anidada en grupos de nodos creados automáticamente y realizar una conmutación por error en varias configuraciones de nodos priorizadas.
- Usa la API de GKE: En el modo Standard, usa un cliente como la Google Cloud consola de, gcloud CLI o Terraform para crear grupos de nodos específicos que usen la virtualización anidada.
Habilita con ComputeClasses
Puedes usar una ComputeClass para habilitar la virtualización anidada para grupos de nodos específicos en el modo Autopilot o Standard. ComputeClasses es el único método con el que puedes habilitar la virtualización anidada para grupos de nodos creados automáticamente y nodos de Autopilot. Para implementar una ComputeClass de ejemplo que habilite la virtualización anidada, sigue estos pasos:
Guarda el siguiente manifiesto de ComputeClass como un archivo llamado
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: DoNotScaleUpEsta ComputeClass de ejemplo tiene las siguientes propiedades:
- Prioriza las instancias C3 en las VMs Spot, vuelve a las instancias C4 a pedido y, luego, a las instancias C4D en las VMs Spot.
- Habilita la virtualización anidada para todas las instancias.
- Impide que GKE escale verticalmente la serie de máquinas predeterminada del clúster si no hay instancias priorizadas disponibles.
- Usa la imagen de nodo Container-Optimized OS para todos los nodos.
- Habilita la creación automática de grupos de nodos para que GKE pueda crear grupos de nodos nuevos para ejecutar Pods cuando sea necesario.
Como alternativa, puedes habilitar la virtualización anidada para todas las reglas de prioridad en tu ComputeClass si especificas el
enableNestedVirtualization: truecampo en elspec.priorityDefaultscampo.Crea la ComputeClass:
kubectl apply -f nested-virt-class.yamlCuando habilitas la virtualización anidada en una ComputeClass, GKE verifica la serie de máquinas especificada para la compatibilidad con las VMs anidadas. Si una serie de máquinas en una regla de prioridad que habilita la virtualización anidada no es compatible, GKE te advertirá. Sin embargo, es posible que esta verificación no encuentre todas las configuraciones incompatibles.
Para activar la creación de grupos de nodos, crea un Pod que seleccione la ComputeClass:
Guarda el siguiente manifiesto de Pod como un archivo llamado
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.9Crea el Pod:
kubectl apply -f nested-virt-example-pod.yaml
Los nodos que crea GKE para esta ComputeClass tienen habilitada la virtualización anidada. Puedes ejecutar aplicaciones que creen VMs anidadas en estos nodos. Cualquier Pod que use la ComputeClass puede crear VMs anidadas. Por ejemplo,
puedes instalar Kata Containers en estos nodos si especificas un
selector de nodos
para la etiqueta cloud.google.com/compute-class="nested-virt-class".
Habilita en grupos de nodos de Standard
Si no quieres usar ComputeClasses, puedes habilitar de forma manual la virtualización anidada para grupos de nodos nuevos específicos en clústeres de Standard durante cualquiera de las siguientes operaciones:
- Cuando creas un clúster de Standard nuevo, que habilita la virtualización anidada para el grupo de nodos predeterminado. Esta habilitación solo se aplica al grupo de nodos predeterminado. GKE no habilita automáticamente la virtualización anidada para los grupos de nodos adicionales que crees más adelante.
- Cuando creas un grupo de nodos nuevo en un clúster de Standard existente.
Para habilitar la virtualización anidada en grupos de nodos creados de forma manual, selecciona una de las siguientes opciones:
Console
Habilita la virtualización anidada para el grupo de nodos predeterminado de un clúster nuevo:
- En la Google Cloud consola de, accede a la página Crear un clúster de Kubernetes.
- Configura los parámetros básicos de tu clúster.
- En el menú de navegación, en la sección Grupos de nodos, expande la sección default-pool y haz clic en Nodos.
- En la sección Configuración de la máquina, elige un tipo de máquina compatible (consulta la fila de virtualización anidada ).
- Después de la sección Reservas, selecciona la casilla de verificación Habilitar la virtualización anidada.
- Para crear el clúster, haz clic en Crear.
Habilita la virtualización anidada para un grupo de nodos nuevo en un clúster existente:
En la Google Cloud consola de, accede a la página Clústeres de Kubernetes.
Haz clic en el nombre del clúster en el que deseas crear el grupo de nodos nuevo.
Configura tu grupo de nodos.
Haz clic en la pestaña Nodos.
En el encabezado de la sección Grupos de nodos, haz clic en add_box Crear grupo de nodos administrado por el usuario.
En el menú de navegación, selecciona Nodos.
En la sección Configuración de la máquina, elige una serie de máquinas que admita la virtualización anidada. Para obtener más información, filtra la tabla de comparación de series de máquinas para la propiedad Virtualización anidada.
Selecciona la casilla de verificación Habilitar la virtualización anidada. Si esta casilla de verificación está inhabilitada, verifica que hayas seleccionado una serie de máquinas que admita la virtualización anidada.
Haz clic en Crear.
gcloud
Habilita la virtualización anidada para el grupo de nodos predeterminado de un clúster nuevo:
gcloud container clusters create CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION --enable-nested-virtualization \ --node-labels=nested-virtualization=enabled \ --machine-type=MACHINE_TYPEReemplaza lo siguiente:
CLUSTER_NAME: un nombre para el clúster.CONTROL_PLANE_LOCATION: la región o zona del plano de control del clúster.MACHINE_TYPE: un tipo de máquina que admite la virtualización anidada, comon4-standard-8. Para obtener más información, filtra la tabla de comparación de series de máquinas para la propiedad Virtualización anidada.
Habilita la virtualización anidada para un grupo de nodos nuevo en un clúster existente:
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_TYPEReemplaza lo siguiente:
NODEPOOL_NAME: un nombre para el grupo de nodos.CLUSTER_NAME: Es el nombre del clúster existente.CONTROL_PLANE_LOCATION: la ubicación del plano de control del clúster.MACHINE_TYPE: un tipo de máquina que admite la virtualización anidada, comon4-standard-8. Para obtener más información, filtra la tabla de comparación de series de máquinas para la propiedad Virtualización anidada.
Después de crear el clúster o el grupo de nodos, puedes
verificar si la virtualización anidada está habilitada.
Los nodos de estos grupos de nodos tienen la etiqueta de nodo de nested-virtualization=enabled
Kubernetes, que puedes usar para programar Pods que
crean VMs anidadas.
Programa un Pod en un nodo que admita la virtualización anidada
Para programar un Pod en un nodo con la virtualización anidada habilitada, agrega el siguiente selector de nodos a la especificación:
nodeSelector:
nested-virtualization: enabled
Además, para que el Pod se conecte con una VM anidada, debes configurar el Pod con
privilegios a través de la configuración de securityContext.privileged:true.