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
同じアーキテクチャはトレースの収集にも使用できます。この場合、Collector がエンドポイントに接続して Prometheus メトリクスをスクレイピングする代わりに、アプリケーション Pod からトレーススパンが Collector に送信されます。
長所と短所
利点
- スケーリングの懸念が最小限
- 高可用性の設定が課題
- 使用中の Collector のコピーが多すぎる
- ログのサポートが容易になる可能性がある
欠点
- リソース利用の観点から最適ではない
- リソース割り当てが不均衡
Amazon EC2 上でのコレクターの実行
EC2 上でコレクターを実行する場合、サイドカーアプローチはありません。EC2 インスタンス上でエージェントとしてコレクターを実行することになります。以下のような静的なスクレイプ設定を行うことで、インスタンス内のメトリクスをスクレイプするターゲットを発見できます。
以下の設定は、localhost 上のポート 9090
と 8081
のエンドポイントをスクレイプします。
このトピックについて実践的な深い経験を得るには、One Observability Workshop の EC2 に焦点を当てたモジュールをご覧ください。
global:
scrape_interval: 15s # デフォルトでは、15 秒ごとにターゲットをスクレイプします。
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090', 'localhost:8081']
Amazon EKS 上で Deployment としてコレクターを実行する
コレクターを Deployment として実行することは、コレクターの高可用性を提供したい場合に特に有用です。ターゲットの数、スクレイプ可能なメトリクスなどに応じて、コレクターのリソースを調整する必要があります。これにより、コレクターがリソース不足に陥り、シグナル収集に問題が生じることを防ぎます。
このトピックについて、ガイドでさらに詳しく読むことができます。
以下のアーキテクチャは、メトリクスとトレースを収集するために、ワークロードノードとは別のノードにコレクターがデプロイされる様子を示しています。
メトリクス収集の高可用性をセットアップするには、詳細な手順を提供するドキュメントをお読みください