Cómo realizar el ajuste de escala automático de implementaciones con métricas externas

En este instructivo se describe cómo realizar el ajuste de escala automático de las cargas de trabajo de GKE en función de las métricas disponibles en Stackdriver.

En cambio, si deseas realizar el ajuste de escala automático de las métricas que exporta tu carga de trabajo en Kubernetes o las métricas adjuntas al objeto de Kubernetes, como un pod o nodo, consulta Cómo realizar el ajuste de escala automático de implementaciones con métricas personalizadas.

En este ejemplo se muestra un ajuste de escala automático basado en la cantidad de mensajes no enviados en una suscripción Cloud Pub/Sub, pero las instrucciones se pueden aplicar a cualquier métrica disponible en Stackdriver.

Objetivos

En este instructivo se abarcan los siguientes pasos:

  1. Cómo implementar métricas personalizadas con el adaptador de Stackdriver.
  2. Cómo implementar el recurso HorizontalPodAutoscaler (HPA) para escalar tu implementación según las métricas personalizadas de Stackdriver desde otro servicio de Google Cloud Platform.

Antes de comenzar

Sigue los pasos que se indican a continuación para habilitar la API de Kubernetes Engine:
  1. Visita la página de Kubernetes Engine en Google Cloud Platform Console.
  2. Crea o selecciona un proyecto.
  3. Espera a que la API y los servicios relacionados se habiliten. Esto puede tardar varios minutos.
  4. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

Instala las siguientes herramientas de línea de comandos que se usan en este instructivo:

  • gcloud se usa para crear y borrar clústeres de Kubernetes Engine. gcloud se incluye en el SDK de Google Cloud.
  • kubectl se usa para administrar Kubernetes, el sistema de organización de clústeres que utiliza Kubernetes Engine. Puedes instalar kubectl mediante gcloud:
    gcloud components install kubectl

Establecer valores predeterminados para la herramienta de línea de comandos de gcloud

Para ahorrar tiempo en escribir las opciones de tu ID del proyecto y de la zona de Compute Engine en la herramienta de línea de comandos de gcloud, puedes establecer los valores predeterminados:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

Crear clúster

Crea un clúster de GKE ejecutando la versión 1.10 o posterior de Kubernetes.

Implementar una aplicación de suscriptor de Pub/Sub

Para ejecutar una aplicación con Cloud Pub/Sub, debes crear una cuenta de servicio de Google Cloud y proporcionar credenciales a tu aplicación. Esto se describe en el instructivo Cómo autenticar Cloud Platform con cuentas de servicio.

En los siguientes pasos, se muestra cómo realizar el ajuste de escala automático en la implementación creada en Cómo autenticar Cloud Platform con cuentas de servicio. Debes completar los pasos del 1 al 6 de ese instructivo antes de continuar.

Paso 1: implementar métricas personalizadas con el adaptador de Stackdriver

Para que los objetos GKE tengan acceso a las métricas almacenadas en Stackdriver, debes implementar el adaptador de métricas personalizadas de Stackdriver. Para ejecutar este adaptador, debes otorgar a tu usuario la capacidad de crear funciones de autorización requeridas mediante la ejecución del siguiente comando:

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole cluster-admin --user "$(gcloud config get-value account)"

Para implementar el adaptador en tu clúster, ejecuta el siguiente comando:

kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml

Paso 2: crear el objeto HorizontalPodAutoscaler

Después de implementar las métricas personalizadas con el adaptador de Stackdriver, puedes implementar un HorizontalPodAutoscaler para realizar el ajuste de escala automático en tu implementación.

En el siguiente archivo de manifiesto se describe un objeto HorizontalPodAutoscaler que escala una implementación según el objetivo en función de la cantidad de mensajes no confirmados en una suscripción de Pub/Sub.

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: pubsub
spec:
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - external:
      metricName: pubsub.googleapis.com|subscription|num_undelivered_messages
      metricSelector:
        matchLabels:
          resource.labels.subscription_id: echo-read
      targetAverageValue: "2"
    type: External
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: pubsub

Para implementar este manifiesto, descárgalo en tu máquina como hpa.yaml y ejecuta el siguiente comando:

kubectl apply -f hpa.yaml

Paso 3: generar la carga

La aplicación de muestra implementada en este ejemplo procesa un solo mensaje cada pocos segundos. Si publicas continuamente, puedes generar una cola de mensajes, lo que activará el ajuste de escala automático. Puedes usar el siguiente comando para publicar 200 mensajes en el tema de Pub/Sub:

for i in {1..200}; do gcloud pubsub topics publish echo --message="Autoscaling #${i}"; done

Paso 4: observar cómo HPA crea réplicas adicionales de la aplicación

Puedes verificar la cantidad actual de réplicas de tu implementación mediante la ejecución del siguiente comando:

kubectl get deployment pubsub

