Solucionar problemas del Custom Metrics Server y del HPA
Estado y flare del Cluster Agent
Si tienes problemas con el Custom Metrics Server:
Asegúrate de que tienes la capa de agregación y los certificados configurados.
Asegúrate de que las métricas que quieres escalar automáticamente están disponibles. Cuando creas el HPA, el Datadog Cluster Agent analiza el manifiesto y consulta a Datadog para intentar obtener las métricas. Si hay un problema tipográfico con el nombre de tu métrica o si tu métrica no existe en tu cuenta de Datadog, se produce el siguiente error:
2018-07-03 13:47:56 UTC | ERROR | (datadogexternal.go:45 in queryDatadogExternal) | Returned series slice empty
Ejecuta el comando agent status
para ver el estado del proceso del proveedor externo de métricas:
Custom Metrics Provider
=======================
External Metrics
================
ConfigMap name: datadog-hpa
Number of external metrics detected: 2
Los errores del proceso del proveedor externo de métricas se muestran con este comando. Si quieres ver un resultado más detallado, ejecuta el comando flare: agent flare
.
El comando flare genera un archivo zip que contiene el custom-metrics-provider.log
, donde se puede ver el resultado de la siguiente manera:
Custom Metrics Provider
=======================
External Metrics
================
ConfigMap name: datadog-hpa
Number of external metrics detected: 2
hpa:
- name: nginxext
- namespace: default
labels:
- cluster: eks
metricName: redis.key
ts: 1532042322
valid: false
value: 0
hpa:
- name: nginxext
- namespace: default
labels:
- dcos_version: 1.9.4
metricName: docker.mem.limit
ts: 1.532042322
valid: true
value: 268435456
Si el indicador Valid
de la métrica se establece como false
, la métrica no se tendrá en cuenta en el pipeline del HPA.
Descripción del manifiesto del HPA
Si aparece el siguiente mensaje al describir el manifiesto del HPA:
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True SucceededGetScale the HPA controller was able to get the target's current scale
ScalingActive False FailedGetExternalMetric the HPA was unable to compute the replica count: unable to get external metric default/nginx.net.request_per_s/&LabelSelector{MatchLabels:map[string]string{kube_container_name: nginx,},MatchExpressions:[],}: unable to fetch metrics from external metrics API: the server could not find the requested resource (get nginx.net.request_per_s.external.metrics.k8s.io)
Entonces es probable que no cuentes con la configuración del control de acceso basado en roles (RBAC) o la conectividad de servicio adecuados para el proveedor de métricas. Asegúrate de que kubectl get apiservices
aparece:
% kubectl get apiservices
NAME SERVICE AVAILABLE AGE
...
v1beta1.external.metrics.k8s.io default/datadog-cluster-agent-metrics-api True 57s
El servicio API de métricas externas aparece con true
disponible si el servicio API, el servicio y la asignación de puertos en el pod coinciden, así como si el Cluster Agent tiene los permisos RBAC correctos. Asegúrate de haber creado los recursos desde el paso Registrar el proveedor externo de métricas.
Si aparece el siguiente error al describir el manifiesto del HPA:
Warning FailedComputeMetricsReplicas 3s (x2 over 33s) horizontal-pod-autoscaler failed to get nginx.net.request_per_s external metric: unable to get external metric default/nginx.net.request_per_s/&LabelSelector{MatchLabels:map[string]string{kube_container_name: nginx,},MatchExpressions:[],}: unable to fetch metrics from external metrics API: the server is currently unable to handle the request (get nginx.net.request_per_s.external.metrics.k8s.io)
Asegúrate de que el Datadog Cluster Agent se está ejecutando y de que el servicio que expone el puerto 8443
, cuyo nombre está registrado en el servicio API, está activo.
Diferencias de valor entre Datadog y Kubernetes
A medida que Kubernetes escala automáticamente tus recursos, el HPA toma una decisión de escalado basada en el valor de métrica proporcionado por Cluster Agent. El Cluster Agent consulta y almacena el valor exacto de métrica devuelto por la API de Datadog. Si tu HPA está utilizando un objetivo con type: Value
, este valor exacto de métrica se proporciona al HPA. Si tu HPA está utilizando type: AverageValue
, este valor de métrica se divide por el número actual de réplicas.
Es por esta razón que puedes ver valores devueltos como los siguientes:
% kubectl get datadogmetric
NAME ACTIVE VALID VALUE REFERENCES UPDATE TIME
example-metric True True 7 hpa:default/example-hpa 21s
% kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
example-hpa Deployment/nginx 3500m/5 (avg) 1 3 2 24
Ya que el valor de 7
se ha dividido por las réplicas 2
para dar ese promedio 3.5
. Ambos tipos son compatibles con el HPA, sólo ten en cuenta el tipo al configurar tu consulta y valor objetivo. Consulta la guía del Cluster Agent para la configuración de ejemplos.
Advertencia: Por defecto, el Datadog Cluster Agent procesa las métricas establecidas en los diferentes manifiestos del HPA y consulta a Datadog para obtener valores cada 30 segundos. Por defecto, Kubernetes consulta al Datadog Cluster Agent cada 30 segundos. Debido a que este proceso se realiza de forma asíncrona, no debes esperar que la regla anterior se verifique en todo momento, especialmente si la métrica varía. Sin embargo, es posible configurar ambas frecuencias para atenuar cualquier problema.
Leer más
Más enlaces, artículos y documentación útiles: