Kubernetes et intégrations

Cette page couvre comment installer et configurer des intégrations pour votre infrastructure Kubernetes en utilisant une fonctionnalité de Datadog connue sous le nom de Autodiscovery. Cela vous permet d’utiliser variables comme %%host%% pour peupler dynamiquement vos paramètres de configuration. Pour une explication détaillée du fonctionnement d’Autodiscovery, consultez Getting Started with Containers: Autodiscovery. Pour des options avancées d’Autodiscovery, telles que l’exclusion de certains conteneurs d’Autodiscovery ou la tolérance des pods non prêts, consultez Container Discovery Management.

Si vous utilisez Docker ou Amazon ECS, consultez Docker et intégrations.

Certaines intégrations Datadog ne fonctionnent pas avec l'autodécouverte car elles nécessitent soit des données d'arbre de processus, soit un accès au système de fichiers : Ceph, Varnish, Postfix, Cassandra Nodetool, et Gunicorn.

Pour surveiller les intégrations qui ne sont pas compatibles avec l'autodécouverte, vous pouvez utiliser un exportateur Prometheus dans le pod pour exposer un point de terminaison HTTP, puis utiliser l'intégration OpenMetrics (qui prend en charge l'autodécouverte) pour trouver le pod et interroger le point de terminaison.

Configurez votre intégration

Certaines intégrations nécessitent des étapes de configuration, telles que la création d’un jeton d’accès ou l’octroi d’une autorisation de lecture à l’Agent Datadog. Suivez les instructions dans la section Setup de la documentation de votre intégration.

Intégrations communautaires

Pour utiliser une intégration qui n’est pas fournie avec l’Agent Datadog, vous devez créer une image personnalisée contenant l’intégration souhaitée. Consultez Utiliser des intégrations communautaires pour les instructions.

Configuration

Certaines intégrations couramment utilisées sont livrées avec une configuration par défaut pour Autodiscovery. Consultez Autodiscovery auto-configuration pour plus de détails, y compris une liste des intégrations auto-configurées et leurs fichiers de configuration par défaut correspondants. Si votre intégration figure dans cette liste et que la configuration par défaut est suffisante pour votre cas d’utilisation, aucune action supplémentaire n’est requise.

Sinon :

  1. Choisissez une méthode de configuration (annotations de pod Kubernetes, un fichier local, un ConfigMap, un magasin clé-valeur, un manifeste Datadog Operator ou un graphique Helm) qui convient à votre cas d’utilisation.
  2. Référez-vous au format de modèle pour votre méthode choisie. Chaque format contient des espaces réservés, tels que <CONTAINER_NAME>.
  3. Fournissez des valeurs pour ces espaces réservés.

Si vous définissez vos pods Kubernetes directement avec kind: Pod, ajoutez les annotations de chaque pod directement sous sa section metadata :

Autodiscovery annotations v2 (pour Datadog Agent v7.36+)

apiVersion: v1
kind: Pod
# (...)
metadata:
  name: '<POD_NAME>'
  annotations:
    ad.datadoghq.com/<CONTAINER_NAME>.checks: |
      {
        "<INTEGRATION_NAME>": {
          "init_config": <INIT_CONFIG>,
          "instances": [<INSTANCES_CONFIG>]
        }
      }
    ad.datadoghq.com/<CONTAINER_NAME>.logs: '[<LOGS_CONFIG>]'
    # (...)
spec:
  containers:
    - name: '<CONTAINER_NAME>'
# (...)

Autodiscovery annotations v1

apiVersion: v1
kind: Pod
# (...)
metadata:
  name: '<POD_NAME>'
  annotations:
    ad.datadoghq.com/<CONTAINER_NAME>.check_names: '[<INTEGRATION_NAME>]'
    ad.datadoghq.com/<CONTAINER_NAME>.init_configs: '[<INIT_CONFIG>]'
    ad.datadoghq.com/<CONTAINER_NAME>.instances: '[<INSTANCES_CONFIG>]'
    ad.datadoghq.com/<CONTAINER_NAME>.logs: '[<LOGS_CONFIG>]'
    # (...)
spec:
  containers:
    - name: '<CONTAINER_NAME>'
# (...)

Si vous définissez des pods indirectement (avec des déploiements, des ReplicaSets ou des ReplicationControllers), ajoutez les annotations de pod sous spec.template.metadata.

Vous pouvez stocker des modèles Autodiscovery en tant que fichiers locaux dans le répertoire monté conf.d (/etc/datadog-agent/conf.d). Vous devez redémarrer vos conteneurs Agent chaque fois que vous modifiez, ajoutez ou supprimez des modèles.

  1. Créez un fichier conf.d/<INTEGRATION_NAME>.d/conf.yaml sur votre hôte :

    ad_identifiers:
      - <CONTAINER_IMAGE>
    
    init_config:
      <INIT_CONFIG>
    
    instances:
      <INSTANCES_CONFIG>
    
    logs:
      <LOGS_CONFIG>
    
  2. Montez votre dossier conf.d/ de l’hôte dans le dossier conf.d de l’Agent conteneurisé.

    Pour Datadog Operator :

    spec:
      override:
        nodeAgent:
          volumes:
            - hostPath:
                path: <PATH_TO_LOCAL_FOLDER>/conf.d
              name: confd
    

    Pour Helm :

    agents:
      volumes:
      - hostPath:
          path: <PATH_TO_LOCAL_FOLDER>/conf.d
        name: confd
      volumeMounts:
      - name: confd
        mountPath: /conf.d
    

Vous pouvez utiliser ConfigMaps pour définir des configurations externes et les monter par la suite.

kind: ConfigMap
apiVersion: v1
metadata:
  name: "<NAME>-config-map"
  namespace: default
data:
  <INTEGRATION_NAME>-config: |-
    ad_identifiers:
      <CONTAINER_IMAGE>
    init_config:
      <INIT_CONFIG>
    instances:
      <INSTANCES_CONFIG>
    logs:
      <LOGS_CONFIG>

Vous pouvez obtenir des modèles Autodiscovery à partir de Consul, etcd ou ZooKeeper. Vous pouvez configurer votre magasin clé-valeur dans le fichier de configuration datadog.yaml (et le monter ensuite dans le conteneur Agent), ou en tant que variables d’environnement dans le conteneur Agent.

Configurer dans datadog.yaml :

Dans datadog.yaml, définissez l’adresse <KEY_VALUE_STORE_IP> et <KEY_VALUE_STORE_PORT> de votre magasin de clés-valeurs :

config_providers:
  - name: etcd
    polling: true
    template_dir: /datadog/check_configs
    template_url: '<KV_STORE_IP>:<KV_STORE_PORT>'
    username:
    password:

  - name: consul
    polling: true
    template_dir: datadog/check_configs
    template_url: '<KV_STORE_IP>:<KV_STORE_PORT>'
    ca_file:
    ca_path:
    cert_file:
    key_file:
    username:
    password:
    token:

  - name: zookeeper
    polling: true
    template_dir: /datadog/check_configs
    template_url: '<KV_STORE_IP>:<KV_STORE_PORT>'
    username:
    password:

Redémarrez l’Agent Datadog pour appliquer vos modifications.

Configurer dans les variables d’environnement :

Avec le magasin de clés-valeurs activé en tant que source de modèle, l’Agent recherche des modèles sous la clé /datadog/check_configs. Autodiscovery attend une hiérarchie de clés-valeurs comme ceci :

/datadog/
  check_configs/
    <CONTAINER_IMAGE>/
      - check_names: ["<INTEGRATION_NAME>"]
      - init_configs: ["<INIT_CONFIG>"]
      - instances: ["<INSTANCES_CONFIG>"]
      - logs: ["<LOGS_CONFIG>"]
    ...

Pour configurer les intégrations dans datadog-agent.yaml, ajoutez un remplacement extraConfd.configDataMap au composant nodeAgent de votre configuration DatadogAgent. Chaque clé devient un fichier dans le répertoire conf.d de l’Agent.

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  global:
    [...]
  features:
    [...]
  override:
    nodeAgent:
      extraConfd:
        configDataMap:
          <INTEGRATION_NAME>.yaml: |-
            ad_identifiers:
              - <CONTAINER_IMAGE>
            init_config:
              <INIT_CONFIG>
            instances:
              <INSTANCES_CONFIG>
            logs:
              <LOGS_CONFIG>
Lorsque plusieurs déployés DatadogAgent Les CRDs utilisent configDataMap, chaque CRD écrit dans un ConfigMap partagé nommé nodeagent-extra-confd. Cela peut entraîner des configurations qui se remplacent mutuellement.

Pour surveiller un Cluster Check, ajoutez un remplacement extraConfd.configDataMap au composant clusterAgent. Vous devez également activer les vérifications de cluster en définissant features.clusterChecks.enabled: true.

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  global:
    [...]
  features:
    clusterChecks:
      enabled: true
    [...]
  override:
    nodeAgent:
      [...]
    clusterAgent:
      extraConfd:
        configDataMap:
          <INTEGRATION_NAME>.yaml: |-
            ad_identifiers:
              - <CONTAINER_IMAGE>
            cluster_check: true
            init_config:
              <INIT_CONFIG>
            instances:
              <INSTANCES_CONFIG>
            logs:
              <LOGS_CONFIG>

Voir Cluster Checks pour plus de contexte.

Votre fichier datadog-values.yaml contient une section datadog.confd où vous pouvez définir des modèles Autodiscovery. Vous pouvez trouver des exemples en ligne dans l’échantillon values.yaml. Chaque clé devient un fichier dans le répertoire conf.d de l’Agent.

datadog:
  confd:
    <INTEGRATION_NAME>.yaml: |-
      ad_identifiers:
        - <CONTAINER_IMAGE>
      init_config:
        <INIT_CONFIG>
      instances:
        <INSTANCES_CONFIG>
      logs:
        <LOGS_CONFIG>

Pour surveiller un Cluster Check, définissez votre modèle sous clusterAgent.confd. Vous pouvez trouver des exemples en ligne dans l’échantillon values.yaml. Vous devez également activer l’Agent de Cluster en définissant clusterAgent.enabled: true et activer les vérifications de cluster en définissant datadog.clusterChecks.enabled: true.

datadog:
  clusterChecks:
    enabled: true
clusterAgent:
  enabled: true
  confd:
    <INTEGRATION_NAME>.yaml: |-
      ad_identifiers:
        - <CONTAINER_IMAGE>
      cluster_check: true
      init_config:
        <INIT_CONFIG>
      instances:
        <INSTANCES_CONFIG>
      logs:
        <LOGS_CONFIG>

Voir Vérifications de Cluster pour plus de contexte.

Valeurs de remplacement

Fournissez les valeurs de remplacement comme suit :

<INTEGRATION_NAME>
Le nom de votre intégration Datadog, tel que etcd ou redisdb.
<CONTAINER_NAME>
Un identifiant à faire correspondre avec les noms (spec.containers[i].name, pas spec.containers[i].image) des conteneurs qui correspondent à votre intégration.
<CONTAINER_IMAGE>
Un identifiant à faire correspondre avec l’image du conteneur (.spec.containers[i].image).

Par exemple: si vous fournissez redis comme identifiant de conteneur, votre modèle d’Autodécouverte est appliqué à tous les conteneurs dont les noms d’image correspondent à redis. Si vous avez un conteneur exécutant foo/redis:latest et bar/redis:v2, votre modèle d’Autodécouverte est appliqué aux deux conteneurs.

Le paramètre ad_identifiers prend une liste, vous pouvez donc fournir plusieurs identifiants de conteneur. Vous pouvez également utiliser des identifiants personnalisés. Voir Identifiants d’autodécouverte personnalisés.
<INIT_CONFIG>
Les paramètres de configuration énumérés sous init_config dans le fichier <INTEGRATION_NAME>.d/conf.yaml.example de votre intégration. La section init_config est généralement vide.
<INSTANCES_CONFIG>
Les paramètres de configuration énumérés sous instances dans le fichier <INTEGRATION_NAME>.d/conf.yaml.example de votre intégration.
<LOGS_CONFIG>
Les paramètres de configuration énumérés sous logs dans le fichier <INTEGRATION_NAME>.d/conf.yaml.example de votre intégration.

Paramètres d’annotation avancés

En plus des annotations d’Autodécouverte de base pour les vérifications, les journaux et les instances, vous pouvez utiliser des annotations supplémentaires pour personnaliser le comportement des vérifications :

Cardinalité des tags

Définissez le niveau de cardinalité des tags pour une vérification spécifique en utilisant l’annotation check_tag_cardinality. Cela remplace le paramètre de cardinalité des tags de l’agent pour les métriques collectées par cette vérification.

apiVersion: v1
kind: Pod
metadata:
  name: '<POD_NAME>'
  annotations:
    ad.datadoghq.com/<CONTAINER_NAME>.checks: |
      {
        "<INTEGRATION_NAME>": {
          "init_config": <INIT_CONFIG>,
          "instances": [<INSTANCES_CONFIG>]
        }
      }
    ad.datadoghq.com/<CONTAINER_NAME>.check_tag_cardinality: "<low|orchestrator|high>"
spec:
  containers:
    - name: '<CONTAINER_NAME>'
Le check_tag_cardinality l'annotation n'affecte que les métriques collectées par les vérifications d'intégration. Elle n'affecte pas les métriques envoyées via DogStatsD. Pour configurer la cardinalité des tags DogStatsD, utilisez le global dogstatsd_tag_cardinality paramètre de configuration ou la DD_DOGSTATSD_TAG_CARDINALITY variable d'environnement.

Pour plus d’informations sur la cardinalité des tags, consultez Configuration des tags par vérification.

Auto-configuration

L’agent Datadog reconnaît automatiquement et fournit une configuration de base pour certaines technologies courantes. Pour une liste complète, consultez Autodiscovery auto-configuration.

Les configurations définies avec des annotations Kubernetes ont la priorité sur l’auto-configuration, mais l’auto-configuration a la priorité sur les configurations définies avec Datadog Operator ou Helm. Pour utiliser Datadog Operator ou Helm pour configurer une intégration dans la liste Auto-configuration de l’autodécouverte, vous devez désactiver l’auto-configuration.

Sécurité des intégrations

Les intégrations ont souvent besoin de lire des fichiers de configuration, des certificats ou d’autres ressources à partir du système de fichiers. Lorsque les chemins de fichiers proviennent de fournisseurs de configuration non fiables (par exemple, des annotations de pod ou l’autodécouverte de services externes), il existe un risque de traversée de chemin ou d’accès non autorisé aux fichiers.

À partir de la version 7.78.0 de l’agent Datadog, vous pouvez définir les paramètres suivants dans le datadog.yaml de l’agent pour contrôler l’accès au système de fichiers en fonction du niveau de confiance d’un fournisseur de configuration.

ParamètreTypePar défautDescription
integration_ignore_untrusted_file_paramsboolfalseLorsqu’il est activé, les intégrations ignorent les paramètres de configuration qui se réfèrent à des chemins de fichiers si le fournisseur de configuration n’est pas fiable.
integration_file_paths_allowlistListe[]Liste des chemins de fichiers auxquels les intégrations sont autorisées à accéder, même lorsqu’ils sont fournis par un fournisseur de configuration non fiable. Une liste vide signifie que tous les chemins de fichiers sont autorisés.
integration_trusted_providersliste["file", "remote-config"]Liste des fournisseurs de configuration considérés comme fiables. Tout fournisseur qui ne figure pas dans cette liste est considéré comme non fiable. Par défaut, les fichiers de configuration locaux (file) et la configuration distante de Datadog (remote-config) sont fiables. Pour la liste complète des fournisseurs pris en charge, voir Noms des fournisseurs de l’agent Datadog.
integration_security_excluded_checksliste[]Liste des noms d’intégration qui sont exclus des restrictions de sécurité ci-dessus.

Ces options sont compatibles avec les versions antérieures : les valeurs par défaut préservent le comportement existant. Pour activer cette option, activez integration_ignore_untrusted_file_params et ajustez les paramètres restants pour qu’ils correspondent à votre environnement.

Exemple datadog.yaml :

integration_ignore_untrusted_file_params: true
integration_file_paths_allowlist:
  - /etc/datadog-agent/certs
  - /var/run/secrets
integration_trusted_providers:
  - file
  - remote-config
integration_security_excluded_checks:
  - <INTEGRATION_NAME>

Avec cette configuration, une intégration configurée via des annotations de pod (un fournisseur non fiable) ne peut pas référencer des chemins de fichiers en dehors de /etc/datadog-agent/certs ou /var/run/secrets, à moins que le nom de l’intégration ne figure dans integration_security_excluded_checks.

Exemple : intégration Postgres

Dans ce scénario d’exemple, vous avez déployé Postgres sur Kubernetes. Vous souhaitez configurer et mettre en place l’intégration Datadog-Postgres. Tous vos conteneurs Postgres ont des noms de conteneur contenant la chaîne postgres.

Tout d’abord, consultez la documentation de l’intégration Postgres pour toute étape de configuration supplémentaire. L’intégration Postgres nécessite que vous créiez un utilisateur en lecture seule nommé datadog et que vous stockiez le mot de passe correspondant en tant que variable d’environnement nommée PG_PASSWORD.

Si vous deviez configurer cette intégration sur un hôte, vous pourriez vous référer à postgresql.d/conf.yaml.example pour les paramètres et créer un fichier postgresql.d/conf.yaml contenant ce qui suit :

init_config:
instances:
  - host: localhost
    port: 5432
    username: datadog
    password: <PASSWORD>
logs:
  - type: file
    path: /var/log/postgres.log
    source: postgresql
    service: pg_service

Ici, <PASSWORD> correspond au mot de passe de l’utilisateur datadog que vous avez créé.

Pour appliquer cette configuration à vos conteneurs Postgres :

Dans le manifeste de votre pod :

Annotations d’autodécouverte v2 (pour l’agent Datadog v7.36+)

apiVersion: v1
kind: Pod
metadata:
  name: postgres
  annotations:
    ad.datadoghq.com/postgres.checks: |
      {
        "postgres": {
          "instances": [
            {
              "host": "%%host%%",
              "port": "5432",
              "username": "datadog",
              "password":"%%env_PG_PASSWORD%%"
            }
          ]
        }
      }
    ad.datadoghq.com/postgres.logs: |
      [
        {
          "type": "file",
          "path": "/var/log/postgres.log",
          "source": "postgresql",
          "service": "pg_service"
        }
      ]
spec:
  containers:
    - name: postgres

Annotations d’autodécouverte v1

apiVersion: v1
kind: Pod
metadata:
  name: postgres
  annotations:
    ad.datadoghq.com/postgres.check_names: '["postgres"]'
    ad.datadoghq.com/postgres.init_configs: '[{}]'
    ad.datadoghq.com/postgres.instances: |
      [
        {
          "host": "%%host%%",
          "port": "5432",
          "username": "datadog",
          "password":"%%env_PG_PASSWORD%%"
        }
      ]
    ad.datadoghq.com/postgres.logs: |
      [
        {
          "type": "file",
          "path": "/var/log/postgres.log",
          "source": "postgresql",
          "service": "pg_service"
        }
      ]
spec:
  containers:
    - name: postgres
  1. Créez un fichier conf.d/postgresql.d/conf.yaml sur votre hôte :

    ad_identifiers:
      - postgres
    init config:
    instances:
      - host: "%%host%%"
        port: "5432"
        username: "datadog"
        password: "%%env_PG_PASSWORD%%"
    logs:
      - type: "file"
        path: "/var/log/postgres.log"
        source: "postgresql"
        service: "pg_service"
    
  2. Montez votre dossier conf.d/ de l’hôte dans le dossier conf.d de l’Agent conteneurisé.

    Pour Datadog Operator :

    spec:
      override:
        nodeAgent:
          volumes:
            - hostPath:
                path: <PATH_TO_LOCAL_FOLDER>/conf.d
              name: confd
    

    Pour Helm :

    agents:
      volumes:
      - hostPath:
          path: <PATH_TO_LOCAL_FOLDER>/conf.d
        name: confd
      volumeMounts:
      - name: confd
        mountPath: /conf.d
    

Dans une ConfigMap :

kind: ConfigMap
apiVersion: v1
metadata:
  name: postgresql-config-map
  namespace: default
data:
  postgresql-config: |-
    ad_identifiers:
      - postgres
    init_config:
    instances:
      - host: "%%host%%"
        port: "5432"
        username: "datadog"
        password: "%%env_PG_PASSWORD%%"
    logs:
      - type: "file"
        path: "/var/log/postgres.log"
        source: "postgresql"
        service: "pg_service"

Ensuite, dans votre manifeste, définissez le volumeMounts et le volumes :

# [...]
        volumeMounts:
        # [...]
          - name: postgresql-config-map
            mountPath: /etc/datadog-agent/conf.d/postgresql.d
        # [...]
      volumes:
      # [...]
        - name: postgresql-config-map
          configMap:
            name: postgresql-config-map
            items:
              - key: postgresql-config
                path: conf.yaml
# [...]

Les commandes etcd suivantes créent un modèle d’intégration Postgres avec un paramètre password personnalisé :

etcdctl mkdir /datadog/check_configs/postgres
etcdctl set /datadog/check_configs/postgres/check_names '["postgres"]'
etcdctl set /datadog/check_configs/postgres/init_configs '[{}]'
etcdctl set /datadog/check_configs/postgres/instances '[{"host": "%%host%%","port":"5432","username":"datadog","password":"%%env_PG_PASSWORD%%"}]'

Remarquez que chacune des trois valeurs est une liste. L’autodécouverte assemble les éléments de la liste dans les configurations d’intégration en fonction des index de liste partagés. Dans ce cas, elle compose la première (et unique) configuration de vérification à partir de check_names[0], init_configs[0] et instances[0].

Dans datadog-agent.yaml :

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  global:
    [...]
  features:
    [...]
  override:
    nodeAgent:
      extraConfd:
        configDataMap:
          postgres.yaml: |-
            ad_identifiers:
              - postgres
            init_config:
            instances:
              - host: "%%host%%"
                port: 5432
                username: "datadog"
                password: "%%env_PG_PASSWORD%%"

En conséquence, l’Agent contient un fichier postgres.yaml avec la configuration ci-dessus dans le répertoire conf.d.

Dans datadog-values.yaml :

datadog:
  confd:
    postgres.yaml: |-
      ad_identifiers:
        - postgres
      init_config:
      instances:
        - host: "%%host%%"
          port: 5432
          username: "datadog"
          password: "%%env_PG_PASSWORD%%"

En conséquence, l’Agent contient un fichier postgres.yaml avec la configuration ci-dessus dans le répertoire conf.d.

Ces modèles utilisent des variables de modèle d’autodécouverte :

  • %%host%% est peuplé dynamiquement avec l’IP du conteneur.
  • %%env_PG_PASSWORD%% fait référence à une variable d’environnement nommée PG_PASSWORD telle que vue par le processus de l’Agent.

Pour plus d’exemples, y compris comment configurer plusieurs vérifications pour plusieurs ensembles de conteneurs, voir Autodécouverte : Scénarios et Exemples.

Lectures complémentaires