Escalado de clústeres de usuarios

Para escalar sus cargas de trabajo en GKE en AWS, puede configurar sus AWSNodePools para que escalen automáticamente, o crear y eliminar manualmente AWSNodePools para escalar hacia arriba o hacia abajo.

Escalador automático de clúster

GKE en AWS implementa el escalador automático de clústeres de Kubernetes. Cuando la demanda de sus nodos es alta, el escalador automático de clústeres agrega nodos al grupo de nodos. Cuando la demanda es baja, el escalador automático de clústeres reduce su capacidad al tamaño mínimo que usted designe. Esto puede aumentar la disponibilidad de sus cargas de trabajo cuando la necesite, a la vez que controla los costos.

Descripción general

El escalador automático de clústeres ajusta automáticamente el número de nodos en un grupo de nodos según las demandas de sus cargas de trabajo. No necesita agregar o eliminar nodos manualmente ni sobreaprovisionar sus grupos de nodos. En su lugar, especifica un tamaño mínimo y máximo para el grupo de nodos, y el clúster escala automáticamente.

Si se eliminan o mueven recursos durante el escalado automático del clúster, las cargas de trabajo podrían experimentar interrupciones transitorias. Por ejemplo, si la carga de trabajo consta de una sola réplica, el pod de esa réplica podría reprogramarse en un nodo diferente si se elimina el nodo actual. Antes de habilitar el escalador automático de clústeres en AWSNodePool, diseñe sus cargas de trabajo para que toleren posibles interrupciones o asegúrese de que los pods críticos no se interrumpan.

Cómo funciona el escalador automático de clústeres

El escalador automático de clústeres funciona por grupo de nodos. Al crear un grupo de nodos, se especifican sus tamaños mínimo y máximo en el recurso de Kubernetes AWSNodePool .

Puede deshabilitar el escalador automático de clúster configurando spec.minNodeCount en igual valor que spec.maxNodeCount en sus AWSNodePools.

El escalador automático de clústeres aumenta o reduce automáticamente el tamaño del grupo de nodos, en función de las solicitudes de recursos (en lugar del uso real de recursos) de los pods que se ejecutan en los nodos de ese grupo. Comprueba periódicamente el estado de los pods y los nodos, y toma las medidas necesarias:

Si los pods no se pueden programar porque no hay suficientes nodos en el grupo, Cluster Autoscaler añade nodos hasta el tamaño máximo del grupo. Si los nodos están infrautilizados y todos los pods podrían programarse incluso con menos nodos en el grupo, Cluster Autoscaler elimina nodos hasta el tamaño mínimo. Si el nodo no se puede vaciar correctamente tras un tiempo de espera de 10 minutos, se cierra forzosamente. El período de gracia no es configurable.

Si sus pods han solicitado muy pocos recursos (por ejemplo, si los valores predeterminados son insuficientes), Cluster Autoscaler no corrige la situación. Puede garantizar que Cluster Autoscaler funcione con la mayor precisión posible creando solicitudes de recursos adecuadas para todas sus cargas de trabajo.

Criterios de funcionamiento

Cluster Autoscaler realiza las siguientes suposiciones al cambiar el tamaño de un grupo de nodos:

  • Todos los pods replicados pueden reiniciarse en otro nodo, lo que podría causar una breve interrupción. Si sus servicios no toleran interrupciones, no recomendamos usar Cluster Autoscaler.

  • Todos los nodos de un único grupo de nodos tienen el mismo conjunto de etiquetas.

  • Si tiene AWSNodePools con diferentes tipos de instancias, Cluster Autoscaler considera el costo relativo de lanzar nuevos nodos e intenta expandir el grupo de nodos menos costoso.

  • Las etiquetas agregadas manualmente tras la creación inicial del clúster o grupo de nodos no se rastrean. A los nodos creados por Cluster Autoscaler se les asignan las etiquetas especificadas con --node-labels al crear el grupo de nodos.

Cambiar el tamaño de un grupo de nodos

Un AWSNodePool incluye los campos minNodeCount y maxNodeCount . Estos campos indican un número mínimo y máximo de nodos de trabajo en el grupo. Puede editar estos valores antes o después de crear el AWSNodePool.

Antes de empezar

Aprovisione un clúster siguiendo las instrucciones de Crear un clúster de usuarios . Tenga disponible el archivo YAML (por ejemplo, cluster-0.yaml ) que crea el clúster.

Habilitación del escalado automático del grupo de nodos

  1. Desde su directorio anthos-aws , use anthos-gke para cambiar el contexto a su servicio de administración.

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. Para habilitar el escalador automático de clústeres, edite el manifiesto de su AWSNodePool. Edite el archivo cluster-0.yaml y busque la sección AWSNodePool. Cambie los valores de spec.minNodeCount y spec.maxNodeCount .

    El siguiente ejemplo mantiene el tamaño mínimo de este grupo de nodos en 3 nodos, pero permite que el escalador automático de clúster aumente su tamaño a 10 nodos.

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: cluster-0-pool-0
    spec:
      clusterName: cluster-0
      version: 1.25.5-gke.2100
      minNodeCount: 3
      maxNodeCount: 10
      ...
    
  3. A continuación, aplique YAML para cambiar el tamaño del grupo de nodos.

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl apply -f cluster-0.yaml
    
  4. El recurso AWSNodePool pasará al estado Resizing . Cuando finalice el escalado, pasará al estado Provisioned .

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl get AWSNodePools
    

    El resultado muestra que AWSNodePool está Resizing . Las operaciones de redimensionamiento tardan varios minutos en completarse.

    NAME               CLUSTER     STATE     AGE   VERSION
    cluster-0-pool-0   cluster-0   Resizing  3h    1.25.5-gke.2100
    

Creación manual de un nuevo AWSNodePool

También puede escalar su clúster creando nuevos AWSNodePools. Al crear un nuevo AWSNodePool, también puede aumentar o reducir el tamaño de las instancias .

  1. Puede recuperar el manifiesto de configuración de un AWSNodePool existente con kubectl get .

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get awsnodepool cluster-0-pool-0 -o yaml > new_nodepool.yaml
    
  2. Edite new_nodepool.yaml y elimine las secciones que no aparecen en el siguiente ejemplo. Guarde el archivo.

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: NODE_POOL_NAME
    spec:
      clusterName: AWSCLUSTER_NAME
      version:  CLUSTER_VERSION # latest version is 1.25.5-gke.2100
      region: AWS_REGION
      subnetID: AWS_SUBNET_ID
      minNodeCount: MINIMUM_NODE_COUNT
      maxNodeCount: MAXIMUM_NODE_COUNT
      maxPodsPerNode: MAXIMUM_PODS_PER_NODE_COUNT
      instanceType: AWS_NODE_TYPE
      keyName: KMS_KEY_PAIR_NAME
      iamInstanceProfile: NODE_IAM_PROFILE
      proxySecretName: PROXY_SECRET_NAME
      rootVolume:
        sizeGiB: ROOT_VOLUME_SIZE
        volumeType: VOLUME_TYPE # Optional
        iops: IOPS # Optional
        kmsKeyARN: NODE_VOLUME_KEY # Optional 
    
  3. Para crear un nuevo AWSNodePool, aplique el manifiesto a su clúster de administración.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f new_nodepool.yaml
    

¿Qué sigue?

Implementar un servicio respaldado por Ingress .

Para ver opciones adicionales, lea la documentación de referencia en AWSNodePool .