OpenTelemetryを使用して、Kubernetesを監視します。

概要

Datadog Agent をインストールせずに、OpenTelemetry を使用して Kubernetes データを Datadog に送信します。必要なデータに合わせてセットアップを選択します。

目標コンポーネントセットアップ
Kubernetes Explorer でポッド、デプロイメント、その他のリソースデータを表示するk8sobjects レシーバーを備えたクラスターコレクター 1 台OTLP 経由で Kubernetes リソースを送信
Datadog の標準 Kubernetes ダッシュボードにデータを入力するkube-state-metricsクラスターコレクター 1 台、およびノードごとにノードコレクター 1 台このガイドに従う

以下の完全なセットアップでは、Kubernetes - Overview ダッシュボード用の Kubernetes インフラストラクチャー メトリクスと、Kubernetes Explorer 用のリソースデータを収集します。アプリケーションのインスツルメンテーションは行いません。

「Kubernetes - Overview」ダッシュボード。クラスターとそのコンテナのステータスやリソース使用量など、コンテナのメトリクスを表示します。

このセットアップでは、次の 3 つのコンポーネントを使用します。

  • kube-state-metrics は、デプロイメント、ノード、ポッドなどの Kubernetes オブジェクトに関するメトリクスを生成します。
  • クラスターコレクター。単一レプリカのデプロイメントとして実行され、クラスター全体のメトリクスとエクスプローラー用のリソースデータを収集します。
  • ノードコレクター。DaemonSet として実行され、CPU やメモリ使用量など、各ノードからメトリクスを収集します。

クラスターコレクターは、Prometheus レシーバーを使用して kube-state-metrics をスクレイピングします。Prometheus サーバーをインストールする必要はありません。これらのメトリクスは、Kubernetes エクスプローラーからリンクされているダッシュボードに反映されます。k8sobjects レシーバーは、エクスプローラーのリソースデータを提供します。

セットアップ

これらの手順により、default 名前空間に新しいコレクターがデプロイされます。すでに Kubernetes メトリクスを収集している場合は、追加のコレクターをデプロイする前に既存の設定を確認し、重複した収集を回避してください。

前提条件

  • Helm および kubectl。クラスター内でワークロードをデプロイし、RBAC リソースを作成する権限が必要です。
  • Datadog API key と Datadog site。

OpenTelemetry Collector Helm chart v0.156.2 以降、および OpenTelemetry Collector Contrib v0.159.0 以降を使用してください。以下のコマンドは、コレクターイメージを v0.159.0 に固定します。

エクスプローラーに使用される k8sobjects レシーバーは、Kubernetes API サーバーの負荷を増加させる可能性があります。Datadog は、Kubernetes 1.33 以降の使用と、収集を拡大する前に小規模なクラスターでテストすることを推奨しています。Kubernetes エクスプローラーの制限事項を参照してください。

OpenTelemetry を使用した Kubernetes エクスプローラーは、以下では利用できません。 .

インストール

1. kube-state-metrics のインストール

prometheus-community Helm リポジトリを追加し、kube-state-metrics をインストールします。

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install kube-state-metrics prometheus-community/kube-state-metrics \
  --namespace default

参照設定は kube-state-metrics.default.svc:8080 をスクレイピングします。別のサービス名または名前空間を使用している場合は、cluster-collector.yaml 内の Prometheus レシーバーターゲットを更新してください。

2. Datadog シークレットの作成

API キーとサイトを設定し、コレクターの名前空間にシークレットを作成します。

export DD_API_KEY="<YOUR_DATADOG_API_KEY>"
export DD_SITE=""

kubectl create secret generic datadog-secret \
  --namespace default \
  --from-literal="api-key=$DD_API_KEY" \
  --from-literal="dd-site=$DD_SITE"

