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:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

Versiones de API para objetos HorizontalPodAutoscaler

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

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/v2.

  • apiVersion: autoscaling/v1 es la predeterminada y te permite hacer ajuste automático de escala 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/v2. En el ejemplo de Crea la implementación de ejemplo, se usa apiVersion: autoscaling/v1.

  • apiVersion: autoscaling/v2 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/v2.

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/v2.

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 de Horizontal Pod Autoscaler 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 Horizontal Pod Autoscaler 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 Horizontal Pod Autoscaler que se oriente a la CPU con la consola de Google Cloud, 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 la consola de Google Cloud.

    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. Haz 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 a este:

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

Para obtener detalles sobre Horizontal Pod Autoscaler, puedes usar la consola de Google Cloud o el comando kubectl.

Console

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

    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 esta página, 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 Horizontal Pod Autoscaler.

Ajuste de escala automático basado en el tráfico del balanceador de cargas

El ajuste de escala automático basado en el tráfico es una función de GKE que integra señales de uso de tráfico de los balanceadores de cargas para ajustar automáticamente la escala de los Pods.

El uso del tráfico como una señal para el ajuste de escala automático puede ser útil porque el tráfico es un indicador principal de carga que se complementa con la CPU y la memoria. La integración incorporada en GKE garantiza que la configuración sea fácil y que el ajuste de escala automático reaccione rápidamente a los aumentos repentinos de tráfico para satisfacer la demanda.

El controlador de Gateway y sus funciones de administración del tráfico global habilitan el ajuste de escala automático basado en el tráfico. Para obtener más información, consulta Ajuste de escala automático basado en el tráfico.

El ajuste de escala automático basado en el tráfico del balanceador de cargas solo está disponible para las cargas de trabajo de Gateway.

Requisitos

El ajuste de escala automático basado en el tráfico tiene los siguientes requisitos:

  • Es compatible con las versiones 1.24 y posteriores de GKE.
  • API de puerta de enlace habilitada en tu clúster de GKE.
  • Compatible con el tráfico que pasa por los balanceadores de cargas implementados mediante la API de Gateway y la GatewayClass gke-l7-global-external-managed, gke-l7-regional-external-managed, gke-l7-rilb o gke-l7-gxlb.

Limitaciones

El ajuste de escala automático basado en el tráfico tiene las siguientes limitaciones:

  • No es compatible con las GatewayClasses de varios clústeres (gke-l7-global-external-managed-mc, gke-l7-regional-external-managed-mc, gke-l7-rilb-mc y gke-l7-gxlb-mc).
  • No es compatible para el tráfico con Services de tipo ClusterIP o LoadBalancer.
  • La HPA, la implementación (o cualquier otro recurso de destino) y el servicio configurados para usar el ajuste de escala automático basado en el tráfico deben asignarse 1:1:1.

Implementa el ajuste de escala automático basado en el tráfico

En el siguiente ejercicio, se usa HorizontalPodAutoscaler para ajustar automáticamente la escala del objeto Deployment store-autoscale en función del tráfico que recibe. Una Gateway acepta el tráfico de entrada de Internet para los Pods. El escalador automático compara las señales de tráfico de la Gateway con la capacidad de tráfico por Pod configurada en el recurso de Service store-autoscale. Cuando generas tráfico a la Gateway, influyes en la cantidad de Pods implementados.

En el siguiente diagrama, se muestra cómo funciona el ajuste de escala automático basado en el tráfico:

HorizontalPodAutoscaler escala una implementación según el tráfico.

