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 Intel Virtualization Technology (VT-x) o AMD Virtualization (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 los contenedores de Kata. Para obtener más información sobre este caso de uso, consulta Usa Kata Containers de código abierto con GKE Agent Sandbox.
  • Agregar una capa de aislamiento asistido por hardware para cargas de trabajo multiusuario
  • 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 dependerá 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 gcloud CLI. Si ya instalaste la 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 que se indican en 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 un parámetro de 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 parámetros de configuración de nodos específicos en una ComputeClass. Con este método, puedes habilitar la virtualización anidada en grupos de nodos creados automáticamente y recurrir a varias configuraciones de nodos priorizadas.
  • Usa la API de GKE: En el modo estándar, usa un cliente como la Google Cloud consola, gcloud CLI o Terraform para crear grupos de nodos específicos que usen la virtualización anidada.

Habilitación con ComputeClasses

Puedes usar un ComputeClass para habilitar la virtualización anidada para grupos específicos de nodos en modo Autopilot o Standard. Las ComputeClasses son el único método con el que puedes habilitar la virtualización anidada para los grupos de nodos creados automáticamente y los nodos de Autopilot. Para implementar un ejemplo de ComputeClass 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
    

    Este ejemplo de ComputeClass tiene las siguientes propiedades:

    • Prioriza las instancias C3 en las VMs Spot, recurre a las instancias C4 a pedido y, luego, recurre a las instancias C4D en las VMs Spot.
    • Habilita la virtualización anidada para todas las instancias.
    • Evita que GKE escale verticalmente la serie de máquinas predeterminada del clúster si no hay instancias con prioridad disponibles.
    • Usa la imagen de nodo de 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 especificando el campo enableNestedVirtualization: true en el campo spec.priorityDefaults.

  2. Crea el objeto ComputeClass:

    kubectl apply -f nested-virt-class.yaml
    

    Cuando habilitas la virtualización anidada en una ComputeClass, GKE verifica si la serie de máquinas especificada es compatible 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 del grupo de nodos, crea un Pod que seleccione ComputeClass:

    1. Guarda el siguiente manifiesto del 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 GKE crea para esta ComputeClass tienen habilitada la virtualización anidada. Puedes ejecutar aplicaciones que crean VMs anidadas en estos nodos. Cualquier Pod que use ComputeClass puede crear VMs anidadas. Por ejemplo, podrías instalar Kata Containers en estos nodos especificando 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 manualmente la virtualización anidada para grupos de nodos nuevos específicos en clústeres estándar 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 estándar 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 consola de Google Cloud , ve a la página Crea un clúster de Kubernetes.

      Ir a Crea 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 Virtualización anidada).
    5. Después de la sección Reservations, selecciona la casilla de verificación Habilitar 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 consola de Google Cloud , 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 nuevo grupo de nodos.

    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 según 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: Es un nombre para el clúster.
    • CONTROL_PLANE_LOCATION: Es 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 según 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: Es el nombre del grupo de nodos.
    • CLUSTER_NAME: Es el nombre del clúster existente.
    • CONTROL_PLANE_LOCATION: Es 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 según 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 Kubernetes nested-virtualization=enabled, 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?