概要

このページでは、Datadog Cluster Agent の Admission Controller のトラブルシューティングを紹介します。

一般的な問題

既存のポッドの更新

Admission Controller は、Kubernetes クラスター内の新しいポッドの作成に対応します。ポッドの作成時に、Cluster Agent は Kubernetes からリクエストを受信し、ポッドにどのような変更を加えるか (もしあれば) の詳細を応答します。

したがって、Admission Controller はクラスター内の既存のポッドを変更しません。最近 Admission Controller を有効にしたり、その他の環境変更を行った場合は、既存のポッドを削除して Kubernetes に再作成させてください。これにより、Admission Controller がポッドを確実に更新します。

ラベルとアノテーション

Cluster Agent は、作成されたポッドのラベルとアノテーションに応答します —そのポッドを作成したワークロード (デプロイメント、DaemonSet、CronJob など) には応答しません。ポッドテンプレートがこれを適宜参照するようにしてください。

例えば、以下のテンプレートでは APM 構成のラベルライブラリ注入のアノテーションを設定しています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
spec:
  #(...)  
  template:
    metadata:
      labels:
        admission.datadoghq.com/enabled: "true"
      annotations:
        admission.datadoghq.com/<LANGUAGE>-lib.version: <VERSION>
    spec:
      containers:
      #(...)

アプリケーションポッドが作成されない

Admission Controller の注入モード (sockethostipservice) は Cluster Agent の構成によって設定されます。例えば、Agent で socket モードを有効にしている場合、Admission Controller も socket モードを使用します。

GKE Autopilot または OpenShift を使用している場合は、特定の注入モードを使用する必要があります。

GKE Autopilot

GKE Autopilot は、hostPath を持つ volumes の使用を制限します。そのため、Admission Controller が socket モードを使用すると、ポッドは GKE Warden によってスケジューリングがブロックされます。

Helm チャートで GKE Autopilot モードを有効にすると、socket モードが無効になり、この現象が発生しなくなります。APM を有効にするには、ポートを有効にして、代わりに hostip または service メソッドを使用します。Admission Controller はデフォルトで hostip を使用します。

datadog:
  apm:
    portEnabled: true
  #(...)

providers:
  gke:
    autopilot: true

Autopilot に関する構成の詳細については、Kubernetes Distributions を参照してください。

OpenShift

OpenShift には SecurityContextConstraints (SCC) があり、これは hostPath を持つ volume など追加の権限を必要とするポッドをデプロイする際に必須です。Datadog コンポーネントは Datadog ポッド固有のアクティビティを許可するために SCC を使用してデプロイされますが、Datadog は他のポッド用の SCC は作成しません。Admission Controller がソケットベースの設定をアプリケーションポッドに追加することがあり、その結果ポッドのデプロイに失敗する場合があります。

OpenShift を使用している場合は、hostip モードを使用してください。以下の構成は、ソケットオプションを無効化することで hostip モードを有効にします。

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  features:
    apm:
      enabled: true
      hostPortConfig:
        enabled: true
      unixDomainSocketConfig:
        enabled: false
    dogstatsd:
      hostPortConfig:
        enabled: true
      unixDomainSocketConfig:
        enabled: false

あるいは、features.admissionController.agentCommunicationModehostip または service に直接設定することもできます。

datadog:
  apm:
    portEnabled: true
    socketEnabled: false

あるいは、clusterAgent.admissionController.configModehostip または service に直接設定することもできます。

OpenShift に関する構成の詳細については、Kubernetes Distributions を参照してください。

Admission Controller のステータスの表示

Cluster Agent のステータス出力は、MutatingWebhookConfiguration 用の datadog-webhook が作成され、有効な証明書を持っていることを確認するための情報を提供します。

次のコマンドを実行します。

% kubectl exec -it <Cluster Agent Pod> -- agent status

出力は以下のようになります。

