Escalar clústeres de usuarios

Para escalar tus cargas de trabajo en GKE en AWS, puedes configurar tus AWSNodePools para que se escalen horizontalmente de forma automática o crear y eliminar AWSNodePools manualmente para escalar verticalmente.

Herramienta de adaptación dinámica de clústeres

GKE en AWS implementa la herramienta de adaptación dinámica de clústeres de Kubernetes. Cuando la demanda de tus nodos es alta, Cluster Autoscaler añade nodos al grupo de nodos. Cuando la demanda es baja, Cluster Autoscaler vuelve a reducir el tamaño hasta el mínimo que hayas designado. De esta forma, puedes aumentar la disponibilidad de tus cargas de trabajo cuando lo necesites y, al mismo tiempo, controlar los costes.

Información general

La herramienta de adaptación dinámica de clústeres cambia automáticamente el tamaño del número de nodos de un grupo de nodos determinado en función de las demandas de tus cargas de trabajo. No tienes que añadir ni quitar nodos manualmente, ni aprovisionar en exceso tus grupos de nodos. En su lugar, especifica un tamaño mínimo y máximo para el grupo de nodos, y el clúster se escala automáticamente.

Si se eliminan o se mueven recursos al autoescalar el clúster, es posible que tus cargas de trabajo sufran interrupciones transitorias. Por ejemplo, si tu carga de trabajo consta de una sola réplica, es posible que el pod de esa réplica se vuelva a programar en otro nodo si se elimina el nodo actual. Antes de habilitar la herramienta de escalado automático de clústeres en tu AWSNodePool, diseña tus cargas de trabajo para que toleren posibles interrupciones o asegúrate de que los pods críticos no se interrumpan.

Cómo funciona la herramienta de adaptación dinámica de clústeres

La herramienta de adaptación dinámica de clústeres funciona por grupo de nodos. Cuando creas un grupo de nodos, especificas un tamaño mínimo y máximo para el grupo de nodos en el recurso de Kubernetes AWSNodePool.

Puedes inhabilitar el autoescalador de clústeres asignando el valor spec.minNodeCount a spec.maxNodeCount en tus AWSNodePools.

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

Si no se pueden programar pods porque no hay suficientes nodos en el grupo de nodos, Cluster Autoscaler añade nodos hasta alcanzar el tamaño máximo del grupo de nodos. Si los nodos no se utilizan lo suficiente y todos los pods se pueden programar incluso con menos nodos en el grupo de nodos, la herramienta de ajuste automático de escala de clústeres elimina nodos hasta alcanzar el tamaño mínimo del grupo de nodos. Si el nodo no se puede drenar correctamente después de un periodo de tiempo de espera (10 minutos), se terminará de forma forzosa. El periodo de gracia no se puede configurar.

Si tus pods han solicitado muy pocos recursos (por ejemplo, si los valores predeterminados no son suficientes), el escalador automático de clústeres no corregirá la situación. Puedes ayudar a que el autoescalador de clústeres funcione con la mayor precisión posible creando solicitudes de recursos adecuadas para todas tus cargas de trabajo.

Criterios de funcionamiento

La herramienta de adaptación dinámica de clústeres hace las siguientes suposiciones al cambiar el tamaño de un grupo de nodos:

  • Todos los pods replicados se pueden reiniciar en otro nodo, lo que puede provocar una breve interrupción. Si tus servicios no toleran las interrupciones, no te recomendamos que uses el escalador automático de clústeres.

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

  • Si tienes AWSNodePools con diferentes tipos de instancia, el escalador automático de clústeres tiene en cuenta el coste relativo de lanzar nuevos nodos e intenta ampliar el grupo de nodos menos caro.

  • Las etiquetas añadidas manualmente después de la creación inicial del clúster o del grupo de nodos no se registran. Los nodos creados por la herramienta de ajuste automático de escala de clústeres reciben las etiquetas especificadas con --node-labels en el momento de la creación del grupo de nodos.

Cambiar el tamaño de un grupo de nodos

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

Antes de empezar

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

Habilitar el escalado automático de grupos de nodos

  1. En tu directorio de anthos-aws, usa anthos-gke para cambiar el contexto a tu servicio de gestión.

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

  2. Para habilitar Cluster Autoscaler, edita el manifiesto de tu AWSNodePool. Edita el archivo cluster-0.yaml y busca la sección AWSNodePool. Cambia los valores de spec.minNodeCount y spec.maxNodeCount.

    En el ejemplo de abajo, el tamaño mínimo de este grupo de nodos se mantiene en 3 nodos, pero se habilita la herramienta de adaptación dinámica de clústeres para que 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, aplica el archivo 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 AWSNodePool termine de escalarse, pasará al estado Provisioned.

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

    El resultado muestra que el AWSNodePool está Resizing. Las operaciones de cambio de tamaño tardan varios minutos en completarse.

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

Crear manualmente un AWSNodePool

También puedes escalar tu clúster creando nuevos AWSNodePools. Cuando creas un AWSNodePool, también puedes aumentar o reducir el tamaño de las instancias.

  1. Puedes obtener el manifiesto de configuración de un AWSNodePool con kubectl get.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get awsnodepool cluster-0-pool-0 -o yaml > new_nodepool.yaml
    
  2. Edita new_nodepool.yaml y elimina las secciones que no aparezcan en el siguiente ejemplo. Guarda 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, aplica el manifiesto a tu clúster de gestión.

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

Siguientes pasos

Despliega un servicio respaldado por Ingress.

Para ver más opciones, consulta la documentación de referencia sobre AWSNodePool.