Escalado automático con Cluster Agent personalizado y métricas externas
El escalado automático horizontal de pods, introducido en Kubernetes v1.2, permite el escalado automático a partir de métricas básicas como CPU
, pero requiere un recurso llamado metrics-server
para ejecutarse junto a tu aplicación. A partir de Kubernetes v1.6, es posible el escalado automático a partir de métricas personalizadas.
Las métricas personalizadas son definidas por el usuario y se recopilan desde dentro del clúster. A partir de Kubernetes v1.10, se introdujo el soporte para métricas externas para escalar automáticamente cualquier métrica procedente de fuera de clúster, como las recopiladas por Datadog.
Primero debes registrar Cluster Agent como proveedor de métricas externas. A continuación, adapta tus HPA para que se basen en las métricas proporcionadas por Cluster Agent.
A partir de la v1.0.0, el Custom Metrics Server de Datadog Cluster Agent implementa el Proveedor de métricas externas para las métricas externas. En esta página, se explica cómo configurarlo y cómo escalar automáticamente tu carga de trabajo de Kubernetes en función de las métricas de Datadog.
Configuración
Requisitos
- Kubernetes >v1.10: debes registrar el recurso Proveedor de métricas externas en el servidor de la API.
- Activa la [capa de agregación] de Kubernetes3.
- Una Clave de API de Datadog y Clave de aplicación válidas.
Instalación
Para habilitar el servidor de métricas externas con tu Cluster Agent en Helm, actualiza tu archivo values.yaml con las siguientes configuraciones. Proporciona una Clave de API de Datadog válida, una clave de aplicación, y configura el clusterAgent.metricsProvider.enabled
en true
. Luego vuelve a desplegar tu tabla de Datadog Helm:
datadog:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
#(...)
clusterAgent:
enabled: true
# Habilite metricsProvider para poder escalar según las métricas en Datadog
metricsProvider:
# clusterAgent.metricsProvider.enabled
# Establézca esto como verdadero para habilitar el Proveedor de métricas
enabled: true
Esto actualiza automáticamente las configuraciones RBAC necesarias y establece las correspondientes Service
y APIService
para que Kubernetes las utilice.
Alternativamente, las claves pueden establecerse haciendo referencia a los nombres de Secrets
creados previamente que contienen las claves de datos api-key
y app-key
con las configuraciones datadog.apiKeyExistingSecret
y datadog.appKeyExistingSecret
.
Para habilitar el servidor de métricas externas con tu Cluster Agent gestionado por el Datadog Operator, primero configura el Datadog Operator. A continuación, proporciona una clave de API de Datadog válida, una clave de aplicación, y configura features.externalMetricsServer.enabled
en true
en tu recurso personalizado DatadogAgent
:
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
global:
credentials:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_API_KEY>
features:
externalMetricsServer:
enabled: true
Operator actualiza automáticamente las configuraciones RBAC necesarias y establece los correspondientes Service
y APIService
para que Kubernetes los utilice.
Las claves pueden establecerse alternativamente haciendo referencia a los nombres de Secrets
creados previamente y a las claves de datos que almacenan tus claves de API y de aplicación de Datadog.
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
global:
credentials:
apiSecret:
secretName: <SECRET_NAME>
keyName: <KEY_FOR_DATADOG_API_KEY>
appSecret:
secretName: <SECRET_NAME>
keyName: <KEY_FOR_DATADOG_APP_KEY>
features:
externalMetricsServer:
enabled: true
Custom Metrics Server
Para activar Custom Metrics Server, primero sigue las instrucciones para configurar el Datadog Cluster Agent dentro de tu clúster. Una vez que hayas verificado que el despliegue base se ha realizado correctamente, edita tu manifiesto Deployment
para el Datadog Cluster Agent con los siguientes pasos:
- Establece la variable de entorno
DD_EXTERNAL_METRICS_PROVIDER_ENABLED
en true
. - Asegúrate de tener ambas variables de entorno
DD_APP_KEY
y DD_API_KEY
establecidas. - Asegúrate de que tienes tu variable de entorno
DD_SITE
establecida para el sitio de Datadog:
. Por defecto es el sitio US
datadoghq.com
.
Registrar el servicio del proveedor de métricas externas
Una vez que Datadog Cluster Agent esté en funcionamiento, aplica algunas políticas RBAC adicionales y configura Service
para enrutar las solicitudes correspondientes.
Crea un Service
llamado datadog-custom-metrics-server
, exponiendo el puerto 8443
con el siguiente manifiesto custom-metric-server.yaml
:
kind: Service
apiVersion: v1
metadata:
name: datadog-custom-metrics-server
spec:
selector:
app: datadog-cluster-agent
ports:
- protocol: TCP
port: 8443
targetPort: 8443
Nota: Por defecto, Cluster Agent espera estas solicitudes a través del puerto 8443
. Sin embargo, si tu Cluster Agent Deployment
ha establecido la variable de entorno DD_EXTERNAL_METRICS_PROVIDER_PORT
en algún otro valor de puerto, cambia el targetPort
de este Service
en consecuencia.
Aplica este Service
ejecutando kubectl apply -f custom-metric-server.yaml
Descarga el archivo archivo de reglas RBAC rbac-hpa.yaml
.
Registra el Cluster Agent como proveedor de métricas externas aplicando este archivo:
kubectl apply -f rbac-hpa.yaml
Una vez habilitado, el Cluster Agent está listo para buscar métricas para el HPA. Hay dos opciones:
Datadog recomienda utilizar la opción DatadogMetric
. Aunque esto requiere un paso adicional de despliegue de DatadogMetric
CustomResourceDefinition (CRD), aporta mucha más flexibilidad en las consultas realizadas. Si no utilizas consultas de DatadogMetric
, tus HPA utilizan el formato de métricas externas nativo de Kubernetes, que el Cluster Agent traduce en una consulta de métrica de Datadog.
Si realizas un envío doble de tus métricas a varias organizaciones de Datadog, puedes configurar el Cluster Agent para obtener información de estos múltiples endpoints y lograr una alta disponibilidad. Para obtener más información, consulta la documentación Dual Shipping.
Escalado automático con consultas de DatadogMetric
Puedes escalar automáticamente una consulta de Datadog utilizando las versiones DatadogMetric
Custom Resource Definition (CRD) y Datadog Cluster Agent 1.7.0
o versiones posteriores. Este es un enfoque más flexible y te permite escalar con la consulta de Datadog exacta que utilizarías en la aplicación.
Requisitos
Para que el escalado automático funcione correctamente, las consultas personalizadas deben seguir estas reglas:
- La consulta debe ser sintácticamente correcta, de lo contrario impide la actualización de TODAS las métricas utilizadas para el escalado automático (detiene efectivamente el escalado automático).
- El resultado de la consulta debe mostrar solo una serie (de lo contrario, los resultados se consideran inválidos).
- La consulta debería devolver al menos dos puntos no nulos con marca de temporal (es posible utilizar una consulta que devuelva un único punto, aunque en este caso, el escalado automático podría utilizar puntos incompletos).
Nota: Aunque la consulta es arbitraria, las horas de inicio y fin siguen fijadas por defecto en Now() - 5 minutes
y Now()
.
Configuración de DatadogMetric CRD
La Definición personalizada de recursos (CRD) para el objeto DatadogMetric
puede ser añadida a tu clúster de Kubernetes usando Helm, Datadog Operator, o Daemonset:
Para activar el uso de DatadogMetric
CRD, actualiza tu configuración values.yaml de Helm para establecer clusterAgent.metricsProvider.useDatadogMetrics
en true
. A continuación, vuelve a desplegar tu tabla Helm de Datadog:
clusterAgent:
enabled: true
metricsProvider:
enabled: true
# clusterAgent.metricsProvider.useDatadogMetrics
# Habilitar el uso de DatadogMetric CRD para el escalado automático en consultas arbitrarias de Datadog
useDatadogMetrics: true
Nota: Esto intenta instalar DatadogMetric
CRD automáticamente. Si ese CRD ya existe antes de la instalación inicial de Helm, puede entrar en conflicto.
Esto actualiza automáticamente los archivos RBAC necesarios y dirige el Cluster Agent para gestionar estas consultas HPA a través de estos recursos DatadogMetric
.
Para activar el uso de DatadogMetric
CRD, actualiza tu recurso personalizado de DatadogAgent
y establece features.externalMetricsServer.useDatadogMetrics
en true
.
kind: DatadogAgent
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
global:
credentials:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_API_KEY>
features:
externalMetricsServer:
enabled: true
useDatadogMetrics: true
Operator actualiza automáticamente las configuraciones RBAC necesarias y dirige el Cluster Agent para gestionar estas consultas HPA a través de estos recursos DatadogMetric
.
Para activar el uso de DatadogMetric
CRD, sigue estos pasos adicionales:
Instala el DatadogMetric
CRD en tu clúster.
kubectl apply -f "https://raw.githubusercontent.com/DataDog/helm-charts/master/crds/datadoghq.com_datadogmetrics.yaml"
Actualiza el manifiesto RBAC de Datadog Cluster Agent, se ha actualizado para permitir el uso de DatadogMetric
CRD.
kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/cluster-agent-datadogmetrics/cluster-agent-rbac.yaml"
Establece el DD_EXTERNAL_METRICS_PROVIDER_USE_DATADOGMETRIC_CRD
en true
en el despliegue del Datadog Cluster Agent.
Cree el objeto DatadogMetric
Una vez añadido el recurso personalizado DatadogMetric
a tu clúster, puedes crear objetos DatadogMetric
para que tus HPA los referencien. Aunque cualquier HPA puede hacer referencia a cualquier DatadogMetric
, Datadog recomienda crearlos en el mismo espacio de nombres que tu HPA.
Nota: Varias HPA pueden utilizar el mismo DatadogMetric
.
Puedes crear un DatadogMetric
con el siguiente manifiesto:
apiVersion: datadoghq.com/v1alpha1
kind: DatadogMetric
metadata:
name: <DATADOG_METRIC_NAME>
spec:
query: <CUSTOM_QUERY>
Ejemplo de objeto DatadogMetric
Por ejemplo, un objeto DatadogMetric
para el escalado automático de un despliegue NGINX basado en la métrica nginx.net.request_per_s
de Datadog:
apiVersion: datadoghq.com/v1alpha1
kind: DatadogMetric
metadata:
name: nginx-requests
spec:
query: max:nginx.net.request_per_s{kube_container_name:nginx}.rollup(60)
Utiliza DatadogMetric en HPA
Una vez configurado tu Cluster Agent y creado DatadogMetric
, actualiza tu HPA para que haga referencia a este DatadogMetric
en relación con su espacio de nombres y su nombre. El formato general es especificar la métrica para la HPA como type: External
y especificar el nombre de métrica como datadogmetric@<NAMESPACE>:<DATADOG_METRIC_NAME>
.
Ejemplo de HPA con DatadogMetric
Una HPA que utiliza el DatadogMetric
denominado nginx-requests
, suponiendo que ambos objetos se encuentran en el espacio de nombres nginx-demo
.
Uso de apiVersion: autoscaling/v2
:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginxext
spec:
minReplicas: 1
maxReplicas: 3
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
metrics:
- type: External
external:
metric:
name: datadogmetric@nginx-demo:nginx-requests
target:
type: Value
value: 9
Uso de apiVersion: autoscaling/v2beta1
:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: nginxext
spec:
minReplicas: 1
maxReplicas: 3
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
metrics:
- type: External
external:
metricName: datadogmetric@nginx-demo:nginx-requests
targetValue: 9
En estos manifiestos:
- La HPA está configurada para escalar automáticamente el despliegue denominado
nginx
. - El número máximo de réplicas creadas es
3
y el mínimo es 1
. - La HPA se basa en el
DatadogMetric
nginx-requests
en el espacio de nombres nginx-demo
.
Una vez que el DatadogMetric
está vinculado a una HPA, el Datadog Cluster Agent lo marca como activo. A continuación, Cluster Agent realiza solicitudes a Datadog para la consulta, almacena los resultados en el objeto DatadogMetric
y proporciona los valores a la HPA.
Escalado automático sin consultas de DatadogMetric
Si no deseas escalar automáticamente con DatadogMetric
, puedes seguir creando tus HPA con el formato nativo de Kubernetes. El Cluster Agent convierte el formato HPA en una consulta de métrica de Datadog.
Una vez que tengas el Datadog Cluster Agent funcionando y el servicio registrado, crea un manifiesto HPA y especifica type: External
para tus métricas. Esto notifica a la HPA que extraiga las métricas del servicio Datadog Cluster Agent:
spec:
metrics:
- type: External
external:
metricName: "<METRIC_NAME>"
metricSelector:
matchLabels:
<TAG_KEY>: <TAG_VALUE>
Ejemplo de HPA sin DatadogMetric
Un manifiesto HPA para el escalado automático de un despliegue NGINX basado en la métrica de Datadog nginx.net.request_per_s
usando apiVersion: autoscaling/v2
:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginxext
spec:
minReplicas: 1
maxReplicas: 3
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
metrics:
- type: External
external:
metric:
name: nginx.net.request_per_s
target:
type: Value
value: 9
A continuación, se muestra el mismo manifiesto HPA anterior utilizando apiVersion: autoscaling/v2beta1
:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: nginxext
spec:
minReplicas: 1
maxReplicas: 3
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
metrics:
- type: External
external:
metricName: nginx.net.request_per_s
metricSelector:
matchLabels:
kube_container_name: nginx
targetValue: 9
En estos manifiestos:
- La HPA está configurada para el escalado automático del despliegue denominado
nginx
. - El número máximo de réplicas creadas es
3
y el mínimo es 1
. - La métrica utilizada es
nginx.net.request_per_s
y el contexto es kube_container_name: nginx
. Este formato corresponde al de las métricas de Datadog.
Cada 30 segundos, Kubernetes consulta a Datadog Cluster Agent para obtener el valor de esta métrica y se hace el escalado automático proporcionalmente si es necesario. Para casos de uso avanzados, es posible tener varias métricas en la misma HPA. Como se indica en el escalado automático horizontal del pod de Kubernetes, se elige el mayor de los valores propuestos.
Migración
Las HPA existentes se migran automáticamente utilizando métricas externas.
Cuando se establece DD_EXTERNAL_METRICS_PROVIDER_USE_DATADOGMETRIC_CRD
en true
pero aún se tienen HPA que no hacen referencia a DatadogMetric
, la sintaxis normal (sin hacer referencia a DatadogMetric
mediante datadogmetric@...
) sigue siendo compatible.
Para ello, Datadog Cluster Agent crea automáticamente recursos de DatadogMetric
en su propio espacio de nombres (su nombre empieza por dcaautogen-
), lo que permite una transición fluida a DatadogMetric
.
Si decides migrar una HPA posteriormente para hacer referencia a un DatadogMetric
, Datadog Cluster Agent limpia el recurso generado automáticamente al cabo de unas horas.
Consultas al Cluster Agent
El Cluster Agent realiza las consultas de los objetos DatadogMetric
cada 30 segundos. Cluster Agent también agrupa en lotes de 35 las consultas realizadas a la métrica. Por lo tanto, se incluyen 35 consultas DatadogMetric
en una única solicitud a la API de métricas de Datadog.
Al agrupar estas consultas por lotes, Cluster Agent puede realizarlas con mayor eficacia y evitar los límites de velocidad.
Esto significa que Cluster Agent realiza aproximadamente 120 solicitudes API por hora por cada 35 objetos DatadogMetric
. A medida que se añaden más objetos DatadogMetric
o se añade la funcionalidad de escalado automático a clústeres de Kubernetes adicionales, aumenta el número de llamadas para buscar métricas dentro de la misma organización.
Cluster Agent también consulta los últimos cinco minutos de datos por defecto para cada una de estas consultas de métrica. Esto es para asegurar que Cluster Agent está escalando datos recientes. Sin embargo, si tus consultas de métrica se basan en datos de una de las integraciones en la nube (AWS, Azure, GCP, etc.), estos se obtienen con un ligero retraso y no se incluyen dentro del intervalo de cinco minutos. En estos casos, proporciona las variables de entorno al Cluster Agent para aumentar el intervalo de fechas y la antigüedad de los datos permitidos para las consultas de métricas.
- name: DD_EXTERNAL_METRICS_PROVIDER_BUCKET_SIZE
value: "900"
- name: DD_EXTERNAL_METRICS_PROVIDER_MAX_AGE
value: "900"
Resolución de problemas
Estado de DatadogMetric
Datadog Cluster Agent se encarga de actualizar el subrecurso status
de todos los recursos DatadogMetric
para reflejar los resultados de las consultas a Datadog. Esta es la principal fuente de información para entender qué ocurre si algo está fallando. Puedes ejecutar lo siguiente para obtener esta información:
kubectl describe datadogmetric <RESOURCE NAME>
Ejemplo
La parte status
de un DatadogMetric
:
status:
conditions:
- lastTransitionTime: "2020-06-22T14:38:21Z"
lastUpdateTime: "2020-06-25T09:21:00Z"
status: "True"
type: Active
- lastTransitionTime: "2020-06-25T09:00:00Z"
lastUpdateTime: "2020-06-25T09:21:00Z"
status: "True"
type: Valid
- lastTransitionTime: "2020-06-22T14:38:21Z"
lastUpdateTime: "2020-06-25T09:21:00Z"
status: "True"
type: Updated
- lastTransitionTime: "2020-06-25T09:00:00Z"
lastUpdateTime: "2020-06-25T09:21:00Z"
status: "False"
type: Error
currentValue: "1977.2"
Las cuatro condiciones te dan una idea del estado actual de tu DatadogMetric
:
Active
: Datadog considera que un DatadogMetric
está activo si al menos una HPA hace referencia a él. Los DatadogMetrics
inactivos no se actualizan para minimizar el uso de la API.Valid
: Datadog considera que un DatadogMetric
es válido cuando la respuesta para la consulta asociada es válida. Un estado no válido probablemente significa que tu consulta personalizada no es semánticamente correcta. Consulta el campo Error
para obtener más detalles.Updated
: esta condición se actualiza siempre cuando el Datadog Cluster Agent toca un DatadogMetric
.Error
: si procesar este DatadogMetric
desencadena un error, esta condición es verdadera y contiene los detalles del error.
currentValue
es el valor recogido en Datadog y devuelto a las HPA.
Value frente a AverageValue para la métrica de destino
Las HPA de este ejemplo utilizan el tipo de destino Value
en lugar de AverageValue
. Ambas opciones son compatibles. Ajusta tus consultas de métrica de Datadog en consecuencia.
Cuando se utiliza Value
, el valor de métrica devuelto por la consulta de métrica de Datadog se proporciona exactamente tal cual a la HPA para su decisión de escalado. Cuando se utiliza AverageValue
, el valor de métrica devuelto se divide por el número actual de pods. Configura tu <Metric Value>
en función de cómo deseas que tu HPA escale en función de tu consulta y el valor devuelto.
Utilizando apiVersion: autoscaling/v2
, la configuración de métrica de destino para Value
tiene el siguiente aspecto:
metrics:
- type: External
external:
metric:
name: datadogmetric@<NAMESPACE>:<DATADOG_METRIC_NAME>
target:
type: Value
value: <METRIC_VALUE>
Por su parte, AverageValue
luce así:
metrics:
- type: External
external:
metric:
name: datadogmetric@<NAMESPACE>:<DATADOG_METRIC_NAME>
target:
type: AverageValue
averageValue: <METRIC_VALUE>
Para apiVersion: autoscaling/v2beta1
, las opciones respectivas son targetValue
y targetAverageValue
.
Leer más
Más enlaces, artículos y documentación útiles: