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

Limitaciones

  • GKE aprovisiona cargas de trabajo en una ubicación de compactación en la misma zona.
  • La ubicación de compactación está disponible en las GPU Balanced y A100. Para obtener más información, consulta Tipos de máquinas.
  • La ubicación de compactación está disponible para pods agrupados en hasta 150 nodos.
  • No se admite la migración en vivo para 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.

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

El siguiente ejemplo es un extracto de una especificación de pod que habilita la posición de compactación. El identificador del grupo de ubicaciones es placement-group-1 y la clase de procesamiento es Balanced:

  nodeSelector:
    cloud.google.com/gke-placement-group: "placement-group-1"
    cloud.google.com/compute-class: "Balanced"

Cada grupo de ubicaciones tiene un límite de 150 nodos. Te recomendamos limitar un grupo de ubicaciones solo a las cargas de trabajo que se beneficien de la agrupación y distribuir tus cargas de trabajo en grupos de ubicaciones separados cuando sea posible.

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:

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 el clúster, especifica la ubicación de la política personalizada para la marca placement-policy durante el grupo de nodos o la creación del clúster. Esto permite la flexibilidad de usar posiciones reservadas, varios grupos de nodos con la misma política de posición y otras opciones de posiciones 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 personalizadas. 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, la adición de más nodos fallará.

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 C2 (por ejemplo, c2-standard-4).
  • --placement-type COMPACT: Aplica la posición de compactación para los nodos en el grupo de nodos predeterminado.
  • MAX_UNAVAILABLE: 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 C2 (por ejemplo, c2-standard-4).
  • 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: 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 una política de recursos de forma manual y usarla en varios grupos de nodos.

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

    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 C2 (por ejemplo, c2-standard-4).
    • CLUSTER_NAME: Es el nombre del clúster existente.
    • MAX_UNAVAILABLE: 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 C2. Por ejemplo, para usar un tipo predefinido de máquina C2 con 4 CPU virtuales, especifica c2-standard-4.
    • 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 C2 (por ejemplo, c2-standard-4).
  • 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

A partir de la versión 1.25 de GKE, el aprovisionamiento automático de nodos admite una política de ubicación compacta. 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.

A fin de habilitar la ubicación compacta para el aprovisionamiento automático de nodos, 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.

  • cloud.google.com/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.

El siguiente ejemplo es una especificación de Pod que habilita la ubicación compacta:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
  nodeSelector:
    cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
    cloud.google.com/machine-family: MACHINE_FAMILY

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 ejemplo siguiente, 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?