Distribuciones de Kubernetes
Esta sección intenta documentar aspectos específicos y proporcionar una buena base para la configuración de las principales distribuciones de Kubernetes.
Estas configuraciones se pueden personalizar para añadir cualquier característica de Datadog.
AWS Elastic Kubernetes Service (EKS)
No es necesaria ninguna configuración específica.
Si utilizas el sistema operativo AWS Bottlerocket en tus nodos, añade lo siguiente para habilitar la monitorización de contenedores (check containerd
):
values.yaml
personalizado:
datadog:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
criSocketPath: /run/dockershim.sock
env:
- name: DD_AUTOCONFIG_INCLUDE_FEATURES
value: "containerd"
En un clúster de EKS, puedes instalar el Operator utilizando [Helm][5] o como un [complemento EKS][6].
La siguiente configuración está pensada para funcionar con cualquiera de las dos configuraciones (Helm o complemento EKS) cuando el Agent está instalado en el mismo espacio de nombres que el Datadog Operator.
kind: DatadogAgent
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
features:
admissionController:
enabled: false
externalMetricsServer:
enabled: false
useDatadogMetrics: false
global:
credentials:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
criSocketPath: /run/dockershim.sock
override:
clusterAgent:
image:
name: gcr.io/datadoghq/cluster-agent:latest
Azure Kubernetes Service (AKS)
AKS requiere una configuración específica para la integración Kubelet
debido a la forma en que AKS ha configurado los certificados SSL. Además, la función opcional [Controlador de admisión1 requiere una configuración específica para evitar errores al reconciliar el webhook.
values.yaml
personalizado:
datadog:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
# Requerido a partir del Agent v7.35. Consulta la nota sobre el certificado kubelet más abajo.
kubelet:
tlsVerify: false
providers:
aks:
enabled: true
La opción providers.aks.enabled
establece la variable de entorno necesaria DD_ADMISSION_CONTROLLER_ADD_AKS_SELECTORS="true"
.
Recurso Kubernetes del Datadog Agent:
kind: DatadogAgent
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
features:
admissionController:
enabled: true
global:
credentials:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
kubelet:
tlsVerify: false
override:
clusterAgent:
containers:
cluster-agent:
env:
- name: DD_ADMISSION_CONTROLLER_ADD_AKS_SELECTORS
value: "true"
kubelet.tlsVerify=false
establece la variable de entorno DD_KUBELET_TLS_VERIFY=false
para que puedas desactivar la verificación del certificado del servidor.
Certificado kubelet de AKS
Existe un problema conocido con el formato del certificado kubelet de AKS en versiones de imagen de nodo más antiguas. A partir del Agent v7.35, es necesario utilizar tlsVerify: false
, ya que los certificados no contenían un nombre alternativo de sujeto (SAN) válido.
Si todos los nodos de tu clúster de AKS utilizan una versión de imagen de nodo compatible, puedes utilizar la verificación TLS Kubelet. Tu versión debe ser igual o superior a las versiones enumeradas aquí para la versión 2022-10-30. También debes actualizar tu configuración de Kubelet para utilizar el nombre del nodo en la dirección y en el mapa en la ruta personalizada del certificado.
values.yaml
personalizado:
datadog:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
# Requiere una versión de imagen de nodo compatible
kubelet:
host:
valueFrom:
fieldRef:
fieldPath: spec.nodeName
hostCAPath: /etc/kubernetes/certs/kubeletserver.crt
providers:
aks:
enabled: true
Recurso Kubernetes del Datadog Agent:
kind: DatadogAgent
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
features:
admissionController:
enabled: true
global:
credentials:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
kubelet:
host:
fieldRef:
fieldPath: spec.nodeName
hostCAPath: /etc/kubernetes/certs/kubeletserver.crt
override:
clusterAgent:
containers:
cluster-agent:
env:
- name: DD_ADMISSION_CONTROLLER_ADD_AKS_SELECTORS
value: "true"
El uso de spec.nodeName
retiene la verificación TLS. En algunas configuraciones, la resolución DNS para spec.nodeName
en pods podría no funcionar en AKS. Esto ha sido reportado en todos los nodos AKS de Windows y en los casos en que el clúster está configurado en una red virtual utilizando DNS personalizado en nodos Linux. En ese caso, utiliza la primera configuración de AKS proporcionada: elimina cualquier configuración para la ruta del host Kubelet (por defecto es status.hostIP
) y utiliza tlsVerify: false
. Esta configuración es necesaria. NO configures la ruta del host Kubelet y tlsVerify: false
juntos.
Google Kubernetes Engine (GKE)
GKE se puede configurar con dos modos de funcionamiento diferentes:
- Standard (Estándar): tú gestionas la infraestructura subyacente del clúster, proporcionándole flexibilidad a la configuración de tu nodo.
- Autopilot (Piloto automático): GKE suministra y gestiona la infraestructura subyacente del clúster, incluidos los nodos y los grupos de nodos, lo que te ofrece un clúster optimizado que no necesita de tu intervención.
En función del modo de funcionamiento de tu clúster, el Datadog Agent se debe configurar de diferentes formas.
Standard (Estándar)
A partir del Agent v7.26, no se requiere ninguna configuración específica para GKE (tanto si ejecutas Docker
como si ejecutas containerd
).
Nota: Cuando se utiliza COS (Container-Optimized OS), OOM Kill
basado en eBPF y los checks TCP Queue Length
son compatibles a partir de la versión 3.0.1 de los charts de Helm. Para habilitar estos checks, configura los siguientes parámetros:
datadog.systemProbe.enableDefaultKernelHeadersPaths
en false
.
Autopilot (Piloto automático)
Autopilot de GKE requiere algunas configuraciones que se muestran a continuación.
Datadog te recomienda que especifiques límites de recursos para el contenedor del Agent. El Autopilot establece un límite por defecto relativamente bajo (50m de CPU, 100Mi de memoria), que puede llevar al contenedor del Agent rápidamente a OOMKill, dependiendo de tu entorno. Si procede, especifica también límites de recursos para los contenedores Trace Agent y Process Agent. Además, es posible que quieras crear una clase de prioridad para que el Agent garantice que está programado.
values.yaml
personalizado:
datadog:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
clusterName: <CLUSTER_NAME>
# Sitio de la ingesta de Datadog para el envío de datos del Agent a (ejemplo: `us3.datadoghq.com`)
# El valor por defecto es `datadoghq.com' (the US1 site)
# Documentación: https://docs.datadoghq.com/getting_started/site/
site: <DATADOG_SITE>
agents:
containers:
agent:
# recursos para el contenedor del Agent
resources:
requests:
cpu: 200m
memory: 256Mi
traceAgent:
# recursos para el contenedor del Trace Agent
resources:
requests:
cpu: 100m
memory: 200Mi
processAgent:
# recursos para el contenedor del Process Agent container
resources:
requests:
cpu: 100m
memory: 200Mi
priorityClassCreate: true
providers:
gke:
autopilot: true
Pods e instancias de spot
El uso de pods de spot en clústeres Autopilot GKE contamina los nodos GKE. Si quieres utilizar pods de spot, debes realizar una configuración adicional para proporcionar tolerancias al Datadog Agent.
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
global:
credentials:
apiKey: <DATADOG_API_KEY>
override:
nodeAgent:
tolerations:
- effect: NoSchedule
key: cloud.google.com/gke-spot
operator: Equal
value: "true"
agents:
#(...)
# agents.tolerations -- Permitir al DaemonSet programar en nodos contaminados (requiere Kubernetes v1.6 o anteriores)
tolerations:
- effect: NoSchedule
key: cloud.google.com/gke-spot
operator: Equal
value: "true"
Nota: La monitorización del rendimiento de redes no es compatible con el Autopilot GKE.
Red Hat OpenShift
OpenShift viene con seguridad reforzada por defecto (SELinux, SecurityContextConstraints), por lo que requiere una configuración específica:
- Crear SCC para Node Agent y Cluster Agent
- Ruta de socket CRI específica ya que OpenShift utiliza el tiempo de ejecución de contenedor CRI-O
- Es posible que los certificados de la API de Kubelet no siempre estén firmados por la CA de clústeres
- Se requieren tolerancias para programar el Node Agent en los nodos
master
y infra
- Se debe establecer el nombre del clúster ya que no puede recuperarse automáticamente del proveedor de nube
Este configuración es compatible con OpenShift 3.11 y OpenShift 4, pero funciona mejor con OpenShift 4.
values.yaml
personalizado:
datadog:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
clusterName: <CLUSTER_NAME>
criSocketPath: /var/run/crio/crio.sock
# Dependiendo de tu configuración DNS/SSL, puede que no sea posible verificar el certificado kubelet correctamente
# Si tienes la CA correcta, puedes cambiarla a true
kubelet:
tlsVerify: false
agents:
podSecurity:
securityContextConstraints:
create: true
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
operator: Exists
- effect: NoSchedule
key: node-role.kubernetes.io/infra
operator: Exists
clusterAgent:
podSecurity:
securityContextConstraints:
create: true
kube-state-metrics:
securityContext:
enabled: false
Cuando se utiliza el Datadog Operator en OpenShift, se recomienda instalarlo a través de OperatorHub o RedHat Marketplace.
El objetivo de los siguientes parámetros es funcionar con esta configuración (debido a la configuración de SCC/ServiceAccount), cuando el
Agent se instala en el mismo espacio de nombres que el Datadog Operator.
kind: DatadogAgent
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
features:
logCollection:
enabled: false
liveProcessCollection:
enabled: false
liveContainerCollection:
enabled: true
apm:
enabled: false
cspm:
enabled: false
cws:
enabled: false
npm:
enabled: false
admissionController:
enabled: false
externalMetricsServer:
enabled: false
useDatadogMetrics: false
port: 8443
global:
credentials:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
clusterName: <CLUSTER_NAME>
kubelet:
tlsVerify: false
criSocketPath: /var/run/crio/crio.sock
override:
clusterAgent:
image:
name: gcr.io/datadoghq/cluster-agent:latest
containers:
cluster-agent:
securityContext:
readOnlyRootFilesystem: false
nodeAgent:
serviceAccountName: datadog-agent-scc
securityContext:
runAsUser: 0
seLinuxOptions:
level: s0
role: system_r
type: spc_t
user: system_u
image:
name: gcr.io/datadoghq/agent:latest
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/infra
operator: Exists
effect: NoSchedule
Nota: La anulación del contexto de seguridad del Agent de nodo es necesaria para la recopilación de logs y de trazas de APM con el socket /var/run/datadog/apm/apm.socket
. Si estas funciones no están activadas, puedes omitir esta anulación.
Rancher
Las instalaciones Rancher son similares a las instalaciones Kubernetes vainilla y sólo requieren algunos cambios menores en la configuración:
- Se requieren tolerancias para programar el Agent de nodo en los nodos
controlplane
y etcd
- Se debe establecer el nombre del clúster, ya que no puede recuperarse automáticamente del proveedor de nube
values.yaml
personalizado:
datadog:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
clusterName: <CLUSTER_NAME>
kubelet:
tlsVerify: false
agents:
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/controlplane
operator: Exists
- effect: NoExecute
key: node-role.kubernetes.io/etcd
operator: Exists
Recurso Kubernetes del Datadog Agent:
kind: DatadogAgent
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
features:
logCollection:
enabled: false
liveProcessCollection:
enabled: false
liveContainerCollection:
enabled: true
apm:
enabled: false
cspm:
enabled: false
cws:
enabled: false
npm:
enabled: false
admissionController:
enabled: false
externalMetricsServer:
enabled: false
useDatadogMetrics: false
global:
credentials:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
clusterName: <CLUSTER_NAME>
kubelet:
tlsVerify: false
override:
clusterAgent:
image:
name: gcr.io/datadoghq/cluster-agent:latest
nodeAgent:
image:
name: gcr.io/datadoghq/agent:latest
tolerations:
- key: node-role.kubernetes.io/controlplane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/etcd
operator: Exists
effect: NoExecute
Oracle Container Engine for Kubernetes (OKE)
No es necesaria ninguna configuración específica.
Para activar la monitorización de contenedores añade lo siguiente (check containerd
):
values.yaml
personalizado:
datadog:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
criSocketPath: /run/dockershim.sock
env:
- name: DD_AUTOCONFIG_INCLUDE_FEATURES
value: "containerd"
Recurso Kubernetes del Datadog Agent:
kind: DatadogAgent
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
features:
admissionController:
enabled: false
externalMetricsServer:
enabled: false
useDatadogMetrics: false
global:
credentials:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
criSocketPath: /run/dockershim.sock
override:
clusterAgent:
image:
name: gcr.io/datadoghq/cluster-agent:latest
Puedes encontrar más ejemplos de values.yaml
en el repositorio de charts de Helm
Puedes encontrar más ejemplos de DatadogAgent
en el repositorio del Datadog Operator
vSphere Tanzu Kubernetes Grid (TKG)
TKG requiere algunos pequeños cambios en su configuración, que se muestran a continuación. Por ejemplo, se requiere establecer una tolerancia para que el controlador programe el Agent de nodo en los nodos master
.
values.yaml
personalizado:
datadog:
apiKey: <DATADOG_API_KEY>
appKey: <DATADOG_APP_KEY>
kubelet:
# Establecer tlsVerify como falso, ya que los certificados kubelet son auto-firmados
tlsVerify: false
# Deshabilitar la instalación de charts de dependencia `kube-state-metrics`.
kubeStateMetricsEnabled: false
# Enable the new `kubernetes_state_core` check.
kubeStateMetricsCore:
enabled: true
# Añadir una tolerancia para que el Agent pueda ser programado en nodos del plano de control:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
Recurso Kubernetes del Datadog Agent:
kind: DatadogAgent
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
features:
eventCollection:
collectKubernetesEvents: true
kubeStateMetricsCore:
enabled: true
global:
credentials:
apiSecret:
secretName: datadog-secret
keyName: api-key
appSecret:
secretName: datadog-secret
keyName: app-key
kubelet:
tlsVerify: false
override:
nodeAgent:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
Más enlaces, artículos y documentación útiles: