Definir la colocación compacta de nodos de GKE


Puedes controlar si tus nodos de Google Kubernetes Engine (GKE) están ubicados físicamente entre sí en una zona mediante una política de colocación compacta.

Información general

Cuando creas grupos de nodos y cargas de trabajo en un clúster de GKE, puedes definir una política de colocación compacta, que especifica que estos nodos o cargas de trabajo deben colocarse en una proximidad física más cercana entre sí dentro de una zona. Si los nodos están más cerca entre sí, se puede reducir la latencia de la red entre ellos, lo que puede ser especialmente útil para las cargas de trabajo por lotes con un alto acoplamiento.

Usar la colocación compacta con Autopilot de GKE

En los clústeres Autopilot, puedes solicitar una colocación compacta para cargas de trabajo específicas añadiendo selectores de nodos a la especificación de tu pod. Puedes usar la política de emplazamiento compacta predeterminada de Autopilot o una política de emplazamiento compacta de Compute Engine que utilice la serie de máquinas N2 o la serie de máquinas N2D.

Limitaciones

  • GKE aprovisiona cargas de trabajo en una ubicación compacta de la misma zona.
  • Disponible con las clases de computación Balanced, Performance y Accelerator.
  • Solo está disponible en los tipos de máquinas C2, C2D, C3, C3D, C4D (1.33.0-gke.1439000 o posterior), H3, H4D, N2 y N2D.
  • Solo está disponible con las GPUs A100, L4 y H100.
  • La colocación compacta está disponible para los pods agrupados en hasta 1500 nodos.

Habilitar una política de colocación compacta

Para habilitar la colocación compacta en Autopilot de GKE, añade un nodeSelector a la especificación de Pod con las siguientes claves:

  • cloud.google.com/gke-placement-group: el identificador que asignas al grupo de pods que deben ejecutarse juntos en el mismo grupo de emplazamiento compacto. Cada grupo de emplazamientos tiene un límite de 1500 nodos. Te recomendamos que limites un grupo de colocación solo a las cargas de trabajo que se beneficien de la agrupación y que distribuyas tus cargas de trabajo en grupos de colocación independientes siempre que sea posible.

  • Una de las siguientes claves para definir el tipo de recurso:

    • cloud.google.com/compute-class: "Balanced"
    • cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
  • cloud.google.com/placement-policy-name: opcionalmente, el nombre de una política de colocación compacta de Compute Engine. Solo puedes especificar una política de colocación compacta personalizada en GKE 1.31.1-gke.2010000 y versiones posteriores.

    Para obtener instrucciones, consulta la sección Crear una política de colocación compacta de esta página.

La siguiente especificación de Pod habilita la colocación compacta con una política de colocación compacta personalizada:

apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
  nodeSelector:
    cloud.google.com/gke-placement-group: "placement-group-1"
    cloud.google.com/compute-class: "Balanced"
    cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME

Sustituye PLACEMENT_POLICY_NAME por el nombre de una política de colocación compacta de Compute Engine. Para usar la política de emplazamiento compacta predeterminada de Autopilot, omite la línea cloud.google.com/placement-policy-name.

Usar una política de colocación compacta personalizada sin grupos de colocación

Para usar una política de colocación compacta personalizada sin grupos de colocación, debes añadir el selector de nodos cloud.google.com/placement-policy-name a la especificación de tu pod o definir una clase de computación personalizada con prioridad de colocación.

Añade el cloud.google.com/placement-policy-name selector de nodos a la especificación de tu pod

Este enfoque puede ser útil si quieres usar un JobSet para programar cada trabajo por separado, pero también quieres usar una política de colocación compacta personalizada para colocar los nodos que ejecutan el mismo trabajo más cerca unos de otros.

Como JobSet no admite la especificación de selectores de nodos diferentes para cada trabajo, no puedes usar JobSet con grupos de colocación en este caso. Sin embargo, puedes usar la compatibilidad integrada de JobSet con las topologías exclusivas para conseguir el mismo efecto.

La siguiente especificación de pod habilita el emplazamiento compacto con una política de emplazamiento compacto personalizada para una carga de trabajo de JobSet:

apiVersion: jobset.x-k8s.io/v1alpha2
kind: JobSet
metadata:
  name: my-jobset
  annotations:
    alpha.jobset.sigs.k8s.io/exclusive-topology: cloud.google.com/gke-nodepool
