AWS Distro for OpenTelemetry (ADOT) Collector の運用
ADOT Collector は、CNCF によるオープンソースの OpenTelemetry Collector のダウンストリーム配布版です。
お客様は ADOT Collector を使用して、オンプレミス、AWS、その他のクラウドプロバイダーなど、さまざまな環境からメトリクスやトレースなどのシグナルを収集できます。
実際の環境で ADOT Collector を大規模に運用するためには、オペレーターは Collector の健全性を監視し、必要に応じてスケールする必要があります。このガイドでは、本番環境で ADOT Collector を運用するために取るべきアクションについて学びます。
デプロイメントアーキテクチャ
要件に応じて、検討すべきいくつかのデプロイメントオプションがあります。
- コレクターなし
- エージェント
- ゲートウェイ
これらの概念に関する追加情報については、OpenTelemetry のドキュメント をご確認ください。
コレクターなし
このオプションは、基本的にコレクターを完全に除外します。ご存知かもしれませんが、OTEL SDK から直接宛先サービスへの API 呼び出しを行い、シグナルを送信することが可能です。例えば、ADOT Collector のようなプロセス外エージェントにスパンを送信する代わりに、アプリケーションプロセスから直接 AWS X-Ray の PutTraceSegments API を呼び出すことを想像してみてください。
このアプローチに関する AWS 固有の側面はないため、より詳細な情報については、上流のドキュメントのセクションを参照することを強くお勧めします。
エージェント
このアプローチでは、コレクターを分散方式で実行し、シグナルを各送信先に収集します。No Collector
オプションとは異なり、ここでは関心事を分離し、アプリケーションがリソースを使用してリモート API コールを行う必要性を切り離し、代わりにローカルでアクセス可能なエージェントと通信します。
基本的に、Amazon EKS 環境では以下のように コレクターを Kubernetes のサイドカーとして実行します:
上記のアーキテクチャでは、コレクターがアプリケーションコンテナと同じ Pod で実行されているため、localhost
からターゲットをスクレイピングすることになります。そのため、スクレイプ設定でサービスディスカバリーメカニズムを使用する必要はありません。
同じアーキテクチャはトレースの収集にも適用されます。ここに示されているように、OTEL パイプラインを作成するだけです。
メリットとデメリット
-
この設計を支持する一つの論点は、ターゲットがローカルホストのソースに限定されているため、Collector が作業を行うために特別に多くのリソース(CPU、メモリ)を割り当てる必要がないことです。
-
このアプローチを使用することのデメリットは、Collector Pod の設定の多様性が、クラスター上で実行しているアプリケーションの数に比例することです。 つまり、各 Pod の予想されるワークロードに応じて、CPU、メモリ、その他のリソース割り当てを個別に管理する必要があります。これに注意を払わないと、Collector Pod に対してリソースを過剰に割り当てたり、過少に割り当てたりする可能性があり、その結果、パフォーマンスが低下したり、ノード内の他の Pod が使用できるはずの CPU サイクルやメモリを占有してしまう可能性があります。
また、ニーズに応じて、Deployment、DaemonSet、StatefulSet などの他のモデルで Collector をデプロイすることもできます。
Amazon EKS で Collector を Daemonset として実行する
Collector の負荷(メトリクスのスクレイピングと Amazon Managed Service for Prometheus ワークスペースへの送信)を EKS ノード全体に均等に分散させたい場合は、Collector を Daemonset として実行することができます。
Collector が自身のホスト/ノードからのみターゲットをスクレイピングするように、keep
アクションを設定していることを確認してください。
参考として以下のサンプルをご覧ください。より詳細な設定についてはこちらをご覧ください。
scrape_configs:
- job_name: kubernetes-apiservers
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- action: keep
regex: $K8S_NODE_NAME
source_labels: [__meta_kubernetes_endpoint_node_name]
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true