Para implementar el ajuste de escala automático basado en el tráfico, sigue estos pasos:

  1. Para los clústeres estándar, confirma que las GatewayClasses estén instaladas en tu clúster. En los clústeres de Autopilot, las GatewayClasses se instalan de forma predeterminada.

    kubectl get gatewayclass
    

    El resultado confirma que los recursos GatewayClass de GKE están listos para usarse en tu clúster:

    NAME                               CONTROLLER                  ACCEPTED   AGE
    gke-l7-global-external-managed     networking.gke.io/gateway   True       16h
    gke-l7-regional-external-managed   networking.gke.io/gateway   True       16h
    gke-l7-gxlb                        networking.gke.io/gateway   True       16h
    gke-l7-rilb                        networking.gke.io/gateway   True       16h
    

    Si no ves este resultado, habilita la API de la puerta de enlace en tu clúster de GKE.

  2. Implementa la aplicación de muestra y el balanceador de cargas de Gateway en tu clúster:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-autoscale.yaml
    

    La aplicación de muestra crea lo siguiente:

    • Una Deployment con 2 réplicas.
    • Una capacidad del Service con max-rate-per-endpoint establecido en 10. Mientras esta función esté en vista previa, usa una anotación en el Service. Cuando esta función está disponible para el público general, la Política del servicio reemplazará la anotación. Para obtener más información sobre las capacidades de la puerta de enlace, consulta Funciones de GatewayClass.
    • Una Gateway externa para acceder a la aplicación en Internet. Para obtener más información sobre cómo usar los balanceadores de cargas de Gateway, consulta Implementa puertas de enlace.
    • Una HTTPRoute que hace coincidir todo el tráfico y lo envía al Service store-autoscale.

    La capacidad del Service es un elemento fundamental cuando se usa el ajuste de escala automático basado en el tráfico, ya que determina la cantidad de tráfico por Pod que activa un evento de ajuste de escala automático. Se configura la capacidad del Service con la anotación networking.gke.io/max-rate-per-endpoint del Service, que define el tráfico máximo que un Service debe recibir en solicitudes por segundo, por Pod. La capacidad del Service es específica de tu aplicación. Para obtener más información, consulta Determina la capacidad de tu Service.

  3. Guarda el siguiente manifiesto como hpa.yaml:

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: store-autoscale
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: store-autoscale
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Object
        object:
          describedObject:
            kind: Service
            name: store-autoscale
          metric:
            name: "autoscaling.googleapis.com|gclb-capacity-utilization"
          target:
            averageValue: 70
            type: AverageValue
    

    En este manifiesto, se describe un HorizontalPodAutoscaler con las siguientes propiedades:

    • minReplicas y maxReplicas: Establecen la cantidad mínima y máxima de réplicas para esta Deployment. En esta configuración, el número de Pods puede escalar de 1 a 10 réplicas.
    • describedObject.name: store-autoscale: Es la referencia al Service store-autoscale que define la capacidad de tráfico.
    • scaleTargetRef.name: store-autoscale: Es la referencia a la Deployment store-autoscale que define el recurso escalado por el Horizontal Pod Autoscaler.
    • averageValue: 70: Es el valor objetivo promedio del uso de capacidad. Esto le da al Horizontal Pod Autoscaler un margen de crecimiento para que los Pods en ejecución puedan procesar el tráfico excesivo mientras se crean Pods nuevos.

El Horizontal Pod Autoscaler tiene como resultado el siguiente comportamiento de tráfico:

  • La cantidad de Pods se ajusta entre 1 y 10 réplicas para alcanzar el 70% de la tasa máxima por extremo. Esto da como resultado 7 RPS por Pod cuando se configura max-rate-per-endpoint=10.
  • A más de 7 RPS por Pod, los Pods se escalan verticalmente hasta alcanzar su máximo de 10 réplicas o hasta que el tráfico promedio sea de 7 RPS por Pod.
  • Si se reduce el tráfico, se reduce verticalmente la escala de los Pods a una tasa razonable mediante el algoritmo del Horizontal Pod Autoscaler.

También puedes implementar un generador de tráfico para validar el comportamiento del ajuste de escala automático basado en el tráfico.

A 30 RPS, la Deployment se escala a 5 réplicas para que cada réplica reciba, de manera ideal, 6 RPS de tráfico, que sería un 60% de uso por Pod. Esto está por debajo del uso objetivo del 70%, por lo que los Pods se escalan de manera adecuada. Según las fluctuaciones del tráfico, la cantidad de réplicas con ajuste de escala automático también puede fluctuar. Para obtener una descripción más detallada de cómo se calcula la cantidad de réplicas, consulta Comportamiento del ajuste de escala automático.

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

Si deseas crear escaladores automáticos horizontales de Pods para métricas personalizadas y métricas externas, consulta Optimiza el ajuste de escala automático de Pods en función de las métricas.

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/v2. 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/v2
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/v2 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.v2.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 a este:

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2","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 Horizontal Pod Autoscaler con la consola de Google Cloud o el comando kubectl delete.

Console

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

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

    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

Realiza 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

En esta sección, se muestran los pasos para solucionar problemas relacionados con el uso del ajuste de escala automático horizontal de Pods.

Horizontal Pod Autoscaler muestra un error unable to fetch pod metrics for pod

Cuando configuras un Horizontal Pod Autoscaler, 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.

Horizontal Pod Autoscaler muestra un evento multiple services selecting the same target of...

Un Horizontal Pod Autoscaler muestra un error multiple services selecting the same target of <hpa>: <services> si detecta que usas el ajuste de escala automático basado en el tráfico con varios servicios asociados con el objetivo del escalador automático horizontal de Pods (por lo general, una implementación).

El ajuste de escala automático basado en el tráfico solo admite configuraciones en las que se asocia exactamente un servicio con el recurso con ajuste de escala automático. Consulta Ajuste de escala automático basado en el tráfico del balanceador de cargas. El mensaje de error enumera los servicios que se encontraron.

Para resolver el problema, asegúrate de que solo un servicio esté asociado con el Horizontal Pod Autoscaler.

¿Qué sigue?