Escale los pods a partir de señales de tráfico real, no solo de CPU. Para lograrlo, conecte las métricas de Ingress de Simple Log Service (SLS) al escalado horizontal de pods (HPA) de Kubernetes mediante la External Metrics API. Esta guía muestra un ejemplo completo: desplegar una aplicación Nginx, exponerla a través de un Ingress y configurar el HPA para escalar según las consultas por segundo (QPS) y la latencia del percentil 99.99.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un clúster de ACK con kubectl configurado.
Un controlador de Ingress con la recopilación de registros de SLS habilitada (se habilita de forma predeterminada al crear un clúster).
Permisos para instalar Helm charts y crear recursos de HPA.
Cómo funciona
El componente ack-alibaba-cloud-metrics-adapter conecta los servicios de monitoreo de Alibaba Cloud con la External Metrics API de Kubernetes. Una vez instalado, el HPA consulta las métricas de Ingress de SLS, como sls_ingress_qps y sls_ingress_latency_p9999, y ajusta el número de réplicas del Deployment en consecuencia.
Paso 1: Instalar ack-alibaba-cloud-metrics-adapter
El componente ack-alibaba-cloud-metrics-adapter permite que Kubernetes obtenga datos de monitoreo de los servicios de Alibaba Cloud (como ECS, SLB y RDS) a través de la External Metrics API.
Este componente no admite actualizaciones en el lugar. Para actualizarlo, desinstale primero la versión actual e instale después la más reciente. Durante la desinstalación y reinstalación, los HPA relacionados pausan el escalado porque se detiene la obtención de datos de monitoreo.
Inicie sesión en la consola de administración de Container Service. En el panel de navegación, haga clic en Clusters.
Haga clic en el nombre de su clúster. En el panel de navegación izquierdo, seleccione Applications > Helm.
En la página Helm, haga clic en Create. Complete la configuración de Basic Information, seleccione ack-alibaba-cloud-metrics-adapter y haga clic en Next.
En la página Parameter Settings, elija una Chart Version y haga clic en OK.
Paso 3: Crear un Ingress
En el panel de navegación izquierdo de la página de administración del clúster, seleccione Network > Ingress. En la página Ingress, haga clic en Create Ingress.
Complete los campos obligatorios y haga clic en OK. La consola lo redirige a la página Ingress.
En la columna Name, haga clic en el nombre del Ingress para consultar sus reglas de enrutamiento. Para obtener más información, consulte Gestionar Ingress.
Paso 4: Configurar el HPA
El HPA admite dos métricas de Ingress de SLS, cada una con una semántica de escalado distinta:
|
Métrica |
Tipo de destino |
Comportamiento de escalado |
|
|
|
Las QPS se dividen entre la cantidad actual de pods antes de la comparación. |
|
|
|
El valor de latencia sin procesar se compara directamente. |
-
Cree el archivo
ingress-hpa.yamlcon el siguiente contenido:Parámetro
Obligatorio
Descripción
sls.ingress.routeSí
Formato:
<namespace>-<svc>-<port>. Ejemplo:default-nginx-80.sls.logstoreSí
El logstore en Simple Log Service. Valor predeterminado:
nginx-ingress.sls.projectSí
El Project en Simple Log Service. Valor predeterminado:
k8s-log-<cluster-id>.sls.internal.endpointNo
Indica si se accede a SLS por la red interna. Valor predeterminado:
true. Establezca este parámetro enfalsepara usar la red pública.apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: ingress-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment-basic minReplicas: 2 maxReplicas: 10 metrics: - type: External external: metric: name: sls_ingress_qps selector: matchLabels: sls.project: "<your-sls-project>" # Default: k8s-log-<cluster-id> sls.logstore: "nginx-ingress" # Default SLS Logstore for Nginx Ingress logs sls.ingress.route: "default-nginx-80" # Format: <namespace>-<svc>-<port> target: type: AverageValue averageValue: 10 # Scale up when average QPS per pod exceeds 10 - type: External external: metric: name: sls_ingress_latency_p9999 selector: matchLabels: sls.project: "<your-sls-project>" sls.logstore: "nginx-ingress" sls.ingress.route: "default-nginx-80" # sls.internal.endpoint: "true" # true = internal network (default); false = public network target: type: Value value: 10 # Scale up when 99.99th-percentile latency exceeds 10 msLa tabla anterior describe los parámetros utilizados en la configuración del HPA.
-
Aplique la configuración:
kubectl apply -f ingress-hpa.yaml
Comprobar el escalado
Ejecute una prueba de carga de cinco minutos contra el dominio de su Ingress para activar el escalado vertical:
# Send 10 concurrent requests for 300 seconds
ab -t 300 -c 10 <domain-name-configured-for-the-ingress>
Consulte el estado del HPA en tiempo real:
kubectl get hpa ingress-hpa --watch
A continuación se muestra el resultado esperado cuando el escalado se completa correctamente (REPLICAS alcanza MAXPODS):
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
ingress-hpa Deployment/nginx-deployment-basic 21/10 (avg) 2 10 10 7m49s
Cuando el tráfico cae por debajo del umbral, REPLICAS vuelve al valor mínimo.
Solución de problemas
Para iniciar la solución de problemas, ejecute kubectl describe hpa ingress-hpa y revise el campo Conditions. Utilice las columnas Type y Status para identificar el problema y siga los pasos descritos a continuación.
La columna target muestra unknown
-
Ejecute
kubectl describe hpa <hpa-name>y compruebe el campoConditions:Si
AbleToScaleesFalse: verifique que el Deployment esté en buen estado.Si
ScalingActiveesFalse: continúe con el siguiente paso.
-
Ejecute el siguiente comando para comprobar si la External Metrics API está disponible:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/"Si la respuesta es
Error from server (NotFound), compruebe el estado de inicio dealibaba-cloud-metrics-adapter. Si el adaptador se ejecuta con normalidad y las métricas del HPA están relacionadas con Ingress, despliegue primero el componente de SLS. Para obtener más información, consulte Recopilar y analizar registros de acceso de Nginx Ingress. -
Compruebe el formato de
sls.ingress.route. El valor debe ser<namespace>-<svc>-<port>, donde:namespace: el namespace donde reside el Ingress.svc: el nombre del Service asociado al Ingress.port: el nombre del puerto de ese Service.
Error al extraer la imagen de ack-alibaba-cloud-metrics-adapter (versión 1.3.7)
Al actualizar a la versión 1.3.7, es posible que aparezca el siguiente mensaje:
Failed to pull image "registry-<region-id>-vpc.ack.aliyuncs.com/acs/alibaba-cloud-metrics-adapter-amd64:v0.2.9-ba634de-aliyun".
Esto ocurre porque el componente no admite actualizaciones directas. Para resolverlo, siga estos pasos:
Genere una copia de seguridad de la configuración actual del componente.
Desinstale la versión anterior.
Instale la versión más reciente con la configuración de la copia de seguridad.
Preguntas frecuentes
¿Cómo consulto sls_ingress_qps desde la línea de comandos?
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingress"
Reemplace {{SLS_Project}} por el nombre de su Project de SLS. Si no definió un nombre personalizado al crear el clúster, el valor predeterminado es k8s-log-{{ClusterId}}.
Una respuesta exitosa devuelve un elemento ExternalMetricValueList con las QPS actuales en el campo value. Si recibe un error ParameterInvalid, la métrica no tiene datos. Por lo general, esto significa que ALB Ingress no está configurado, pero se consultó sls_alb_ingress_qps en lugar de sls_ingress_qps.
¿Qué métricas admite el HPA?
Para consultar la lista completa, visite Métricas de HPA de Alibaba Cloud. A continuación se muestran las métricas de Ingress de SLS más comunes:
|
Métrica |
Descripción |
Parámetro obligatorio |
|
|
QPS de la ruta de Ingress especificada. |
|
|
|
QPS de la ruta de ALB Ingress. |
|
|
|
Latencia promedio de todas las solicitudes. |
|
|
|
Latencia en el percentil 50. |
|
|
|
Latencia en el percentil 95. |
|
|
|
Latencia en el percentil 99. |
|
|
|
Latencia en el percentil 99.99. |
|
|
|
Ancho de banda entrante del Ingress. |
|
¿Cómo adapto el HPA después de personalizar el formato de registro de Nginx Ingress?
La recopilación de registros de SLS depende de la definición de recurso personalizado (CRD) AliyunLogConfig, que se despliega cuando se habilita SLS por primera vez. Este CRD está ajustado para el formato de registro predeterminado del controlador de Ingress de ACK. Si modificó el formato del registro de acceso del controlador de Ingress, actualice la sección processor_regex en la configuración del CRD para que coincida con su formato personalizado. Para obtener más información, consulte Recopilar registros de contenedores mediante un DaemonSet y un CRD.
Si SLS estaba deshabilitado cuando creó el clúster y necesita métricas de Ingress para el HPA, habilítelo o configúrelo primero. Para obtener más información, consulte Recopilar y analizar registros de acceso de Nginx Ingress.