spec:
 replicatedJobs:
    - name: my-job
      template:
        spec:
          # lines omitted for clarity
          template:
            spec:
              nodeSelector:
                cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
                cloud.google.com/machine-family: "n2"
              # lines omitted for clarity

Sustituye PLACEMENT_POLICY_NAME por el nombre de una política de colocación compacta de Compute Engine.

Usar una clase de computación personalizada para definir la política de colocación

Consulta la documentación sobre clases de cálculo personalizadas con prioridad de colocación para ver los detalles.

En lugar de añadir un nodeSelector con el nombre de la política directamente a la especificación de tu carga de trabajo, puedes aplicar una política de colocación compacta configurando el campo placement en una definición de ComputeClass. Para obtener más información, consulta Clase de computación personalizada con prioridad de colocación.

Usar la colocación compacta con GKE Standard

Limitaciones

La colocación compacta en los grupos de nodos estándar de GKE tiene las siguientes limitaciones:

  • Solo se admite en los nuevos grupos de nodos. No puedes habilitar ni inhabilitar la colocación compacta en grupos de nodos que ya tengas.
  • Solo está disponible para grupos de nodos que operan en una sola zona.
  • Solo está disponible en los tipos de máquinas A2, A3, A4, C2, C2D, C3, C3D, C4, C4D, G2, H3, H4D, N2 y N2D. Sin embargo, en el caso de A3 Ultra y A4, le recomendamos que utilice reservas orientadas a bloques en lugar de la colocación compacta. Para obtener más información, consulta Reservar capacidad.
  • Admite hasta 1500 instancias de VM de Compute Engine por política. Cualquier grupo de nodos que supere este límite en cualquier momento se rechazará durante la creación.
  • No se admite el uso de una política de recursos personalizada con la marca placement-policy en las actualizaciones azul-verde.

Crear una política de colocación compacta

Para crear políticas de colocación compactas, en la CLI de Google Cloud, especifica la opción placement-type=COMPACT al crear el grupo de nodos o el clúster. Con este ajuste, GKE intenta colocar los nodos de un grupo de nodos más cerca unos de otros.

Para usar una política de recursos en tu clúster, especifica la ubicación de tu política personalizada en la marca placement-policy durante la creación del grupo de nodos o del clúster. Esto permite usar emplazamientos reservados, varios grupos de nodos con la misma política de emplazamiento y otras opciones de emplazamiento avanzadas. Sin embargo, también requiere más operaciones manuales que especificar la marca --placement-type=COMPACT. Por ejemplo, debe crear, eliminar y mantener sus políticas de recursos personalizadas. Asegúrate de que se respete el número máximo de instancias de VM en todos los grupos de nodos que usen la política de recursos. Si se alcanza este límite mientras algunos de tus grupos de nodos no han alcanzado su tamaño máximo, no podrás añadir más nodos.

Si no especifica las marcas placement-type y placement-policy, de forma predeterminada no habrá ningún requisito sobre la colocación de los nodos.

Crear una política de emplazamiento compacta en un clúster nuevo

Cuando creas un clúster, puedes especificar una política de colocación compacta que se aplicará al grupo de nodos predeterminado. En los grupos de nodos que crees posteriormente para el clúster, tendrás que especificar si quieres aplicar la colocación compacta.

Para crear un clúster en el que se aplique una política de colocación compacta al grupo de nodos predeterminado, usa el siguiente comando:

gcloud container clusters create CLUSTER_NAME \
    --machine-type MACHINE_TYPE \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del nuevo clúster.
  • MACHINE_TYPE: el tipo de máquina que se va a usar en los nodos, que debe ser un tipo de máquina admitido que se incluya en las limitaciones de los clústeres estándar.
  • --placement-type COMPACT: aplica la colocación compacta a los nodos del grupo de nodos predeterminado.
  • MAX_UNAVAILABLE: número máximo de nodos que pueden no estar disponibles al mismo tiempo durante una actualización del grupo de nodos. Para una colocación compacta, recomendamos actualizaciones rápidas sin picos para optimizar la probabilidad de encontrar nodos colocados durante las actualizaciones.

Crear una política de colocación compacta en un clúster

