Usa VMs anidadas con clústeres de GKE

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 update para 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.

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:true para 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:

  • 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:

  1. 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: DoNotScaleUp
    

    Esta 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: true campo en el spec.priorityDefaults campo.

  2. Crea la ComputeClass:

    kubectl apply -f nested-virt-class.yaml
    

    Cuando 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.

  3. Para activar la creación de grupos de nodos, crea un Pod que seleccione la ComputeClass:

    1. 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.9
      
    2. Crea 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:

    1. En la Google Cloud consola de, accede a la página Crear un clúster de Kubernetes.

      Ir a Crear un clúster de Kubernetes

    2. Configura los parámetros básicos de tu clúster.
    3. En el menú de navegación, en la sección Grupos de nodos, expande la sección default-pool y haz clic en Nodos.
    4. En la sección Configuración de la máquina, elige un tipo de máquina compatible (consulta la fila de virtualización anidada ).
    5. Después de la sección Reservas, selecciona la casilla de verificación Habilitar la virtualización anidada.
    6. 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:

    1. En la Google Cloud consola de, accede a la página Clústeres de Kubernetes.

      Ir a Clústeres de Kubernetes

    2. Haz clic en el nombre del clúster en el que deseas crear el grupo de nodos nuevo.

    3. Configura tu grupo de nodos.

    4. Haz clic en la pestaña Nodos.

    5. En el encabezado de la sección Grupos de nodos, haz clic en Crear grupo de nodos administrado por el usuario.

    6. En el menú de navegación, selecciona Nodos.

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

    8. 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.

    9. 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_TYPE
    

    Reemplaza 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, como n4-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_TYPE
    

    Reemplaza 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, como n4-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.

¿Qué sigue?