Configuration de lʼAPM avec le service Kubernetes

Présentation

Dans Kubernetes, les traceurs Datadog peuvent envoyer des données à lʼAgent Datadog de trois façons : Unix Domain Socket (UDS), lʼadresse IP du host ou le service Kubernetes. Chaque option garantit que lorsqu’un pod d’application envoie des données à lʼAPM, celles-ci sont acheminées vers un pod de lʼAgent Datadog sur le même nœud. Cette stratégie a pour but d’équilibrer le trafic et de garantir l’exactitude du tagging de vos données. Datadog vous recommande d’utiliser UDS pour envoyer des données.

Toutefois, si les volumes hostPath requis pour UDS (et les ports hostPort requis pour l’utilisation de lʼadresse IP du host) ne sont pas disponibles, vous pouvez utiliser le service Kubernetes comme alternative.

Ce guide décrit comment procéder à une configuration à lʼide dʼun service Kubernetes pour envoyer des données à lʼAgent Datadog.

Configuration de service

Dans Kubernetes 1.22, la fonction Internal Traffic Policy permet de définir la configuration internalTrafficPolicy: Local sur un service. Lorsqu’elle est définie, le trafic d’un pod d’application est dirigé vers le pod en aval du service sur le même nœud.

Si vous avez installé lʼAgent Datadog en utilisant le chart Helm de Datadog ou lʼOperator Datadog sur des clusters avec Kubernetes v1.22.0+, un service pour lʼAgent avec internalTrafficPolicy: Local est automatiquement créé pour vous. Vous devez également activer l’option du port APM pour votre Agent avec la configuration ci-dessous.

Configuration de l’Agent

Mettez à jour votre datadog-agent.yaml pour que features.apm.enabled devienne true.

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  #(...)
  features:
    apm:
      enabled: true

After making your changes, apply the new configuration by using the following command:

kubectl apply -n $DD_NAMESPACE -f datadog-agent.yaml

Mettez à jour votre datadog-values.yaml pour que datadog.apm.portEnabled devienne true.

datadog:
  apm:
    portEnabled: true

After making your changes, upgrade your Datadog Helm chart using the following command:

helm upgrade -f datadog-values.yaml <RELEASE NAME> datadog/datadog

Configuration de l’application

Vous pouvez configurer votre application pour qu’elle utilise le service Kubernetes en utilisant le contrôleur d’admission de lʼAgent de cluster ou en effectuant une configuration manuelle.

Contrôleur d’admission de lʼAgent de cluster

Le contrôleur d’admission de lʼAgent de cluster peut injecter la configuration de la connectivité de lʼAPM dans vos conteneurs. Les options sont hostip, socket ou service. Choisissez le mode service pour que le contrôleur d’admission ajoute la variable dʼenvironnement DD_AGENT_HOST pour le nom DNS du service.

Modifiez votre fichier datadog-agent.yaml comme suit :

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  #(...)
  features:
    apm:
      enabled: true
    admissionController:
      enabled: true
      agentCommunicationMode: service

After making your changes, apply the new configuration by using the following command:

kubectl apply -n $DD_NAMESPACE -f datadog-agent.yaml

Modifiez votre fichier datadog-values.yaml comme suit :

clusterAgent:
  admissionController:
    enabled: true
    configMode: service

After making your changes, upgrade your Datadog Helm chart using the following command:

helm upgrade -f datadog-values.yaml <RELEASE NAME> datadog/datadog

Remarque : dans les environnements en nœuds mixtes (Linux/Windows), lʼAgent de cluster et son contrôleur d’admission sont relatifs au déploiement de Linux. Cela peut entraîner l’injection de mauvaises variables dʼenvironnement pour la connectivité du service dans les pods Windows.

Configuration manuelle

Pour une configuration manuelle, définissez la variable dʼenvironnement DD_AGENT_HOST dans le manifeste de votre pod, avec une valeur de <SERVICE_NAME>.<SERVICE_NAMESPACE>.svc.cluster.local.

    #(...)
    spec:
      containers:
      - name: "<CONTAINER_NAME>"
        image: "<CONTAINER_IMAGE>"
        env:
          - name: DD_AGENT_HOST
            value: <SERVICE_NAME>.<SERVICE_NAMESPACE>.svc.cluster.local

Remplacez <SERVICE_NAME> par le nom du service et remplacez <SERVICE_NAMESPACE> par lʼespace de nommage du service.

Par exemple, si votre définition de votre service ressemble à ce qui suit :

apiVersion: v1
kind: Service
metadata:
  name: datadog
  namespace: monitoring
  labels:
    #(...)
spec:
  selector:
    app: datadog
  ports:
    - protocol: UDP
      port: 8125
      targetPort: 8125
      name: dogstatsdport
    - protocol: TCP
      port: 8126
      targetPort: 8126
      name: traceport
  internalTrafficPolicy: Local

Alors, définissez la valeur de DD_AGENT_HOST sur datadog.monitoring.svc.cluster.local.

    #(...)
    spec:
      containers:
      - name: "<CONTAINER_NAME>"
        image: "<CONTAINER_IMAGE>"
        env:
          - name: DD_AGENT_HOST
            value: datadog.monitoring.svc.cluster.local

Pour aller plus loin

Documentation, liens et articles supplémentaires utiles:

PREVIEWING: may/unit-testing