...
Admission Controller
====================

    Webhooks info
    -------------
      MutatingWebhookConfigurations name: datadog-webhook
      Created at: 2023-09-25T22:32:07Z
      ---------
        Name: datadog.webhook.auto.instrumentation
        CA bundle digest: f24b6c0c40feaad2
        Object selector: &LabelSelector{MatchLabels:map[string]string{admission.datadoghq.com/enabled: true,},MatchExpressions:[]LabelSelectorRequirement{},}
        Rule 1: Operations: [CREATE] - APIGroups: [] - APIVersions: [v1] - Resources: [pods]
        Service: default/datadog-admission-controller - Port: 443 - Path: /injectlib
      ---------
        Name: datadog.webhook.config
        CA bundle digest: f24b6c0c40feaad2
        Object selector: &LabelSelector{MatchLabels:map[string]string{admission.datadoghq.com/enabled: true,},MatchExpressions:[]LabelSelectorRequirement{},}
        Rule 1: Operations: [CREATE] - APIGroups: [] - APIVersions: [v1] - Resources: [pods]
        Service: default/datadog-admission-controller - Port: 443 - Path: /injectconfig
      ---------
        Name: datadog.webhook.tags
        CA bundle digest: f24b6c0c40feaad2
        Object selector: &LabelSelector{MatchLabels:map[string]string{admission.datadoghq.com/enabled: true,},MatchExpressions:[]LabelSelectorRequirement{},}
        Rule 1: Operations: [CREATE] - APIGroups: [] - APIVersions: [v1] - Resources: [pods]
        Service: default/datadog-admission-controller - Port: 443 - Path: /injecttags

    Secret info
    -----------
    Secret name: webhook-certificate
    Secret namespace: default
    Created at: 2023-09-25T22:32:07Z
    CA bundle digest: f24b6c0c40feaad2
    Duration before certificate expiration: 8643h34m2.557676864s
...

この出力は default ネームスペースにデプロイされた Cluster Agent に対するものです。ServiceSecret は使用するネームスペースと一致している必要があります。

Admission Controller のログの表示

デバッグログは Admission Controller が正しくセットアップされているかを確認するのに役立ちます。以下の構成でデバッグログを有効にします

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  global:
    credentials:
      apiKey: <DATADOG_API_KEY>
    site: <DATADOG_SITE>
    logLevel: debug
datadog:
  logLevel: debug

datadog-webhook の検証

ログの例:

<TIMESTAMP> | CLUSTER | INFO | (pkg/clusteragent/admission/controllers/secret/controller.go:73 in Run) | Starting secrets controller for default/webhook-certificate
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/controllers/webhook/controller_base.go:148 in enqueue) | Adding object with key default/webhook-certificate to the queue
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/controllers/secret/controller.go:140 in enqueue) | Adding object with key default/webhook-certificate to the queue
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/controllers/webhook/controller_base.go:148 in enqueue) | Adding object with key datadog-webhook to the queue
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/util/kubernetes/apiserver/util.go:47 in func1) | Sync done for informer admissionregistration.k8s.io/v1/mutatingwebhookconfigurations in 101.116625ms, last resource version: 152728
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/controllers/webhook/controller_v1.go:140 in reconcile) | The Webhook datadog-webhook was found, updating it
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/controllers/secret/controller.go:211 in reconcile) | The certificate is up-to-date, doing nothing. Duration before expiration: 8558h17m27.909792831s
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/controllers/secret/controller.go:174 in processNextWorkItem) | Secret default/webhook-certificate reconciled successfully
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/controllers/webhook/controller_base.go:176 in processNextWorkItem) | Webhook datadog-webhook reconciled successfully

datadog-webhook の Webhook が正常に照合されていない場合は、構成の説明に従って Admission Controller が正しく有効になっていることを確認してください。

注入の検証

ログの例:

