Realiza el ajuste de escala automático de implementaciones con métricas externas

En este instructivo, se describe cómo realizar el ajuste de escalamiento automático de tus cargas de trabajo de GKE según 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 Realiza un 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 a 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. Consulta la página de Kubernetes Engine en Google Cloud 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. simple
  5. Asegúrate de tener habilitada la facturación para tu proyecto de Google Cloud Platform. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

Instala las siguientes herramientas de línea de comandos de 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 emplea Kubernetes Engine. Puedes instalar kubectl con gcloud:
    gcloud components install kubectl

Cómo establecer valores predeterminados para la herramienta de línea de comandos de gcloud

Para ahorrar tiempo cuando escribes las opciones del ID del proyecto y 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 [COMPUTE_ENGINE_ZONE]

Crea un clúster

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

Cómo 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 Autenticar en 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 Autenticar en 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 habilidad 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

Una vez que hayas implementado el adaptador de Stackdriver de métricas personalizadas, puedes implementar un HorizontalPodAutoscaler para realizar un 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 a 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 con frecuencia, puedes generar una fila 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
    
Salida:
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 a 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á.

Por último, 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.

Usa 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. Para explorar las métricas disponibles, puedes usar el explorador de métricas o la lista de métricas de GCP. En las métricas 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.

Para consultar las métricas de un recurso supervisado con el Explorador de métricas, haz lo siguiente:

  1. En Google Cloud Console, ve a Monitoring o usa el siguiente botón:
    Ir a Monitoring
  2. En el panel de navegación de Monitoring, haz clic en el Explorador de métricas .
  3. Ingresa el nombre del recurso supervisado en el cuadro de texto Buscar tipo de recurso y métrica.

Escribe 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 el uso de barras diagonales en los nombres de las métricas; debes reemplazarlas por barras verticales (|). Ten en cuenta que pubsub.googleapis.com/subscription/num_undelivered_messages se especificó 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 el metricSelector coincide con varias series temporales, la suma de los valores se usa para realizar el ajuste de escala automático. En este instructivo, se usó metricSelector para limitar HPA a fin de que solo tenga en cuenta los mensajes en la suscripción a 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.

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 [Implementación del ajuste de escala automático con métricas personalizadas]. Para hacerlo, especifica cada métrica que deseas usar como una entrada separada en la lista metrics en tu especificación del objeto HPA. HPA calculará la cantidad de réplicas en función de cada métrica y elegirá la más alta.

Realiza una 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
  2. Borra tu clúster de GKE mediante la ejecución del siguiente comando:

    gcloud container clusters delete [CLUSTER_NAME]

Próximos pasos