Configura el Ajuste de escala automático horizontal de Pods

En esta página, se explica cómo usar el ajuste de escala automático horizontal de Pod para escalar automáticamente una implementación con diferentes tipos de métricas. Puedes usar los mismos lineamientos a fin de configurar un HorizontalPodAutoscaler para cualquier objeto de implementación escalable.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

Establece la configuración de gcloud predeterminada mediante uno de los siguientes métodos:

  • Usa gcloud init si deseas ver una explicación sobre cómo configurar parámetros predeterminados.
  • Usa gcloud config para establecer el ID, la zona y la región del proyecto de manera individual.

Usa gcloud init

Si recibes el error One of [--zone, --region] must be supplied: Please specify location, completa esta sección.

  1. Ejecuta gcloud init y sigue las instrucciones:

    gcloud init

    Si usas SSH en un servidor remoto, usa la marca --console-only para evitar que el comando abra un navegador:

    gcloud init --console-only
  2. Sigue las instrucciones a fin de autorizar a gcloud para que use tu cuenta de Google Cloud.
  3. Crea una configuración nueva o selecciona una existente.
  4. Elige un proyecto de Google Cloud.
  5. Elige una zona predeterminada de Compute Engine para clústeres zonales o una región para clústeres regionales o de Autopilot.

Usa gcloud config

  • Establece tu ID del proyecto predeterminado:
    gcloud config set project PROJECT_ID
  • Si trabajas con clústeres zonales, establece tu zona de procesamiento predeterminada:
    gcloud config set compute/zone COMPUTE_ZONE
  • Si trabajas con clústeres de Autopilot o regionales, configura tu región de procesamiento predeterminada:
    gcloud config set compute/region COMPUTE_REGION
  • Actualiza gcloud a la versión más reciente:
    gcloud components update

Versiones de API para objetos HorizontalPodAutoscaler

Cuando usas Google Cloud Console, los objetos HorizontalPodAutoscaler se crean con la API de autoscaling/v2beta2.

Cuando usas kubectl para crear o ver información sobre un escalador automático horizontal de Pods, puedes especificar la API autoscaling/v1 o la API autoscaling/v2beta2.

  • apiVersion: autoscaling/v1 es la predeterminada y te permite hacer ajuste de escala automático según el uso de CPU. Para realizar un ajuste de escala automático en función de otras métricas, se recomienda usar apiVersion: autoscaling/v2beta2. En el ejemplo de la página sobre cómo configurar una implementación, se usa apiVersion: autoscaling/v1.

  • apiVersion: autoscaling/v2beta2 se recomienda para crear objetos HorizontalPodAutoscaler nuevos. Te permite hacer un ajuste de escala automático en función de varias métricas, incluidas las métricas personalizadas o externas. En todos los demás ejemplos de este tema se usa apiVersion: autoscaling/v2beta2.

Para verificar qué versiones de la API son compatibles, usa el comando kubectl api-versions.

Puedes especificar qué API usar cuando visualizas detalles sobre un escalador automático horizontal de Pods que usa apiVersion: autoscaling/v2beta2.

Crea la implementación de ejemplo

Antes de que puedas crear un escalador automático horizontal de Pods, debes crear la carga de trabajo que supervisa. En los ejemplos de este tema, se aplican diferentes configuraciones del escalador automático horizontal de Pods a la siguiente implementación nginx. Ejemplos separados muestran un escalador automático horizontal de Pods según el uso de recursos, la métrica personalizada o externa, y varias métricas.

Guarda lo siguiente en un archivo llamado nginx.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          # You must specify requests for CPU to autoscale
          # based on CPU utilization
          requests:
            cpu: "250m"

Este manifiesto especifica un valor para las solicitudes de CPU. Si deseas ajustar la escala automática según el uso de un recurso como un porcentaje, debes especificar solicitudes para ese recurso. Si no especificas solicitudes, puedes hacer un ajuste de escala automático en función del valor absoluto del uso del recurso, como las miliCPU para el uso de CPU.

Para crear la implementación, aplica el manifiesto nginx.yaml:

kubectl apply -f nginx.yaml

La implementación tiene spec.replicas establecidas en 3, por lo que se implementan tres pods. Puedes verificar esto con el comando kubectl get deployment nginx.