<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/controllers/secret/controller.go:140 in enqueue) | Adding object with key default/webhook-certificate to the queue
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/controllers/secret/controller.go:211 in reconcile) | The certificate is up-to-date, doing nothing. Duration before expiration: 8558h12m28.007769373s
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/controllers/secret/controller.go:174 in processNextWorkItem) | Secret default/webhook-certificate reconciled successfully
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/mutate/common.go:74 in injectEnv) | Injecting env var 'DD_TRACE_AGENT_URL' into pod with generate name example-pod-123456789-
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/mutate/common.go:74 in injectEnv) | Injecting env var 'DD_DOGSTATSD_URL' into pod with generate name example-pod-123456789-
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/mutate/common.go:74 in injectEnv) | Injecting env var 'DD_ENTITY_ID' into pod with generate name example-pod-123456789-
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/mutate/common.go:74 in injectEnv) | Injecting env var 'DD_SERVICE' into pod with generate name example-pod-123456789-
<TIMESTAMP> | CLUSTER | DEBUG | (pkg/clusteragent/admission/mutate/auto_instrumentation.go:336 in injectLibInitContainer) | Injecting init container named "datadog-lib-python-init" with image "gcr.io/datadoghq/dd-lib-python-init:v1.18.0" into pod with generate name example-pod-123456789-

あるポッドの注入でエラーが発生した場合は、Datadog の構成とポッドの構成を Datadog サポートに連絡してください。

注入の試行がどのポッドにも表示されない場合は、mutateUnlabelled 設定を確認し、ポッドのラベルが期待される値と一致していることを確認してください。これらが一致する場合、コントロールプレーン、Webhook、サービス間のネットワークに問題がある可能性があります。詳細はネットワークを参照してください。

ネットワーキング

ネットワークポリシー

Kubernetes のネットワークポリシーは、ポッドへのトラフィックの異なるイングレス (受信) とイグレス (送信) のフローを制御するのに役立ちます。

ネットワークポリシーを使用している場合、Datadog は、このポートを介したポッドへの接続性を確保するために、Cluster Agent に対応するポリシーを作成することを推奨します。以下の構成でこれを行うことができます。

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  global:
    #(...)
    networkPolicy:
      create: true
      flavor: kubernetes
datadog:
  #(...)
  networkPolicy:
    create: true
    flavor: kubernetes

flavorkubernetes に設定して NetworkPolicy リソースを作成します。

また、Cilium ベースの環境では、flavorcilium に設定して CiliumNetworkPolicy リソースを作成します。

Kubernetes ディストリビューションのネットワークのトラブルシューティング

ポッドが作成されると、Kubernetes クラスターはコントロールプレーンから datadog-webhook にリクエストを送信し、サービスを経由して、最後に Cluster Agent ポッドに到達します。このリクエストは、コントロールプレーンから Cluster Agent が存在するノードへの、Admission Controller ポート (8000) を介したインバウンド接続を必要とします。このリクエストが解決された後、Cluster Agent はポッドを変更して Datadog トレーサー用のネットワーク接続を構成します。

お使いの Kubernetes ディストリビューションによっては、セキュリティルールや Admission Controller の設定に追加要件が発生する場合があります。

Amazon Elastic Kubernetes Service (EKS)

EKS クラスターでは、デフォルトで Linux ベースのノードに Cluster Agent ポッドをデプロイできます。これらのノードとその EC2 インスタンスには、以下のインバウンドルールを持つセキュリティグループが必要です。

  • プロトコル: TCP
  • ポート範囲: 8000、または 8000 をカバーする範囲
  • ソース: クラスターのセキュリティグループ、またはクラスターの追加セキュリティグループの_いずれか_の ID。これらの ID は EKS コンソールの EKS クラスターの Networking タブで確認できます。

このセキュリティグループルールは、コントロールプレーンがポート 8000 を介してノードとダウンストリームの Cluster Agent にアクセスすることを許可します。

複数の管理ノードグループがあり、それぞれに個別のセキュリティグループがある場合は、各セキュリティグループにこのインバウンドルールを追加します。

