EKS on FargateでのDatadog Cluster Agentの動かし方

概要

Fargate上でEKSのPodを動かしている場合に、Datadog Cluster Agentのマニフェストはどう定義すればいいか分かりづらかったのでメモとして残しておきます。

公式ドキュメント: https://docs.datadoghq.com/ja/integrations/eks_fargate/#cluster-agent-%E3%81%BE%E3%81%9F%E3%81%AF-cluster-checks-runner-%E3%81%AE%E5%AE%9F%E8%A1%8C

設定例

Datadog Cluster Agentをhelmでインストールします。 valuesファイルは以下のようにする。

# see: https://github.com/DataDog/helm-charts/tree/main/charts/datadog#values  
datadog:  
  apiKeyExistingSecret: datadog
agents:  
  enabled: false  
clusterAgent:  
  enabled: true  
  replicas: 2  
  shareProcessNamespace: true  
  tokenExistingSecret: datadog-cluster-agent
  env:  
  - name: DD_EKS_FARGATE  
    value: "true"  
  - name: DD_KUBERNETES_KUBELET_NODENAME  
    valueFrom:  
      fieldRef:  
        apiVersion: v1  
        fieldPath: spec.nodeName
  - name: DD_CLUSTER_NAME
    valueFrom:
      configMapKeyRef:
        key: DD_CLUSTER_NAME
        name: datadog
  resources:  
    requests:  
      cpu: 200m  
      memory: 256M  
    limits:  
      cpu: 200m  
      memory: 256M

datadog ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: datadog
data:
  DD_CLUSTER_NAME: my-cluster-name

datadog Secret

apiVersion: v1
kind: Secret
metadata:
  name: datadog
data:
  api-key: my-api-key

datadog-cluster-agent Secret

apiVersion: v1
kind: Secret
metadata:
  name: datadog-cluster-agent
data:
  token: my-datadog-cluster-agent-token # 32文字以上にすること。じゃないとエラーになる

Fargate上でPodを動かす場合、Datadog AgentコンテナはSidecarとして動かすことになります。 そのDatadog AgentコンテナにDatadog Cluster Agentコンテナと通信するための環境変数を渡してあげます。 必要な環境変数DD_CLUSTER_AGENT_ENABLEDDD_CLUSTER_AGENT_URLDD_CLUSTER_AGENT_AUTH_TOKENDD_ORCHESTRATOR_EXPLORER_ENABLEDです。

Sidecarの定義

spec:
  containers:
  - image: public.ecr.aws/datadog/agent:7.49.1
    name: datadog-agent
    env:
    - name: DD_API_KEY
      valueFrom:
        secretKeyRef:
          key: api-key
          name: datadog
    - name: DD_SITE
      value: datadoghq.com
    - name: DD_EKS_FARGATE
      value: "true"
    - name: DD_PROCESS_AGENT_ENABLED
      value: "true"
    - name: DD_KUBERNETES_KUBELET_NODENAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: DD_CLUSTER_NAME
      valueFrom:
        configMapKeyRef:
          key: DD_CLUSTER_NAME
          name: datadog
    - name: DD_CLUSTER_AGENT_ENABLED
      value: "true"
    - name: DD_CLUSTER_AGENT_URL
      value: https://<CLUSTER_AGENT_SERVICE_NAME>.<CLUSTER_AGENT_SERVICE_NAMESPACE>.svc.cluster.local:5005
    - name: DD_CLUSTER_AGENT_AUTH_TOKEN
      valueFrom:
        secretKeyRef:
          key: token
          name: datadog-cluster-agent
    - name: DD_ORCHESTRATOR_EXPLORER_ENABLED # Kubernetes リソースビューを取得するために必要です
      value: "true"

うまくいかない場合

1, ログを確認

Datadog Cluster Agentコンテナのログ、Sidecarとして動かしているDatadog Agentコンテナのログを確認します。 INFOレベルログでうまくいかない原因が出力されていることもあります…。(DD_CLUSTER_AGENT_AUTH_TOKENの長さは32文字以上じゃないといけないとか)

2, agent statusで確認

Sidecarとして動かしているDatadog Agentコンテナにはいり、agent statusを実行し、 Datadog Cluster Agent欄を確認する。 Successfully Connected to the Datadog Cluster Agent.と出ていれば正常に設定がされています。

3, Sidecarとして動かしているDatadog AgentコンテナのPodのdnsPolicyDefaultになっていないか確認

DD_CLUSTER_AGENT_URLにDatadog Cluster Agent ServiceへURLを設定していますが、dnsPolicyDefaultでは名前解決できずエラーになります。 CoreDNSなどはdnsPolicyDefaultなのでそういったPodはDD_CLUSTER_AGENT_ENABLEDをfalseにするとよいでしょう。(他に良い解決方法があれば教えてください)