Define la posición de compactación para los nodos de GKE

Puedes controlar si tus nodos de Google Kubernetes Engine (GKE) se encuentran a nivel físico entre sí dentro de una zona usando una política de posición compacta.

Descripción general

Cuando creas grupos de nodos y cargas de trabajo en un clúster de GKE, puedes definir una política de posición de compactación que especifique que estos nodos o cargas de trabajo deben estar más cerca entre sí dentro de una zona. Tener nodos más cerca entre sí puede reducir la latencia de red entre ellos, lo que puede ser muy útil para cargas de trabajo por lotes con acoplamiento alto.

Usa la posición de compactación con GKE Autopilot

En los clústeres de Autopilot, puedes solicitar la colocación compacta para cargas de trabajo específicas agregando selectores de nodos a la especificación del Pod. Puedes usar la política de posición compacta predeterminada de Autopilot o una política de posición compacta existente de Compute Engine que use la serie de máquinas N2 o la serie de máquinas N2D.

Limitaciones

  • GKE aprovisiona cargas de trabajo en una posición compacta en la misma zona.
  • Disponible con las clases de procesamiento Balanced, Performance y Accelerator.
  • Disponible solo 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 ubicación de compactación está disponible para pods agrupados en hasta 1,500 nodos.

Habilita una política de posición de compactación

Si deseas habilitar la posición de compactación para GKE Autopilot, agrega un nodeSelector a la especificación del Pod con las siguientes claves:

  • cloud.google.com/gke-placement-group: Es el identificador que asignas al grupo de Pods que deben ejecutarse juntos, en el mismo grupo de ubicación compacta. Cada grupo de ubicaciones tiene un límite de 1,500 nodos. Te recomendamos limitar un grupo de ubicación solo a las cargas de trabajo que se beneficien de la agrupación y distribuir tus cargas de trabajo en grupos de ubicación separados cuando 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: De manera opcional, el nombre de una política de posición compacta de Compute Engine existente. Solo puedes especificar una política de posición compacta personalizada en la versión 1.31.1-gke.2010000 de GKE y versiones posteriores.

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

La siguiente especificación de Pod de ejemplo habilita la posición de compactación con una política de posición de compactación 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

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

Usa una política de posición de compactación personalizada sin grupos de posiciones

Para usar una política de ubicación compacta personalizada sin grupos de ubicación, debes agregar el selector de nodos cloud.google.com/placement-policy-name a la especificación del Pod o definir una clase de procesamiento personalizada con prioridad de ubicación.

Agrega el selector de nodos cloud.google.com/placement-policy-name a la especificación del Pod.

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

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

La siguiente especificación de Pod de ejemplo habilita la ubicación compacta con una política de ubicación compacta 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

Reemplaza PLACEMENT_POLICY_NAME por el nombre de una política de posición compacta de Compute Engine existente.

Usa una clase de procesamiento personalizada para definir la política de posición

Consulta la documentación sobre la clase de procesamiento personalizada con prioridad de posición para conocer los detalles.

En lugar de agregar 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 posición compacta configurando el campo placement en una definición de ComputeClass. Para obtener más información, consulta clase de procesamiento personalizada con prioridad de ubicación.

Usa la posición de compactación con GKE Standard

Limitaciones

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

  • Solo es compatible con los grupos de nodos nuevos. No puedes habilitar o inhabilitar la ubicación compacta en grupos de nodos existentes.
  • Está disponible solo para grupos de nodos que operan en una sola zona.
  • Disponible solo en los tipos de máquinas A2, A3, A4, C2, C2D, C3, C3D, C4, C4D, G2, H3, H4D, N2 y N2D. Sin embargo, para A3 Ultra y A4, recomendamos usar reservas segmentadas por bloques en lugar de la colocación compacta. Para obtener más detalles, consulta Reserva de capacidad.
  • Admite hasta 1,500 instancias de VM de Compute Engine en cada política. El grupo de nodos que exceda este límite en cualquier momento se rechazará durante la creación.
  • No se admite el suministro de una política de recursos personalizada con la marca placement-policy en las actualizaciones azul-verde.

Crea una política de posición de compactación