En cada uno de los ejemplos de este tema, se aplica un escalador automático horizontal de Pods diferente a un ejemplo de implementación de nginx.

Ajuste de escala automático según el uso de recursos

En este ejemplo, se crea un objeto HorizontalPodAutoscaler para realizar un ajuste de escala automático de la implementación nginx cuando el uso de CPU supera el 50% y garantiza que siempre haya un mínimo de 1 réplica y un máximo de 10 réplicas.

Puedes crear un escalador automático horizontal de Pods que se oriente a la CPU con Cloud Console, el comando kubectl apply o el comando kubectl autoscale solo para la CPU promedio.

Console

  1. Ve a la página Cargas de trabajo en Cloud Console.

    Ir a Cargas de trabajo

  2. Haz clic en el nombre de la implementación nginx.

  3. Haz clic en Acciones > Ajuste de escala automático.

  4. Especifica los siguientes valores:

    • Cantidad mínima de réplicas: 1
    • Cantidad máxima de réplicas: 10
    • Métrica de ajuste de escala automático: CPU
    • Objetivo: 50
    • Unidad: %
  5. Haga clic en Listo.

  6. Haz clic en Ajuste de escala automático.

kubectl apply

Guarda el siguiente manifiesto YAML como un archivo llamado nginx-hpa.yaml.

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

Para crear el HPA, aplica el manifiesto con el siguiente comando:

kubectl apply -f nginx-hpa.yaml

kubectl autoscale

Para crear un objeto HorizontalPodAutoscaler que solo apunte al uso de CPU promedio, puedes usar el comando kubectl autoscale:

kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10

Para obtener una lista de los escaladores automáticos horizontales de Pods en el clúster, usa el siguiente comando:

kubectl get hpa

El resultado es similar al siguiente:

NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/50%    1         10        3          61s

Para obtener detalles sobre el escalador automático horizontal de Pods, puedes usar Cloud Console o el comando kubectl.

Console

  1. Ve a la página Cargas de trabajo en Cloud Console.

    Ir a Cargas de trabajo

  2. Haz clic en el nombre de la implementación nginx.

  3. Consulta la configuración del escalador automático horizontal de Pods en la sección Escalador automático.

  4. Ver más detalles sobre el ajuste de escala automático en la pestaña Eventos.

kubectl get

Para obtener detalles sobre el escalador automático horizontal de Pods, puedes usar kubectl get hpa con la marca -o yaml. El campo status contiene información sobre la cantidad actual de réplicas y los eventos de ajuste de escala automático recientes.

kubectl get hpa nginx -o yaml

