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 用のリソースデータを収集します。アプリケーションのインスツルメンテーションは行いません。
このセットアップでは、次の 3 つのコンポーネントを使用します。
kube-state-metrics は、デプロイメント、ノード、ポッドなどの Kubernetes オブジェクトに関するメトリクスを生成します。- クラスターコレクター。単一レプリカのデプロイメントとして実行され、クラスター全体のメトリクスとエクスプローラー用のリソースデータを収集します。
- ノードコレクター。DaemonSet として実行され、CPU やメモリ使用量など、各ノードからメトリクスを収集します。
クラスターコレクターは、Prometheus レシーバーを使用して kube-state-metrics をスクレイピングします。Prometheus サーバーをインストールする必要はありません。これらのメトリクスは、Kubernetes エクスプローラーからリンクされているダッシュボードに反映されます。k8sobjects レシーバーは、エクスプローラーのリソースデータを提供します。
セットアップ
これらの手順により、default 名前空間に新しいコレクターがデプロイされます。すでに Kubernetes メトリクスを収集している場合は、追加のコレクターをデプロイする前に既存の設定を確認し、重複した収集を回避してください。
前提条件
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"
OpenTelemetry Helm チャートリポジトリを追加します。
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo update
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"
両方のファイルで、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 レシーバーからのリソースデータを認識します。
daemonset-collector.yaml でトレース処理を更新します。参照ファイルはアプリケーショントレースもサポートしています。
- ノードコレクターがアプリケーショントレースを受信しない場合は、
datadog/connector、traces および traces/sampling パイプラインと、metrics パイプラインのレシーバーから datadog/connector を削除します。 - ノードコレクターがアプリケーショントレースを受信する場合は、推奨される Collector 構成を使用して、
datadog/connector をアップストリームの forward/traces_sample および span_metrics コネクタに置き換えます。
datadog 拡張機能とそのエントリーを service.extensions の下に保持します。この拡張機能は、ホストのエンリッチメントに使用される Collector メタデータを報告します。テレメトリのエクスポートは行いません。
両方のコレクターが同じクラスター名を報告していることを確認します。
- 自動的に検出するには、
k8s_api とプロバイダーの検出器を resourcedetection.detectors の下に保持し、他のクラウドプロバイダーの検出器を削除します。EKS、AKS、または GKE 用のプロバイダー検出器とその権限を構成します。 - それ以外の場合は、
resourcedetection.detectors を [k8s_api] に設定します。resource/add-cluster-name のコメントを解除し、両方のファイルで <YOUR_CLUSTER_NAME> を同じ値に置き換えます。resourcedetection を使用する各パイプラインで、その直後に resource/add-cluster-name を追加します。他のプロセッサーはそのままにしておきます。
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
セットアップを確認する
コレクターおよび kube-state-metrics ポッドが実行中で準備完了状態であることを確認します。
kubectl get pods --namespace default \
-l 'app.kubernetes.io/instance in (otel-daemon-collector,otel-cluster-collector,kube-state-metrics)'
Kubernetes - Overview ダッシュボードを開き、クラスターを選択します。ノードのリソース使用量および Kubernetes オブジェクトメトリクスを確認します。
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 からメトリクスを収集し、ポッド、コンテナ、ボリュームのリソース使用量に焦点を当てます。
| OTEL | DESCRIPTION | FILTER |
|---|
| k8s.node.filesystem.usage | Node filesystem usage | |
| k8s.pod.cpu.usage | Pod’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.usage | Pod filesystem usage | |
| k8s.pod.memory.rss | Pod 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.usage | Memory usage of the Pod. Note: Total memory usage of the Pod | |
| k8s.pod.network.errors | Pod network errors | direction: receive |
| k8s.pod.network.errors | Pod network errors | direction: transmit |
| k8s.pod.network.io | Network bytes for the Pod. | direction: receive |
| k8s.pod.network.io | Network bytes for the Pod. | direction: transmit |
Kubernetes クラスターレシーバー
k8sclusterreceiver は、ノード、ポッド、およびその他のオブジェクトのステータスや数など、クラスター レベルのメトリクスを収集します。
カウントコネクター
カウントコネクターは、パイプラインを通過するメトリクス系列の数をカウントすることで、オブジェクトカウントメトリクスを生成します。これにより、次のメトリクスが生成されます。
| OTEL | DESCRIPTION |
|---|
| k8s.job.count | The current count of jobs. |
| k8s.node.count | The current count of nodes. |
| k8s.service.count | The current count of services. |
参考資料