Para crear políticas de posiciones compactas, en Google Cloud CLI, especifica la opción placement-type=COMPACT durante la creación del grupo de nodos o el clúster. Con esta configuración, GKE intenta colocar nodos dentro de un grupo de nodos cerca el uno del otro.

Para usar una política de recursos existente en tu clúster, especifica la ubicación de tu política personalizada para la marca placement-policy durante la creación del clúster o del grupo de nodos. Esto permite la flexibilidad de usar posiciones reservadas, varios grupos de nodos con la misma política de posición y otras opciones de posición avanzadas. Sin embargo, también requiere más operaciones manuales que especificar la marca --placement-type=COMPACT. Por ejemplo, debes crear, borrar y mantener tus políticas de recursos personalizados. Asegúrate de que la cantidad máxima de instancias de VM se respete en todos los grupos de nodos que usan la política de recursos. Si se alcanza este límite mientras algunos de tus grupos de nodos no alcanzan su tamaño máximo, fallará la adición de más nodos.

Si no especificas las marcas placement-type y placement-policy, no hay requisitos de posición del nodo de forma predeterminada.

Crea una Política de Posición de compactación en un clúster nuevo

Cuando creas un clúster nuevo, puedes especificar una Política de Posición de compactación que se aplicará al grupo de nodos predeterminado. En cualquier grupo de nodos posterior que crees para el clúster, deberás especificar si deseas aplicar la posición de compactación.

Para crear un clúster nuevo en el que el grupo de nodos predeterminado tenga una Política de Posición de compactación aplicada, 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

Reemplaza lo siguiente:

  • CLUSTER_NAME: Es el nombre del clúster nuevo.
  • MACHINE_TYPE: Es el tipo de máquina que se usará para los nodos, que debe ser un tipo de máquina compatible que se enumera en las limitaciones del clúster estándar.
  • --placement-type COMPACT: Aplica la posición de compactación para los nodos en el grupo de nodos predeterminado.
  • MAX_UNAVAILABLE: Es la cantidad máxima de nodos que pueden no estar disponibles al mismo tiempo durante una actualización del grupo de nodos. En el caso de las posiciones compactas, recomendamos actualizaciones rápidas que no sean de aumento para optimizar la probabilidad de encontrar nodos ubicados durante las actualizaciones.

Crea una Política de Posición de compactación en un clúster existente

En un clúster existente, puedes crear un grupo de nodos que tenga aplicada una Política de Posición de compactación.

Para crear un grupo de nodos que tenga una Política de Posición de compactación aplicada, 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

Reemplaza lo siguiente:

  • NODEPOOL_NAME: Es el nombre de tu grupo de nodos nuevo.
  • MACHINE_TYPE: Es el tipo de máquina que se usará para los nodos, que debe ser un tipo de máquina compatible que se enumera en las limitaciones del clúster estándar.
  • CLUSTER_NAME: Es el nombre del clúster existente.
  • --placement-type COMPACT: Indica que se debe aplicar la posición de compactación para los nodos del grupo de nodos nuevo.
  • MAX_UNAVAILABLE: Es la cantidad máxima de nodos que pueden no estar disponibles al mismo tiempo durante una actualización del grupo de nodos. En el caso de las posiciones compactas, recomendamos actualizaciones rápidas que no sean de aumento para optimizar la probabilidad de encontrar nodos ubicados durante las actualizaciones.

Crea grupos de nodos con una política de posició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 Google Cloud del clúster:

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

    Reemplaza lo siguiente:

    • POLICY_NAME: Es el nombre de la política de recursos.
    • REGION: es la región del 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
    

    Reemplaza lo siguiente:

    • NODEPOOL_NAME: Es el nombre de tu grupo de nodos nuevo.
    • MACHINE_TYPE: Es el tipo de máquina que se usará para los nodos, que debe ser un tipo de máquina compatible que se encuentre en las limitaciones del clúster estándar.
    • CLUSTER_NAME: Es el nombre del clúster existente.
    • MAX_UNAVAILABLE: Es la cantidad máxima de nodos que pueden no estar disponibles al mismo tiempo durante una actualización del grupo de nodos. En el caso de las posiciones compactas, recomendamos actualizaciones rápidas que no sean de aumento para optimizar la probabilidad de encontrar nodos ubicados durante las actualizaciones.

