Configura un escalador automático de pod horizontal

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

Sigue estos pasos a fin de prepararte para esta tarea:

  • Asegúrate de que habilitaste la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Asegúrate de que instalaste el SDK de Cloud.
  • 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/v2beta1.

Cuando usas kubectl para crear o ver información sobre un HPA, puedes especificar la API autoscaling/v1 o la API autoscaling/v2beta1.

  • 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/v2beta1. En el ejemplo de la página sobre cómo configurar una implementación, se usa apiVersion: autoscaling/v1.

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

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

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. Expande el menú Acciones y selecciona Ajuste de escala automático.

  4. Especifica los siguientes valores:

    • Cantidad mínima de pods: 1
    • Cantidad máxima de pods: 10
    • Porcentaje de uso de CPU de destino: 50
  5. 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:

kubectl apply -f nginx-hpa.yaml
horizontalpodautoscaler.autoscaling/nginx created

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 comando kubectl get hpa:

kubectl get hpa
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 GKE en Cloud Console.

    Visitar el menú Cargas de trabajo de GKE

  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 de la página.

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

En este ejemplo, se necesita apiVersion: autoscaling/v2beta1. 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/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 50
  - type: Resource
    resource:
      name: memory
      targetAverageValue: 100Mi
  # Uncomment these lines if you create the custom packets_per_second metric and
  # configure your app to export the metric.
  # - type: Pods
  #   pods:
  #     metricName: packets_per_second
  #     targetAverageValue: 100

Aplica el manifiesto YAML:

kubectl apply -f nginx-multiple.yaml
horizontalpodautoscaler.autoscaling/nginx created

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.

Visualización de detalles de un HPA

Para ver la configuración y las estadísticas de un HPA, usa kubectl describe hpa <var>[HPA-NAME]</var>. Si tu HPA usa apiVersion: autoscaling/v2beta1, usa kubectl describe hpa.v2beta1.autoscaling <var>[HPA-NAME]</var> en su lugar.

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.

kubectl describe hpa nginx

Si el HPA usa apiVersion: autoscaling/v2beta1 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 comando kubectl describe hpa.v2beta1.autoscaling.

kubectl describe hpa.v2beta1.autoscaling nginx
Name:                     nginx
Namespace:                default
Labels:                   <none>
Annotations:              autoscaling.alpha.kubernetes.io/conditions:
                            [{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T21:15:22Z","reason":"ReadyForNewScale","message":"recommended size...
                          autoscaling.alpha.kubernetes.io/current-metrics:
                            [{"type":"Resource","resource":{"name":"memory","currentAverageValue":"1998848"}},{"type":"Resource","resource":{"name":"cpu","currentAver...
                          autoscaling.alpha.kubernetes.io/metrics: [{"type":"Resource","resource":{"name":"memory","targetAverageValue":"100Mi"}}]
                          kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"autoscaling/v2beta1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp:        Wed, 30 Oct 2019 14:15:13 -0700
Reference:                Deployment/nginx
Target CPU utilization:   50%
Current CPU utilization:  0%
Min replicas:             1
Max replicas:             10
Deployment pods:          1 current / 1 desired
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. Expande el menú Acciones y selecciona Ajuste de escala automático.

  4. Selecciona Inhabilitar el escalador automático.

kubectl delete

Para borrar el HPA de nginx, usa el comando kubectl delete:

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