Kubernetes Service を使用した APM のセットアップ
概要
Kubernetes では、Datadog のトレーサーは Unix Domain Socket (UDS)、ホスト IP、または Kubernetes Service の 3 つの方法で Datadog Agent にデータを送信できます。いずれのオプションでも、アプリケーション Pod が APM データを送信した場合、そのデータは同じノード上にある Datadog Agent Pod に到達します。この戦略により、トラフィックが適切に分散され、データに正しいタグが付与されるようにすることが目的です。Datadog では、UDS を使用してデータを送信することを推奨しています。
しかし、UDS に必要な hostPath ボリュームや、ホスト IP を使用するために必要な hostPort が利用できない場合は、代替オプションとして Kubernetes Service を使用できます。
このガイドでは、Kubernetes Service を使用して Datadog Agent にデータを送信する方法を設定する手順を説明します。
Service の設定
Kubernetes 1.22 では、Internal Traffic Policy 機能により、Service に internalTrafficPolicy: Local を設定するオプションが追加されました。これを有効化すると、アプリケーション Pod からのトラフィックは、同じノード上にある Service のダウンストリーム Pod にルーティングされるようになります。
Datadog Helm チャートまたは Datadog Operator を使用して Kubernetes バージョン v1.22.0+ のクラスターに Datadog Agent をインストールした場合、internalTrafficPolicy: Local が設定された Agent 用の Service は自動的に作成されます。追加で、以下の設定を行い、Agent の APM ポートオプションを有効にする必要があります。
Agent の構成
datadog-agent.yaml を更新して、features.apm.enabled を 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
datadog-values.yaml を更新して、datadog.apm.portEnabled を 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
アプリケーションの設定
アプリケーションを Kubernetes Service 経由で Datadog Agent に接続させるには、Cluster Agent Admission Controller を使用する方法と、手動で設定を行う方法の 2 つがあります。
Cluster Agent Admission Controller
Cluster Agent の Admission Controller を使用すると、APM 接続用の設定をコンテナにインジェクトすることができます。オプションとして hostip、socket、service のいずれかを指定します。service モードを選択すると、Admission Controller によって DD_AGENT_HOST 環境変数が Service の DNS 名に設定されます。
datadog-agent.yaml を以下のように更新します。
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
datadog-values.yaml を以下のように更新します。
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
注: Linux と Windows の混在ノード環境では、Cluster Agent とその Admission Controller は Linux のデプロイに依存します。その結果、Windows の Pod には Service 接続用の環境変数が正しくない形でインジェクトされる場合があります。
手動設定
手動で設定する場合は、Pod マニフェストの環境変数 DD_AGENT_HOST を <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
<SERVICE_NAME> には Service の名前を、<SERVICE_NAMESPACE> には Service の Namespace を置き換えてください。
例えば、以下のような Service 定義がある場合:
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
DD_AGENT_HOST の値は datadog.monitoring.svc.cluster.local に設定します。
    #(...)
    spec:
      containers:
      - name: "<CONTAINER_NAME>"
        image: "<CONTAINER_IMAGE>"
        env:
          - name: DD_AGENT_HOST
            value: datadog.monitoring.svc.cluster.local
参考資料