Usa una reserva de Compute Engine con una política de posición compacta

Las reservas te ayudan a garantizar que el hardware esté disponible en una zona específica, lo que reduce el riesgo de falla en la creación del grupo de nodos debido a que el hardware es insuficiente.

  1. Crea una reserva que especifique una política de posició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
    

    Reemplaza lo siguiente:

    • RESERVATION_NAME: el nombre de tu reserva
    • MACHINE_COUNT: Es la cantidad de nodos reservados.
    • MACHINE_TYPE: Es el tipo de máquina que se usará para los nodos, que debe ser un tipo de máquina compatible que se encuentre en las limitaciones del clúster estándar.
    • POLICY_NAME: Es el nombre de la política de recursos.
    • ZONE: Es la zona en la que se creará la reserva.
  2. Para crear un grupo de nodos, especifica la política de posición compacta y la reserva que creaste 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
    

Reemplaza lo siguiente:

  • NODEPOOL_NAME: Es el nombre de tu grupo de nodos nuevo.
  • MACHINE_TYPE: Es el tipo de máquina que se usará para los nodos, que debe ser un tipo de máquina compatible que se enumera en las limitaciones del clúster estándar.
  • CLUSTER_NAME: Es el nombre del clúster existente.

Crea una carga de trabajo en los nodos que usan la posición de compactación

Para ejecutar cargas de trabajo en nodos dedicados que usan la posición de compactación, puedes usar varios mecanismos de Kubernetes, como asignar pods a nodos y evitar programar pods no deseados en un grupo de nodos..

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

  1. Agrega un taint a los nodos del grupo de nodos que tenga una Política de Posición de compactación:

    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. A continuación, se muestra 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, es posible que no sea posible crear un grupo de nodos grande mediante una Política de Posición de compactación. Para limitar estos grupos de nodos al tamaño necesario, debes considerar crear un grupo de nodos por carga de trabajo que requiera una posición de compactación.

Usa la ubicación compacta para el aprovisionamiento automático de nodos

Con el aprovisionamiento automático de nodos, GKE aprovisiona de forma automática los grupos de nodos según la demanda de recursos del clúster. Para obtener más información, consulta Usa el aprovisionamiento automático de nodos.

Para habilitar la ubicación compacta para el aprovisionamiento automático de nodos, agrega un nodeSelector a la especificación del 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

Reemplaza lo siguiente:

  • PLACEMENT_GROUP_IDENTIFIER: Es el identificador que asignas al grupo de Pods que deben ejecutarse juntos, en el mismo grupo de ubicación compacta.
  • MACHINE_FAMILY: Es el nombre de la familia de máquinas. Usa una de las familias de máquinas que admiten la ubicación compacta. Recomendamos que uses familias de máquinas C2 o C2D para las cargas de trabajo con requisitos de rendimiento de red y procesamiento.
  • PLACEMENT_POLICY_NAME: De manera opcional, el nombre de una política de posición compacta de Compute Engine existente. GKE usa la política de posición compacta especificada cuando el aprovisionamiento automático de nodos crea un grupo de nodos nuevo para agrupar tus Pods. Solo puedes especificar una política de posición compacta personalizada en la versión 1.31.1-gke.2010000 y versiones posteriores de GKE.

    Para obtener instrucciones, consulta la sección Crea una política de posición compacta en 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 ubicación compacta. Por ejemplo, si la especificación del Pod incluye nvidia.com/gpu y el clúster está configurado para usar GPU A100, no necesitas incluir la clave cloud.google.com/machine-family.

En el siguiente ejemplo, se incluye una especificación de Pod que define la solicitud nvidia.com/gpu, y el clúster está configurado para usar GPU 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

Si deseas obtener más información, consulta cómo configurar pods Para consumir GPU.

Optimiza el tamaño del grupo de ubicación

Debido a que GKE encuentra la mejor ubicación para implementaciones más pequeñas, te recomendamos que le indiques a GKE que evite ejecutar diferentes tipos de Pods en el mismo grupo de ubicaciones. Agrega una clave de tolerancia con la clave cloud.google.com/gke-placement-group y el identificador de ubicación compacta que definiste.

El siguiente ejemplo es una especificación de Pod que define una tolerancia de Pod con ubicació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.

¿Qué sigue?