En un clúster, puedes crear un grupo de nodos al que se le haya aplicado una política de colocación compacta.

Para crear un grupo de nodos al que se le haya aplicado una política de emplazamiento compacto, usa el siguiente comando:

gcloud container node-pools create NODEPOOL_NAME \
    --machine-type MACHINE_TYPE \
    --cluster CLUSTER_NAME \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

Haz los cambios siguientes:

  • NODEPOOL_NAME: el nombre del nuevo grupo de nodos.
  • MACHINE_TYPE: el tipo de máquina que se va a usar en los nodos, que debe ser un tipo de máquina admitido que se incluya en las limitaciones de los clústeres estándar.
  • CLUSTER_NAME: el nombre del clúster.
  • --placement-type COMPACT: indica que se debe aplicar la colocación compacta a los nodos del nuevo grupo de nodos.
  • MAX_UNAVAILABLE: número máximo de nodos que pueden no estar disponibles al mismo tiempo durante una actualización del grupo de nodos. Para una colocación compacta, recomendamos actualizaciones rápidas sin picos para optimizar la probabilidad de encontrar nodos colocados durante las actualizaciones.

Crear grupos de nodos con una política de colocación personalizada compartida

Puedes crear manualmente una política de recursos y usarla en varios grupos de nodos.

  1. Crea la política de recursos en la región del clúster: Google Cloud

    gcloud compute resource-policies create group-placement POLICY_NAME \
        --region REGION \
        --collocation collocated
    

    Haz los cambios siguientes:

    • POLICY_NAME: nombre de la política de recursos.
    • REGION: la región de tu clúster.
  2. Crea un grupo de nodos con la política de recursos personalizada:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

    Haz los cambios siguientes:

    • NODEPOOL_NAME: el nombre del nuevo grupo de nodos.
    • MACHINE_TYPE: el tipo de máquina que se va a usar en los nodos, que debe ser un tipo de máquina admitido que se indique en las limitaciones de los clústeres estándar.
    • CLUSTER_NAME: el nombre del clúster.
    • MAX_UNAVAILABLE: número máximo de nodos que pueden no estar disponibles al mismo tiempo durante una actualización del grupo de nodos. Para una colocación compacta, recomendamos actualizaciones rápidas sin picos para optimizar la probabilidad de encontrar nodos colocados durante las actualizaciones.

Usar una reserva de Compute Engine con una política de colocación compacta

Las reservas te ayudan a garantizar que el hardware esté disponible en una zona específica, lo que reduce el riesgo de que se produzca un error al crear un pool de nodos debido a que no hay suficiente hardware.

  1. Crea una reserva que especifique una política de colocación compacta:

    gcloud compute reservations create RESERVATION_NAME \
        --vm-count MACHINE_COUNT \
        --machine-type MACHINE_TYPE \
        --resource-policies policy=POLICY_NAME \
        --zone ZONE \
        --require-specific-reservation
    

    Haz los cambios siguientes:

    • RESERVATION_NAME: el nombre de tu reserva.
    • MACHINE_COUNT: número de nodos reservados.
    • MACHINE_TYPE: el tipo de máquina que se va a usar en los nodos, que debe ser un tipo de máquina admitido que se indique en las limitaciones de los clústeres estándar.
    • POLICY_NAME: nombre de la política de recursos.
    • ZONE: la zona en la que quieres crear la reserva.
  2. Crea un grupo de nodos especificando tanto la política de colocación compacta como la reserva que has creado en el paso anterior:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --reservation-affinity specific \
        --reservation RESERVATION_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

Haz los cambios siguientes:

  • NODEPOOL_NAME: el nombre del nuevo grupo de nodos.
  • MACHINE_TYPE: el tipo de máquina que se va a usar en los nodos, que debe ser un tipo de máquina admitido que se incluya en las limitaciones de los clústeres estándar.
  • CLUSTER_NAME: el nombre del clúster.

Crear una carga de trabajo en nodos que usen emplazamiento compacto

Para ejecutar cargas de trabajo en nodos dedicados que usen la colocación compacta, puedes usar varios mecanismos de Kubernetes, como asignar pods a nodos y evitar que se programen pods no deseados en un grupo de nodos.