3. コレクターの構成とインストール

  1. OpenTelemetry Helm チャートリポジトリを追加します。

    helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
    helm repo update
    
  2. cluster-collector.yaml と daemonset-collector.yaml を同じディレクトリにダウンロードします。これらの Helm 値ファイルは opentelemetry-examples リポジトリで管理されています。

    CONFIG_URL="https://raw.githubusercontent.com/DataDog/opentelemetry-examples/main/guides/kubernetes/configuration"
    curl -fsSLo cluster-collector.yaml "$CONFIG_URL/cluster-collector.yaml"
    curl -fsSLo daemonset-collector.yaml "$CONFIG_URL/daemonset-collector.yaml"
    
  3. 両方のファイルで、config.exporters 配下の datadog/exporter ブロックを推奨される OTLP HTTP エクスポーターに置き換えます。

    exporters:
      otlp_http:
        endpoint: https://otlp.${env:DD_SITE}
        logs_endpoint: https://otlp.${env:DD_SITE}/v1/logs
        headers:
          dd-api-key: ${env:DD_API_KEY}
          dd-otel-metric-config: >-
            {
            "resource_attributes_as_tags": true,
            "instrumentation_scope_metadata_as_tags": true
            }
        compression: zstd
        compression_params:
          level: 3
        sending_queue:
          batch:
            sizer: bytes
            min_size: 2097152
            max_size: 4194304
    

    パイプラインの exporters リストにある各 datadog/exporter エントリーを otlp_http に置き換えます。クラスターコレクターでは、Datadog Exporter の orchestrator_explorer オプションを含めないでください。Datadog は、OTLP 経由で到着した k8sobjects レシーバーからのリソースデータを認識します。

  4. daemonset-collector.yaml でトレース処理を更新します。参照ファイルはアプリケーショントレースもサポートしています。

    • ノードコレクターがアプリケーショントレースを受信しない場合は、datadog/connector、traces および traces/sampling パイプラインと、metrics パイプラインのレシーバーから datadog/connector を削除します。
    • ノードコレクターがアプリケーショントレースを受信する場合は、推奨される Collector 構成を使用して、datadog/connector をアップストリームの forward/traces_sample および span_metrics コネクタに置き換えます。

    datadog 拡張機能とそのエントリーを service.extensions の下に保持します。この拡張機能は、ホストのエンリッチメントに使用される Collector メタデータを報告します。テレメトリのエクスポートは行いません。

  5. 両方のコレクターが同じクラスター名を報告していることを確認します。

    • 自動的に検出するには、k8s_api とプロバイダーの検出器を resourcedetection.detectors の下に保持し、他のクラウドプロバイダーの検出器を削除します。EKS、AKS、または GKE 用のプロバイダー検出器とその権限を構成します。
    • それ以外の場合は、resourcedetection.detectors を [k8s_api] に設定します。resource/add-cluster-name のコメントを解除し、両方のファイルで <YOUR_CLUSTER_NAME> を同じ値に置き換えます。resourcedetection を使用する各パイプラインで、その直後に resource/add-cluster-name を追加します。他のプロセッサーはそのままにしておきます。
  6. values ファイルが含まれているディレクトリから次のコマンドを実行します。

    # Install the node Collector (DaemonSet)
    helm install otel-daemon-collector open-telemetry/opentelemetry-collector \
      --namespace default \
      -f daemonset-collector.yaml \
      --set image.repository=otel/opentelemetry-collector-contrib \
      --set image.tag=0.159.0
    
    # Install the cluster Collector (Deployment)
    helm install otel-cluster-collector open-telemetry/opentelemetry-collector \
      --namespace default \
      -f cluster-collector.yaml \
      --set image.repository=otel/opentelemetry-collector-contrib \
      --set image.tag=0.159.0
    

セットアップを確認する

  1. コレクターおよび kube-state-metrics ポッドが実行中で準備完了状態であることを確認します。

    kubectl get pods --namespace default \
      -l 'app.kubernetes.io/instance in (otel-daemon-collector,otel-cluster-collector,kube-state-metrics)'
    
  2. Kubernetes - Overview ダッシュボードを開き、クラスターを選択します。ノードのリソース使用量および Kubernetes オブジェクトメトリクスを確認します。

  3. Kubernetes エクスプローラーを開き、クラスター名でフィルタリングします。ポッドやデプロイメントなどのリソースが表示されることを確認します。

データが表示されない場合は、コレクターのログでエクスポートエラーを確認します。シークレットに、選択した Datadog サイトの API キーが含まれていることを確認します。

トレースとインフラストラクチャーのメトリクスの関連付け (オプション)

