Configura el Ajuste de escala automático horizontal de Pods

En esta página, se explica cómo usar el Escalador automático de pod horizontal (HPA) para escalar una implementación con diferentes tipos de métricas. Puedes usar los lineamientos de configuración de un HPA 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.

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 regionales, establece 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 la API para objetos HPA

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

Cuando usas kubectl para crear o ver información sobre un HPA, 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 nuevos objetos HPA. 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 HPA que usa apiVersion: autoscaling/v2beta2.

Crea la implementación de ejemplo

Antes de poder crear un HPA, debes crear la carga de trabajo que supervisará. En los ejemplos de este tema, se aplican diferentes configuraciones de HPA a la siguiente implementación nginx. Ejemplos separados muestran un HPA basado en el uso de recursos, en una métrica personalizada o externa, y en 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 HPA 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 HPA para realizar un ajuste de escala automático 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 HPA orientado a la CPU con Cloud Console, el comando kubectl apply o el comando kubectl autoscale solo para la CPU promedio.

Console

  1. Visita el menú Cargas de trabajo de GKE en Cloud Console.

    Visitar el menú Cargas de trabajo de GKE

  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 HPA que solo apunte al uso promedio de CPU, puedes usar el comando kubectl autoscale.

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

Para obtener una lista de objetos HPA en el clúster, usa el siguiente comando:

kubectl get hpa

El resultado es similar a este:

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

Para obtener detalles sobre el HPA, puedes usar Cloud Console o el comando kubectl.

Console

  1. Visita el menú Cargas de trabajo de Google Kubernetes Engine en Cloud Console.

    Visitar el menú Cargas de trabajo

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

  3. Consulta la configuración del HPA 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 HPA, 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 HPA, 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 de un HPA.

Puedes obtener más información sobre cómo borrar un HPA.

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 HPA 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 HPA que se ajusta 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 HPA llamado nginx, bórralo antes de seguir este ejemplo.

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

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 HPA supervisa la implementación 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 HPA escala automáticamente la implementación en función de la métrica cuyo valor crearía el evento de ajuste de escala automático más grande.

Visualiza los detalles de un HPA

Para ver la configuración y las estadísticas de un HPA, usa el siguiente comando:

kubectl describe hpa hpa-name

Reemplaza hpa-name por el nombre de tu objeto HorizontalPodAutoscaler.

Si el HPA 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 de tu objeto HorizontalPodAutoscaler.

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

El resultado es similar a este:

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 HPA

Puedes borrar un HPA con Cloud Console o con el comando kubectl delete.

Console

Para borrar el HPA de nginx:

  1. Visita el menú Cargas de trabajo de GKE en Cloud Console.

    Visitar el menú Cargas de trabajo de GKE

  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 HPA nginx, usa el siguiente comando:

kubectl delete hpa nginx

Cuando borras un HPA, 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

Realiza una limpieza

  1. Si aún no lo hiciste, borra el HPA:

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

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

Próximos pasos