El resultado es similar a este:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
      recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
      HPA was able to successfully calculate a replica count from cpu resource utilization
      (percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
      desired count is within the acceptable range"}]'
    autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
  creationTimestamp: "2019-10-30T19:42:43Z"
  name: nginx
  namespace: default
  resourceVersion: "220050"
  selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
  uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  targetCPUUtilizationPercentage: 50
status:
  currentCPUUtilizationPercentage: 0
  currentReplicas: 3
  desiredReplicas: 3

Antes de seguir los ejemplos restantes en este tema, borra el HPA:

kubectl delete hpa nginx

Cuando borras un escalador automático horizontal de Pods, la cantidad de réplicas de la implementación sigue igual. Una implementación no vuelve automáticamente a su estado anterior a la aplicación del escalador automático horizontal de Pods.

Puedes obtener más información sobre cómo borrar un escalador automático horizontal de Pods.

Ajuste de escala automático en función de una métrica personalizada o externa

Puedes seguir con instructivos paso a paso si deseas crear escaladores automáticos horizontales de Pods para métricas personalizadas y métricas externas.

Ajuste de escala automático en función de varias métricas

En este ejemplo, se crea un escalador automático horizontal de Pods que se escala automáticamente según el uso de CPU y una métrica personalizada llamada packets_per_second.

Si seguiste el ejemplo anterior y aún tienes un escalador automático de horizontal de Pods llamado nginx, bórralo antes de seguir este ejemplo.

En este ejemplo, se necesita apiVersion: autoscaling/v2beta2. Para obtener más información sobre las API disponibles, consulta las versiones de API para objetos HorizontalPodAutoscaler.

Guarda este manifiesto YAML como un archivo llamado nginx-multiple.yaml:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 100Mi
  # Uncomment these lines if you create the custom packets_per_second metric and
  # configure your app to export the metric.
  # - type: Pods
  #   pods:
  #     metric:
  #       name: packets_per_second
  #     target:
  #       type: AverageValue
  #       averageValue: 100

Aplica el manifiesto YAML:

kubectl apply -f nginx-multiple.yaml

Cuando se crea, el escalador automático horizontal de Pods supervisa la implementación de nginx para el uso promedio de CPU, el uso promedio de la memoria y (si quitaste el comentario) la métrica personalizada packets_per_second. El escalador automático horizontal de Pods escala automáticamente la implementación según la métrica cuyo valor crearía el evento de ajuste de escala automático más grande.

Visualiza detalles sobre un escalador automático horizontal de Pods

Para ver la configuración y las estadísticas del escalador automático horizontal de Pods, usa el siguiente comando:

kubectl describe hpa HPA_NAME

Reemplaza HPA_NAME por el nombre del objeto HorizontalPodAutoscaler.

Si el escalador automático horizontal de Pods usa apiVersion: autoscaling/v2beta2 y se basa en varias métricas, el comando kubectl describe hpa solo muestra la métrica de CPU. Para ver todas las métricas, usa el siguiente comando:

kubectl describe hpa.v2beta2.autoscaling HPA_NAME

Reemplaza HPA_NAME por el nombre del objeto HorizontalPodAutoscaler.

El estado actual de cada escalador automático horizontal de Pods se muestra en el campo Conditions, y los eventos de ajuste de escala automático aparecen en el campo Events.

El resultado es similar al siguiente:

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2beta2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp:                                     Tue, 05 May 2020 20:07:11 +0000
Reference:                                             Deployment/nginx
Metrics:                                               ( current / target )
  resource memory on pods:                             2220032 / 100Mi
  resource cpu on pods  (as a percentage of request):  0% (0) / 50%
Min replicas:                                          1
Max replicas:                                          10
Deployment pods:                                       1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:                                                <none>

Borra un escalador automático horizontal de Pods

Puedes borrar un escalador automático horizontal de Pods con Cloud Console o el comando kubectl delete.

Console

Para borrar el escalador automático horizontal de Pods nginx, haz lo siguiente:

  1. Dirígete a la página Cargas de trabajo en Cloud Console.

    Ir a Cargas de trabajo

  2. Haz clic en el nombre de la implementación nginx.

  3. Haz clic en Acciones > Ajuste de escala automático.

  4. Haz clic en Borrar.

kubectl delete

Para borrar el escalador automático horizontal de Pods nginx, usa el siguiente comando:

kubectl delete hpa nginx

Cuando borras un escalador automático horizontal de Pods, la implementación (o algún otro objeto de implementación) permanece en su escalamiento existente y no vuelve a la cantidad de réplicas en el manifiesto original de la implementación. Para escalar la implementación de forma manual de nuevo a tres pods, puedes usar el comando kubectl scale:

kubectl scale deployment nginx --replicas=3

Realice una limpieza

  1. Si aún no lo hiciste, borra el escalador automático horizontal de Pods:

    kubectl delete hpa nginx
    
  2. Borra la implementación nginx:

    kubectl delete deployment nginx
    
  3. Si lo deseas, borra el clúster.

Soluciona problemas

Cuando configuras un escalador automático horizontal de Pods, es posible que veas mensajes de advertencia como el siguiente:

unable to fetch pod metrics for pod

Es normal ver este mensaje cuando se inicia el servidor de métricas. Sin embargo, si continúas viendo las advertencias y notas que los Pods no se escalan para la carga de trabajo, asegúrate de haber especificado solicitudes de recursos para cada contenedor en la carga de trabajo. A fin de usar objetivos porcentuales de uso de los recursos con ajuste de escala automático horizontal de Pods, debes configurar las solicitudes para ese recurso en cada contenedor que se ejecute en cada Pod en la carga de trabajo. De lo contrario, el escalador automático horizontal de Pods no puede realizar los cálculos que necesita y no realiza ninguna acción en relación con esa métrica.

¿Qué sigue?