Este conjunto de instructivos es para administradores y operadores de TI que deseen implementar, ejecutar y administrar entornos de aplicaciones modernos que se ejecutan en Google Kubernetes Engine (GKE). A medida que avanzas con este conjunto de instructivos, aprenderás a configurar la supervisión y las alertas, escalar cargas de trabajo y simular fallas, todo con la aplicación de microservicios de muestra de Cymbal Bank:
- Crea un clúster y, luego, implementa una app de ejemplo
- Supervisa con Google Cloud Managed Service para Prometheus
- Escala cargas de trabajo (este instructivo)
- Simula una falla
- Centraliza la administración de cambios
Descripción general y objetivos
Una aplicación de consumidor como Cymbal Bank suele tener una cantidad variable de usuarios en diferentes momentos. Lo ideal es que el sitio web pueda soportar aumentos de tráfico sin ralentizarse ni tener otros problemas, pero sin que la organización tenga que gastar dinero en recursos en la nube que realmente no necesitan. Una solución que proporcionaGoogle Cloud para esto es el ajuste de escala automático.
En este instructivo, aprenderás a configurar clústeres y cargas de trabajo en un clúster de GKE para escalar con métricas integradas de Kubernetes y métricas personalizadas de Cloud Monitoring y Cloud Trace. Aprenderás a completar las siguientes tareas:
- Habilitar las métricas personalizadas en Cloud Monitoring para Trace.
- Las métricas personalizadas te permiten escalar mediante datos de supervisión adicionales o entradas externas más allá del conocimiento del clúster de Kubernetes, como el tráfico de red o los códigos de respuesta HTTP.
- Configura Horizontal Pod Autoscaler, una función de GKE que puede aumentar o disminuir de forma automática la cantidad de Pods de una carga de trabajo según las métricas especificadas.
- Simula la carga de la aplicación y visualiza que el escalador automático del clúster y el escalador automático horizontal de Pods responden.
Configura la recopilación de métricas personalizadas
Puedes configurar Horizontal Pod Autoscaler para usar métricas integradas de CPU y memoria de Kubernetes, o puedes usar métricas personalizadas de Cloud Monitoring, como solicitudes HTTP por segundo o la cantidad de declaraciones SELECT
. Las métricas personalizadas pueden funcionar sin cambios en la aplicación y le proporcionan a tu clúster más estadísticas sobre el rendimiento general y las necesidades de la aplicación. En este instructivo, aprenderás a usar las métricas integradas y personalizadas.
Para permitir que el escalador automático horizontal de pods lea las métricas personalizadas de Monitoring, debes instalar el adaptador de métricas personalizadas del adaptador de Stackdriver en tu clúster.
Implementa el adaptador de métricas personalizadas de Stackdriver en tu clúster:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
Para permitir que el adaptador de Stackdriver obtenga métricas personalizadas de tu clúster, usa Workload Identity Federation for GKE. En este enfoque, se usa una cuenta de servicio de IAM que tiene permisos para leer las métricas de supervisión.
Otorga a la cuenta de servicio de IAM el rol
roles/monitoring.viewer
.gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer
Configura el adaptador de Stackdriver para usar Workload Identity Federation for GKE y la cuenta de servicio de IAM que tiene permisos para leer las métricas de supervisión:
gcloud iam service-accounts add-iam-policy-binding scalable-apps@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
Kubernetes incluye su propio sistema para las cuentas de servicio a fin de acceder dentro de un clúster. Para permitir que las aplicaciones se autentiquen en servicios y recursos fuera de los clústeres de Google Kubernetes Engine, como Monitoring, usa Workload Identity Federation for GKE. Este enfoque configura la cuenta de servicio de Kubernetes a fin de usar la cuenta de servicio de IAM para GKE.
Anota la cuenta de servicio de Kubernetes que usa el adaptador:
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace=custom-metrics \ iam.gke.io/gcp-service-account=scalable-apps@PROJECT_ID.iam.gserviceaccount.com
Reinicia la implementación del adaptador de Stackdriver para aplicar los cambios:
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
Configura el escalador automático horizontal de Pods
Autopilot de GKE puede escalar de varias maneras. En este instructivo, verás cómo tu clúster puede escalar con los siguientes métodos:
- Escalador automático de pod horizontal: escala la cantidad de pods para una carga de trabajo.
- Escalador automático de clúster: escala los recursos de nodo que están disponibles en el clúster.
Estos dos métodos pueden funcionar juntos a fin de que, a medida que cambie la cantidad de Pods para tus aplicaciones, los recursos de los nodos para admitir esos Pods también cambien.
Hay otras implementaciones disponibles para escalar Pods que se compilan sobre el escalador automático horizontal de Pods, y también puedes usar el escalador automático vertical de Pods para ajustar los requisitos de CPU y memoria de un Pod en lugar de la cantidad de Pods.
En este instructivo, configurarás el escalador automático horizontal de Pods para la implementación userservice
mediante métricas integradas y la implementación frontend
con métricas personalizadas.
Para tus propias aplicaciones, trabaja con los desarrolladores de aplicaciones y los ingenieros de Platform a fin de comprender sus necesidades y configurar las reglas del escalador automático horizontal de pods.
Escala el Deployment userservice
Cuando aumenta la cantidad de usuarios de la aplicación de muestra de Cymbal Bank, el Service userservice
consume más recursos de CPU. Usa un objeto HorizontalPodAutoscaler
para controlar cómo quieres que tu aplicación responda a la carga. En el manifiesto YAML de HorizontalPodAutoscaler
, debes definir en qué Deployment debe escalar el Horizontal Pod Autoscaler, qué métricas supervisar y la cantidad mínima y máxima de réplicas que deseas ejecutar. .
Revisa el manifiesto de muestra
HorizontalPodAutoscaler
para la implementaciónuserservice
:Este manifiesto hace lo siguiente:
- Establece la cantidad máxima de réplicas durante un escalamiento vertical hasta
50
. - Establece la cantidad mínima de durante una reducción de escala en
5
. - Usa una métrica integrada de Kubernetes para tomar decisiones de escalamiento. En este ejemplo, la métrica es el uso de CPU y el uso objetivo es del 60%, lo que evita el uso excesivo e insuficiente.
- Establece la cantidad máxima de réplicas durante un escalamiento vertical hasta
Aplica el manifiesto al clúster:
kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
Escala el Deployment frontend
En la sección anterior, configuraste el escalador automático horizontal de Pods en la implementación de userservice
según las métricas integradas de Kubernetes para el uso de CPU. Para la implementación de frontend
, es posible que desees escalar en función de la cantidad de solicitudes HTTP entrantes. Este enfoque usa el adaptador de Stackdriver a fin de leer métricas personalizadas de Monitoring para el objeto Ingress del balanceador de cargas HTTP(S).
Revisa el manifiesto
HorizontalPodAutoscaler
para la implementaciónfrontend
:En este manifiesto, se usan los siguientes campos:
spec.scaleTargetRef
: El recurso de Kubernetes para escalar.spec.minReplicas
: La cantidad mínima de réplicas, que es5
en esta muestra.spec.maxReplicas
: La cantidad máxima de réplicas, que es25
en esta muestra.spec.metrics.*
: La métrica que se usará. En este ejemplo, esta es la cantidad de solicitudes HTTP por segundo, que es una métrica personalizada de Monitoring que proporciona el adaptador que implementaste.spec.metrics.external.metric.selector.matchLabels
: La etiqueta de recurso específica que se va a filtrar cuando se escala.
Busca el nombre de la regla de reenvío del balanceador de cargas de Ingress
frontend
:export FW_RULE=$(kubectl get ingress frontend -o=jsonpath='{.metadata.annotations.ingress\.kubernetes\.io/forwarding-rule}') echo $FW_RULE
El resultado es similar al siguiente:
k8s2-fr-j76hrtv4-default-frontend-wvvf7381
Agrega tu regla de reenvío al manifiesto:
sed -i "s/FORWARDING_RULE_NAME/$FW_RULE/g" "extras/postgres-hpa/hpa/frontend.yaml"
Este comando reemplaza
FORWARDING_RULE_NAME
por tu regla de reenvío guardada.Aplica el manifiesto al clúster:
kubectl apply -f extras/postgres-hpa/hpa/frontend.yaml
Simula la carga
En esta sección, usas un generador de cargas para simular aumentos repentinos en el tráfico y observar el recuento de réplicas y el recuento de nodos para escalar verticalmente a fin de adaptarse al aumento de carga en el tiempo. Luego, puedes dejar de generar tráfico y observar la reducción de escala vertical del recuento de nodos y réplicas en respuesta.
Antes de comenzar, verifica el estado de Horizontal Pod Autoscaler y observa la cantidad de réplicas en uso.
Obtén el estado de los recursos
HorizontalPodAutoscaler
:kubectl get hpa
El resultado es similar al siguiente que muestra que hay 1 réplica
frontend
y 5 réplicasuserservice
:NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE frontend Deployment/frontend <unknown>/5 (avg) 5 25 1 34s userservice Deployment/userservice 0%/60% 5 50 5 4m56s
La aplicación de muestra de Cymbal Bank incluye un Service
loadgenerator
. Este Service envía de forma continua solicitudes que imitan a los usuarios al frontend, y crea cuentas nuevas de forma periódica y simula transacciones entre ellas.Expón la interfaz web
loadgenerator
de forma local. Usa esta interfaz para simular la carga en la aplicación de muestra de Cymbal Bank:kubectl port-forward svc/loadgenerator 8080
Si ves un mensaje de error, vuelve a intentarlo cuando el Pod se esté ejecutando.
En un navegador en la computadora, abre la interfaz web del generador de cargas:
- Si usas una shell local, abre un navegador y ve a http://127.0.0.1:8080.
- Si usas Cloud Shell, haz clic en Vista previa en la Web y, luego, en Vista previa en el puerto 8080.
En la interfaz web del generador de cargas, si el valor de Errores muestra
100%
, completa los siguientes pasos para actualizar la configuración de la prueba:- Haz clic en el botón Detener junto al contador de la tasa de fallas.
- En Estado, haz clic en la opción Prueba nueva.
- Actualiza el valor de Host a la dirección IP de entrada de Cymbal Bank.
- Haz clic en Start swarming.
En la interfaz web del generador de cargas, haz clic en la pestaña Gráficos para observar el rendimiento en el tiempo. Observa la cantidad de solicitudes y el uso de recursos.
Abre una ventana de la terminal nueva y observa el recuento de réplicas de los Pods
frontend
yuserservice
:kubectl get hpa -w
La cantidad de réplicas aumenta a medida que aumenta la carga. Las acciones de scaleUp pueden tardar alrededor de diez minutos, ya que el clúster reconoce que las métricas configuradas alcanzan el umbral definido y usan el escalador automático horizontal de pods para escalar verticalmente la cantidad de pods.
En el siguiente resultado de ejemplo, se muestra que la cantidad de réplicas aumentó a medida que se ejecuta el generador de cargas:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS frontend Deployment/frontend 5200m/5 (avg) 5 25 13 userservice Deployment/userservice 71%/60% 5 50 17
Abre otra ventana de la terminal y verifica la cantidad de nodos en el clúster:
gcloud container clusters list \ --filter='name=scalable-apps' \ --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \ --location="CONTROL_PLANE_LOCATION"
Reemplaza
CONTROL_PLANE_LOCATION
por la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.La cantidad de nodos también aumentó desde la cantidad inicial para incluir las réplicas nuevas. Este aumento en la cantidad de nodos impulsa GKE Autopilot. No necesitas configurar nada para esta escala de nodo.
Abre la interfaz del generador de cargas y haz clic en Stop para finalizar la prueba.
Verifica el recuento de réplicas y el recuento de nodos de nuevo y observa cómo los números se reducen con la carga reducida. La reducción vertical de la escala puede llevar un tiempo, ya que el período de estabilización predeterminado para las réplicas en el recurso
HorizontalPodAutoscaler
de Kubernetes es de cinco minutos.
En un entorno real, la cantidad de nodos y pods en tu entorno aumentaría y reduciría la escala verticalmente de forma automática de la misma manera que con esta carga simulada. La aplicación de muestra de Cymbal Bank está diseñada para adaptarse a este tipo de escalamiento. Consulta con los operadores de la app, la ingeniería de confiabilidad de sitios (SRE) o los desarrolladores de aplicaciones para ver si sus cargas de trabajo pueden beneficiarse de estas características de escalamiento.