コントロールプレーンのロギング

ネットワーク構成を検証するには、API サーバーの EKS コントロールプレーンのロギングを有効にします。これらのログは CloudWatch コンソールで見ることができます。

次に、ポッドの一つを削除して Admission Controller 経由でリクエストを再トリガーします。リクエストが失敗すると、以下のようなログが表示されます。

W0908 <TIMESTAMP> 10 dispatcher.go:202] Failed calling webhook, failing open datadog.webhook.auto.instrumentation: failed calling webhook "datadog.webhook.auto.instrumentation": failed to call webhook: Post "https://datadog-cluster-agent-admission-controller.default.svc:443/injectlib?timeout=10s": context deadline exceeded
E0908 <TIMESTAMP> 10 dispatcher.go:206] failed calling webhook "datadog.webhook.auto.instrumentation": failed to call webhook: Post "https://datadog-cluster-agent-admission-controller.default.svc:443/injectlib?timeout=10s": context deadline exceeded

これらの失敗は、default ネームスペースにデプロイされた Cluster Agent に関連しています。使用するネームスペースに応じて DNS 名が調整されます。

また、datadog.webhook.tagsdatadodg.webhook.config など、Admission Controller の他の Webhook での失敗が表示されることもあります。

注: EKS はクラスターの CloudWatch ロググループ内に 2 つのログストリームを生成することがよくあります。これらのタイプのログの両方を確認してください。

Azure Kubernetes Service (AKS)

Admission Controller webhooks on AKS を使用するには、以下の構成を使用します。

kind: DatadogAgent
apiVersion: datadoghq.com/v2alpha1
metadata:
  name: datadog
spec:
  #(...)
  override:
    clusterAgent:
      containers:
        cluster-agent:
          env:
            - name: DD_ADMISSION_CONTROLLER_ADD_AKS_SELECTORS
              value: "true"
datadog:
  #(...)

providers:
  aks:
    enabled: true

providers.aks.enabled オプションは環境変数 DD_ADMISSION_CONTROLLER_ADD_AKS_SELECTORS="true" を設定します。

Google Kubernetes Engine (GKE)

GKE プライベートクラスターを使用している場合、コントロールプレーンからポート 8000 へのインバウンドアクセスを許可するようにファイアウォールルールを調整する必要があります。

ファイアウォールルールを追加して、ポート 8000 の TCP 経由のイングレスを許可します。

既存のルールを編集することもできます。デフォルトでは、クラスターのネットワークには gke-<CLUSTER_NAME>-master という名前のファイアウォールルールがあります。このルールの_ソースフィルター_にクラスターのコントロールプレーンの CIDR ブロックが含まれていることを確認してください。このルールを編集して、ポート 8000 のプロトコル tcp によるアクセスを許可します。

詳細については、GKE ドキュメントの特定のユースケースのためのファイアウォールルールの追加を参照してください。

Rancher

EKS クラスターまたはプライベート GKE クラスターで Rancher を使用している場合は、追加の構成が必要です。詳細については、Rancher ドキュメントの Rancher Webhook - Common Issues を参照してください。

: Datadog の Admission Controller の Webhook は Rancher の Webhook と同じように動作するため、Datadog は Rancher の 9443 の代わりにポート 8000 にアクセスする必要があります。

Rancher と EKS

EKS クラスターで Rancher を使用するには、以下の構成で Cluster Agent ポッドをデプロイします。

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  #(...)
  override:
    clusterAgent:
      hostNetwork: true
datadog:
  #(...)

clusterAgent:
  useHostNetwork: true

また、このページの Amazon EKS セクションで説明されているように、セキュリティグループのインバウンドルールを追加する必要があります。

Rancher と GKE

プライベート GKE クラスターで Rancher を使用するには、ポート 8000 で TCP 経由のインバウンドアクセスを許可するようファイアウォールルールを編集します。このページの GKE セクションを参照してください。

その他の参考資料