También puedes inspeccionar el estado y la actividad reciente de HPA mediante la ejecución del siguiente comando:

kubectl describe hpa pubsub
Resultado:
Name:                                                                                    pubsub
...
Metrics:                                                                                 ( current / target )
"pubsub.googleapis.com|subscription|num_undelivered_messages" (target average value):  2250m / 2
Min replicas:                                                                            1
Max replicas:                                                                            4
Conditions:
Type            Status  Reason            Message
----            ------  ------            -------
AbleToScale     True    SucceededRescale  the HPA controller was able to update the target scale to 4
ScalingActive   True    ValidMetricFound  the HPA was able to successfully calculate a replica count from external metric pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id: echo-read,},MatchExpressions:[],})
ScalingLimited  True    TooManyReplicas   the desired replica count is more than the maximum replica count
Events:
Type    Reason             Age   From                       Message
----    ------             ----  ----                       -------
Normal  SuccessfulRescale  7s    horizontal-pod-autoscaler  New size: 4; reason:
external metric
pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id:
echo-read,},MatchExpressions:[],}) above target

En la sección Métricas se muestra el último valor de métricas que observó HPA. Los valores fraccionarios se representan como miliunidades. Por ejemplo, en el resultado anterior hay 4 réplicas de la aplicación y, la cantidad actual de los mensajes no confirmados en la suscripción de Pub/Sub es 9. La cantidad promedio de mensajes por réplica es 2.25 o 2,250 m.

En la sección Estados se describe si HorizontalPodAutoscaler puede escalar o no. En el ejemplo anterior, el estado ScalingLimited muestra que la cantidad de réplicas está en el valor máximo permitido, y HPA no lo aumentará.

Finalmente, HPA crea un evento (consulta la sección “Eventos” en el resultado anterior) cada vez que cambie la cantidad de réplicas de tu aplicación. En el ejemplo anterior, la cantidad de réplicas se cambió a 4, porque la cantidad de mensajes no confirmados superó el objetivo.

Cómo usar una métrica diferente

Se puede usar cualquier métrica disponible en Stackdriver para realizar el ajuste de escala automático, siempre que metricType sea INT64 o DOUBLE. A fin de explorar las métricas disponibles, puedes usar el explorador de métricas o la lista de métricas de GCP. En la métrica de tipo GAUGE, el valor actual se usa para realizar el ajuste de escala automático. En cambio, en las métricas DELTA y CUMULATIVE, se usa la tasa de métricas; el cambio de métrica por segundo. Puedes encontrar más información sobre cómo se calcula la tasa en la documentación del adaptador de métricas personalizadas.

Cómo escribir la especificación de métrica externa

Una vez que elijas una métrica a fin de realizar el ajuste de escala automático, debes escribir una especificación de métrica externa para HorizontalPodAutoscaler. Para hacerlo, debes especificar tres campos:

  • metricName es el nombre de la métrica. La API de Kubernetes no permite usar barras diagonales en los nombres, y debes reemplazarlas por barras verticales (|). Observa cómo se especificó pubsub.googleapis.com/subscription/num_undelivered_messages como pubsub.googleapis.com|subscription|num_undelivered_messages en este instructivo.
  • metricSelector se puede usar de forma opcional para seleccionar una serie temporal específica de la métrica. Si metricSelector coincide con varias series temporales, la suma de los valores se utiliza para realizar el ajuste de escala automático. En este instructivo, se utilizó metricSelector para limitar HPA con el objetivo de que solo tenga en cuenta los mensajes en la suscripción de echo-read. Obtén más información sobre las Series temporales y etiquetas de Stackdriver y LabelSelector de Kubernetes.
  • targetAverageValue especifica qué cantidad de un valor total de métrica puede manejar una réplica. Esto es útil cuando se usan métricas que describen algún trabajo o recurso que se puede dividir entre réplicas; por ejemplo, mensajes de Pub/Sub o QPS. Para otras métricas, como la latencia de solicitud promedio, tiene más sentido especificar un valor objetivo global. Para hacerlo, especifica targetValue en lugar de targetAverageValue.

Cómo realizar el ajuste de escala automático en función de varias métricas

Puedes usar varias métricas con un solo HorizontalPodAutoscaler y combinar métricas externas con otros tipos descritos en [Cómo realizar el ajuste de escala automático de implementaciones con métricas personalizadas]. Para hacerlo, especifica cada métrica que quieras utilizar como una entrada separada en la lista metrics en tu especificación de objeto HPA. HPA calculará la cantidad de réplicas en función de cada métrica y elegirá la más alta.

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

  1. Limpia la suscripción y el tema de Pub/Sub:
gcloud pubsub subscriptions delete echo-read
gcloud pubsub topics delete echo
  1. Borra tu clúster de GKE mediante la ejecución del siguiente comando:
gcloud container clusters delete [CLUSTER_NAME]

Qué sigue

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Instructivos de Kubernetes Engine