Detección de nombres de host en contenedores
Muchas de las funciones de Datadog dependen de que el Agent proporcione un nombre de host correcto para los hosts monitorizados. Aunque esto resulta sencillo cuando el Agent se ejecuta directamente en un host, el proceso de resolución del nombre de host es diferente cuando el Agent se ejecuta en un entorno contenedorizado.
A partir de la versión 7.40, el Agent reconoce si la resolución de nombre de host ha fallado en entornos contenedorizados. Sin un nombre de host resuelto, el Agent se cierra con un error poco después de iniciarse.
Cuando esto sucede, se muestra el siguiente mensaje de ERROR
en los logs:
Error while getting hostname, exiting: unable to reliably determine the host name. You can define one in the agent config file or in your hosts file
Normalmente, este error indica que parte de la configuración del Agent no es correcta. Usa la siguiente información para resolver varios de los casos más frecuentes con este tipo de error.
Errores en nombres de host con Kubernetes
En Kubernetes, un error en el nombre de host suele indicar que el Agent no puede acceder:
- a la API de Kubelet;
- al endpoint de metadatos del proveedor de nube;
- a la API de tiempo de ejecución del contenedor.
Algunas distribuciones de Kubernetes necesitan una configuración especial, así que comprueba que la tuya se adapte a la configuración recomendada de Kubernetes.
Acceder a la API de Kubelet
Asegúrate de que el Agent pueda acceder a la API de Kubelet. Cuando puede, el Agent muestra lo siguiente en el log:
Successful configuration found for Kubelet, using URL: ******
Los permisos de la configuración del control de acceso basado en roles (RBAC) de Kubernetes se configuran automáticamente mediante nuestro Helm chart oficial, el Datadog Operator y nuestros manifiestos oficiales. Si utilizas una solución diferente para implementar el Agent, asegúrate de que los siguientes permisos aparecen en un Role
o ClusterRole
que esté vinculado a la cuenta de servicio del Agent:
rules:
- apiGroups: # Kubelet connectivity
- ""
resources:
- nodes/metrics
- nodes/spec
- nodes/proxy
- nodes/stats
verbs:
- get
El error más común que impide la conexión a la API de Kubelet es la verificación del certificado TLS de Kubelet. En muchas distribuciones de Kubernetes, se da porque el certificado de Kubelet:
- no está firmado por el clúster CA;
- no contiene un nombre alternativo del firmante (SAN) que se corresponda con la dirección en la que se encuentra.
Esto hace que el Agent no pueda conectarse a la API de Kubelet a través de HTTPS, ya que la verificación TLS está activada de forma predeterminada.
Puedes desactivar la verificación TLS utilizando parámetros correspondientes o configurando la variable DD_KUBELET_TLS_VERIFY
para todos los contenedores en el manifiesto del Agent:
values.yaml
personalizado:
datadog:
kubelet:
tlsVerify: false
Recurso DatadogAgent
de Kubernetes:
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
global:
kubelet:
tlsVerify: false
Manifiesto DaemonSet
:
apiVersion: apps/v1
metadata:
name: datadog
spec:
template:
spec:
containers:
- name: agent
env:
- name: DD_KUBELET_TLS_VERIFY
value: "false"
Si trabajas con AWS, Google Cloud o Azure, el Agent puede utilizar un endpoint de metadatos para obtener el nombre de host.
Acceder al endpoint de metadatos del proveedor de nube permite a Datadog asociar correctamente los datos del Agent con los datos de integración de soluciones en la nube dentro de la aplicación.
Normalmente, este problema indica que el acceso al endpoint de metadatos se ha restringido.
Por ejemplo, en AWS, esto podría deberse al parámetro de límite de saltos.
Acceder a la API de tiempo de ejecución del contenedor
Utiliza esta solución solo en el improbable caso de que no quieras bajo ningún concepto que el Agent se conecte a la API de Kubelet y si no trabajas con un proveedor de nube compatible de los indicados anteriormente.
En ese caso, puedes utilizar la API descendente para definir DD_HOSTNAME
:
values.yaml
personalizado:
datadog:
env:
- name: DD_HOSTNAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
Recurso DatadogAgent
de Kubernetes:
apiVersion: datadoghq.com/v2alpha1
metadata:
name: datadog
spec:
override:
nodeAgent:
env:
- name: DD_HOSTNAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
Manifiesto DaemonSet
apiVersion: apps/v1
metadata:
name: datadog
spec:
template:
spec:
containers:
- name: agent
env:
- name: DD_HOSTNAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
Errores de nombre de hosts de mv Amazon ECS y Docker
Cuando el Agent se ejecuta en Docker en un proveedor de nube, un error en el nombre de host suele indicar que el Agent no puede acceder:
- a la API de tiempo de ejecución del contenedor;
- al endpoint de metadatos del proveedor de nube.
Acceder a la API de tiempo de ejecución del contenedor
Permite que el Agent se conecte al socket de Docker:
Asegúrate de que el socket de Docker está integrado en tu comando docker run
:
-v /var/run/docker.sock:/var/run/docker.sock:ro
Si trabajas con AWS, Google Cloud o Azure, el Agent puede utilizar un endpoint de metadatos para obtener el nombre de host.
Acceder al endpoint de metadatos del proveedor de nube permite a Datadog asociar correctamente los datos del Agent con los datos de integración de soluciones en la nube dentro de la aplicación.
Normalmente, este problema indica que el acceso al endpoint de metadatos se ha restringido.
Por ejemplo, en AWS, esto podría deberse al parámetro de límite de saltos.
Errores en el nombre de host en entornos de CI, configuraciones sidecar y entornos sin acceso al tiempo de ejecución del contenedor
Cuando ejecutas el Agent en un entorno de integración continua o CI (lo que quiere decir que el Agent es efímero) o como sidecar sin acceso a
la información del host, hay dos opciones disponibles:
- Definir
DD_HOSTNAME
(hostname
en datadog.yaml
) explícitamente en el nombre de host:
-e DD_HOSTNAME=$(hostname)
- Definir
DD_HOSTNAME_TRUST_UTS_NAMESPACE
(hostname_trust_uts_namespace
en datadog.yaml
):
Esta opción está disponible en el Datadog Agent 7.42.0 y posteriores.
-e DD_HOSTNAME_TRUST_UTS_NAMESPACE=true
Con esta configuración, el Agent utiliza el nombre de host que figura en el contenedor (normalmente, el nombre del contenedor o el nombre del pod).
Nota: No se aplica a soluciones serverless como Fargate.
Si las soluciones anteriores no arreglan los errores de la configuración del Agent, ponte en contacto con el equipo de asistencia de Datadog.