En el siguiente ejemplo, añadimos un taint a los nodos dedicados y añadimos una tolerancia y una afinidad correspondientes a los pods.

  1. Añade un taint a los nodos del grupo de nodos que tenga una política de colocación compacta:

    kubectl taint nodes -l cloud.google.com/gke-nodepool=NODEPOOL_NAME dedicated-pool=NODEPOOL_NAME:NoSchedule
    
  2. En la definición de la carga de trabajo, especifica la tolerancia necesaria y una afinidad de nodo. Aquí tienes un ejemplo con un solo Pod:

    apiVersion: v1
    kind: Pod
    metadata:
      ...
    spec:
      ...
      tolerations:
      - key: dedicated-pool
        operator: "Equal"
        value: "NODEPOOL_NAME"
        effect: "NoSchedule"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: dedicated-pool
                operator: In
                values:
                - NODEPOOL_NAME
    

En algunas ubicaciones, puede que no sea posible crear un grupo de nodos grande con una política de colocación compacta. Para limitar el tamaño de estos grupos de nodos a lo necesario, te recomendamos que crees un grupo de nodos por cada carga de trabajo que requiera una colocación compacta.

Usar el emplazamiento compacto para el aprovisionamiento automático de nodos

Con el aprovisionamiento automático de nodos, GKE aprovisiona automáticamente grupos de nodos en función de la demanda de recursos del clúster. Para obtener más información, consulta Usar el aprovisionamiento automático de nodos.

Para habilitar la colocación compacta en el aprovisionamiento automático de nodos, añade un nodeSelector a la especificación de Pod, como en el siguiente ejemplo:

apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
  nodeSelector:
    cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
    cloud.google.com/machine-family: MACHINE_FAMILY
    cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
# lines omitted for clarity

Haz los cambios siguientes:

  • PLACEMENT_GROUP_IDENTIFIER: el identificador que asignas al grupo de pods que deben ejecutarse juntos en el mismo grupo de colocación compacto.
  • MACHINE_FAMILY: el nombre de la familia de máquinas. Usa una de las familias de máquinas que admiten la colocación compacta. Te recomendamos que uses las familias de máquinas C2 o C2D para cargas de trabajo que requieran un buen rendimiento de computación y de red.
  • PLACEMENT_POLICY_NAME: opcionalmente, el nombre de una política de colocación compacta de Compute Engine. GKE usa la política de colocación compacta especificada cuando el aprovisionamiento automático de nodos crea un grupo de nodos para agrupar tus pods. Solo puedes especificar una política de colocación compacta personalizada en GKE 1.31.1-gke.2010000 y versiones posteriores.

    Para obtener instrucciones, consulta la sección Crear una política de colocación compacta de esta página.

Puedes omitir la clave cloud.google.com/machine-family si la configuración del pod ya define un tipo de máquina compatible con la colocación compacta. Por ejemplo, si la especificación de Pod incluye nvidia.com/gpu y el clúster está configurado para usar GPUs A100, no es necesario que incluya la clave cloud.google.com/machine-family.

En el siguiente ejemplo se muestra una especificación de Pod que define una nvidia.com/gpu solicitud y el clúster está configurado para usar GPUs A100. Este pod spec no incluye la clave cloud.google.com/machine-family:

  apiVersion: v1
  kind: Pod
  metadata:
    ...
  spec:
    ...
    nodeSelector:
      cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
      cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
    resources:
      limits:
        nvidia.com/gpu: 2

Para obtener más información, consulta cómo configurar pods para que usen GPUs.

Optimizar el tamaño de los grupos de emplazamientos

Como GKE encuentra la mejor ubicación para las implementaciones más pequeñas, te recomendamos que indiques a GKE que evite ejecutar diferentes tipos de pods en el mismo grupo de emplazamiento. Añade una clave de tolerancia con la clave cloud.google.com/gke-placement-group y el identificador de colocación compacto que hayas definido.

El siguiente ejemplo es una especificación de Pod que define una tolerancia de Pod con una colocación compacta:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
  tolerations:
  - key: cloud.google.com/gke-placement-group
    operator: "Equal"
    value: PLACEMENT_GROUP_IDENTIFIER
    effect: "NoSchedule"

Para obtener más información sobre el aprovisionamiento automático de nodos con tolerancia de pods, consulta Separación de cargas de trabajo.

Siguientes pasos