すでにトレースを送信しているアプリケーションの場合は、unified service tagging を使用して、アプリケーションのテレメトリとインフラストラクチャーのメトリクスを関連付けます。両方に同じリソース属性を設定します。

  • service.name は Datadog service タグにマップされます。
  • service.versionは Datadog version タグにマップされます。
  • deployment.environment.nameは Datadog env タグにマップされます。

アプリケーションの構成

送信されるテレメトリにタグ付けするには、アプリケーションのコンテナ仕様で以下の環境変数を設定します。

spec:
  containers:
    - name: my-container
      env:
        - name: OTEL_SERVICE_NAME
          value: "<SERVICE_NAME>"
        - name: OTEL_RESOURCE_ATTRIBUTES
          value: "service.version=<SERVICE_VERSION>,deployment.environment.name=<ENVIRONMENT>"

インフラストラクチャー構成

対応するアノテーションを Kubernetes Deployment メタデータに追加します。Collector の k8sattributes プロセッサーは、これらのアノテーションを使用して、インフラストラクチャーメトリクスにサービスコンテキストを付与します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  annotations:
    # Use resource.opentelemetry.io/ for the k8sattributes processor
    resource.opentelemetry.io/service.name: "<SERVICE_NAME>"
    resource.opentelemetry.io/service.version: "<SERVICE_VERSION>"
    resource.opentelemetry.io/deployment.environment.name: "<ENVIRONMENT>"
spec:
  template:
    metadata:
      annotations:
        resource.opentelemetry.io/service.name: "<SERVICE_NAME>"
        resource.opentelemetry.io/service.version: "<SERVICE_VERSION>"
        resource.opentelemetry.io/deployment.environment.name: "<ENVIRONMENT>"
# ... rest of the manifest

収集データ

このインテグレーションは、いくつかの OpenTelemetry レシーバーを使用してメトリクスを収集します。

kube-state-metrics (Prometheus レシーバーを使用)

kube-state-metrics エンドポイントからスクレイピングされたメトリクスは、Kubernetes API オブジェクトの状態に関する情報を提供します。

Kubelet 統計レシーバー

kubeletstatsreceiver は各ノードの Kubelet からメトリクスを収集し、ポッド、コンテナ、ボリュームのリソース使用量に焦点を当てます。

OTELDESCRIPTIONFILTER
k8s.node.filesystem.usageNode filesystem usage
k8s.pod.cpu.usagePod’s CPU usage, measured in cpus. Range from 0 to the number of allocatable CPUs. Note: CPU usage of the specific Pod on all available CPU cores, averaged over the sample window
k8s.pod.filesystem.usagePod filesystem usage
k8s.pod.memory.rssPod memory RSS. Note: The amount of anonymous and swap cache memory (includes transparent hugepages). This metric is derived from the MemoryStats.RSSBytes field of the PodStats.Memory of the Kubelet’s stats API.
k8s.pod.memory.usageMemory usage of the Pod. Note: Total memory usage of the Pod
k8s.pod.network.errorsPod network errorsdirection: receive
k8s.pod.network.errorsPod network errorsdirection: transmit
k8s.pod.network.ioNetwork bytes for the Pod.direction: receive
k8s.pod.network.ioNetwork bytes for the Pod.direction: transmit

Kubernetes クラスターレシーバー

k8sclusterreceiver は、ノード、ポッド、およびその他のオブジェクトのステータスや数など、クラスター レベルのメトリクスを収集します。

OTELDESCRIPTION
k8s.container.cpu_limitMaximum resource limit set for the container. See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#resourcerequirements-v1-core for details
k8s.container.cpu_requestResource requested for the container. See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#resourcerequirements-v1-core for details
k8s.container.ephemeralstorage_limitMaximum resource limit set for the container. See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#resourcerequirements-v1-core for details
k8s.container.ephemeralstorage_requestResource requested for the container. See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#resourcerequirements-v1-core for details
k8s.container.memory_limitMaximum resource limit set for the container. See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#resourcerequirements-v1-core for details
k8s.container.memory_requestResource requested for the container. See https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#resourcerequirements-v1-core for details

カウントコネクター

カウントコネクターは、パイプラインを通過するメトリクス系列の数をカウントすることで、オブジェクトカウントメトリクスを生成します。これにより、次のメトリクスが生成されます。

OTELDESCRIPTION
k8s.job.countThe current count of jobs.
k8s.node.countThe current count of nodes.
k8s.service.countThe current count of services.

参考資料