Amazon Web Services ブログ

AWS Distro for OpenTelemetry の Amazon EKS アドオンを使用したメトリクスとトレースの収集

この記事は Metrics and traces collection using Amazon EKS add-ons for AWS Distro for OpenTelemetry (記事公開日: 2022 年 4 月 22 日) を翻訳したものです。

イントロダクション

Amazon Elastic Kubernetes Service (Amazon EKS) は、Kubernetes のコントロールプレーンを管理するという負担の大きい作業を、ユーザーからオフロードするマネージドサービスです。これにより、ユーザーはデータプレーン上のアプリケーションワークロードを管理するために必要なツールを、柔軟にインストールできます。しかし、多くのお客様は、クラスターのいわゆる Day-2 オペレーションに不可欠なこれらのツールのいくつかを、AWS が管理することを望んでいます。これには、Amazon VPC CNI のようなクラスターネットワーキング用のツールや、ワークロードを監視するためのツールが含まれます。こうした運用ソフトウェアのライフサイクル管理を提供するために、2020 年 12 月に EKS アドオンが導入されました (日本語翻訳)。アドオンは EKS クラスターにおいて運用機能を提供するソフトウェアであり、ユーザーがプロダクショングレードのクラスターを安定して安全に運用することを容易にします。

AWS Distro for OpenTelemetry (ADOT) はセキュアで、AWS がサポートする OpenTelemetry プロジェクトのディストリビューションです。ユーザーは、アプリケーションを一度インストルメント (訳注: アプリケーションに計測のためのコードを追加すること) するだけで、ADOT を使用して、相関のあるメトリクスとトレースを複数の監視ソリューションに送信することができます。Amazon EKS では、クラスターを起動した後、いつでもアドオンとして ADOT を有効化できるようになりました。ADOT アドオンには、最新のセキュリティパッチとバグ修正が含まれており、Amazon EKS で動作することが AWS によって検証されています。このブログ記事では、EKS クラスターに ADOT アドオンをインストールし、ADOT アドオンを使用してクラスターにデプロイされたアプリケーションワークロードからメトリクスとトレースを収集する方法を紹介します。

ADOT の EKS アドオンは一般提供開始 (GA) となります。ADOT では、トレースのサポートは一般利用可能 (GA) であり、メトリクスのサポートはプレビュー、ログのサポートはアルファ版です。

ADOT Collector の概要

OpenTelemetry は、トレース、メトリクス、ログなどのテレメトリデータの作成と管理のために設計された API、SDK、ツールのセットです。AWS Distro for OpenTelemetry Collector (ADOT Collector) は、アップストリームの OpenTelemetry Collector の AWS サポートバージョンであり、EKS を含む AWS コンピューティングプラットフォームと完全な互換性を持っています。これにより、ユーザーはテレメトリーデータを Amazon CloudWatch、Amazon Managed Service for Prometheus、AWS X-Ray などの AWS マネージドサービスに送信できます。

ADOT Collector には、Receiver、Processor、Exporter という 3 つの主要なタイプのコンポーネントで構成されるパイプラインのコンセプトがあります。Receiver は、データが Collector に入る部分です。特定のフォーマットでデータを受け取り、内部フォーマットに変換し、パイプラインで定義された Processor や Exporter に渡します。Receiver はプル型とプッシュ型があります。Processor はオプションのコンポーネントで、データを受け取ってからエクスポートするまでの間に、データのバッチ処理、フィルタリング、変換などのタスクを実行するために使用されます。Exporter は、メトリクス、ログ、トレースの送信先を決定するために使用されます。Collector のアーキテクチャでは、Kubernetes YAML マニフェストを通じて、このようなパイプラインの複数のインスタンスをセットアップすることができます。

次の図は、2 つのパイプラインで構成され、テレメトリデータを異なる宛先に送信している ADOT Collector を示しています。トレースパイプラインは、AWS X-Ray ReceiverAWS X-Ray Exporter のインスタンスで構成され、トレースを AWS X-Ray に送信します。メトリクスパイプラインは、Prometheus Receiver、Processor、AWS Prometheus Remote Write Exporterで構成され、Amazon Managed Service for Prometheus のワークスペースにメトリクスデータを送信します。

ADOT Collector、AWS X-Ray、Prometheus Receiver のパイプライン

EKS クラスターに ADOT アドオンをインストールし、ワークロードからテレメトリデータを収集するための詳細を掘り下げてみましょう。以下は、ADOT アドオンをインストールする前に必要な前提条件のリストです。

  • Kubernetes バージョン 1.19 以降の EKS クラスター。EKS クラスターは、ここで説明されているアプローチのいずれかを使用して作成できます。
  • クラスターにまだインストールされていない場合は、Certificate Manager をインストールしてください。このドキュメントに従って、デフォルトの設定でインストールすることができます。バージョン 1.6.0 未満を使用していることを確認してください (1.6.0 はサポートされていません) 。
  • クラスターに ADOT アドオンをインストールするための EKS アドオン専用の Kubernetes RBAC アクセス許可。kubectl などの CLI ツールを使用して、この YAML ファイルの設定をクラスターに apply することで実現できます。

次のコマンドを使用して、さまざまな EKS バージョンで有効になっているアドオンのリストを確認することができます。

aws eks describe-addon-versions

JSON 出力には、以下のように ADOT アドオンがリストされるはずです。EKS クラスターが作成されるとき、EKS アドオンはそのクラスターにいずれのアドオンもインストールしないことに注意してください。

{
   "addonName":"adot",
   "type":"observability",
   "addonVersions":[
      {
         "addonVersion":"v0.45.0-eksbuild.1",
         "architecture":[
            "amd64"
         ],
         "compatibilities":[
            {
               "clusterVersion":"1.22",
               "platformVersions":[
                  "*"
               ],
               "defaultVersion":true
            },
            {
               "clusterVersion":"1.21",
               "platformVersions":[
                  "*"
               ],
               "defaultVersion":true
            },
            {
               "clusterVersion":"1.20",
               "platformVersions":[
                  "*"
               ],
               "defaultVersion":true
            },
            {
               "clusterVersion":"1.19",
               "platformVersions":[
                  "*"
               ],
               "defaultVersion":true
            }
         ]
      }
   ]
}

次に、以下のコマンドを使用して ADOT アドオンをインストールします。

aws eks create-addon --addon-name adot --addon-version v0.45.0-eksbuild.1 --cluster-name $CLUSTER_NAME

バージョン文字列は、先に確認した出力の addonVersion フィールドの値と一致する必要があります。このコマンドを正常に実行した場合の出力は、以下のようになります。

{
    "addon": {
        "addonName": "adot",
        "clusterName": "k8s-production-cluster",
        "status": "ACTIVE",
        "addonVersion": "v0.45.0-eksbuild.1",
        "health": {
            "issues": []
        },
        "addonArn": "arn:aws:eks:us-east-1:123456789000:addon/k8s-production-cluster/adot/f0bff97c-0647-ef6f-eecf-0b2a13f7491b",
        "createdAt": "2022-04-04T10:36:56.966000+05:30",
        "modifiedAt": "2022-04-04T10:38:09.142000+05:30",
        "tags": {}
    }
}

アドオンが ACTIVE 状態になるまで待ってから、次のステップに進みます。アドオンの状態は、以下のコマンドで確認できます。

aws eks describe-addon --addon-name adot --cluster-name $CLUSTER_NAME

ADOT Collector のデプロイ

ADOT アドオンは、Kubernetes Operator の実装です。これは Kubernetes のソフトウェア拡張機能であり、カスタムリソースを利用してアプリケーションとそのコンポーネントを管理します。アドオンは OpenTelemetryCollector という名前のカスタムリソースを監視し、カスタムリソースに指定された構成設定に基づいて ADOT Collector のライフサイクルを管理します。次の図は、これがどのように機能するかを示しています。

カスタムリソースで指定された構成設定に基づく、ADOT Collector のライフサイクル

次に、ADOT Collector をデプロイする方法について見てみましょう。この YAML 設定ファイルでは、OpenTelemetryCollector カスタムリソースを定義しています。EKS クラスターにデプロイすると、ADOT アドオンがトリガーされ、上の最初の図に示されているように、コンポーネントを含むトレースとメトリクスのパイプラインを含む ADOT Collector がプロビジョニングされます。Collector は、${custom-resource-name}-collector という名前の Kubernetes Deployment として aws-otel-eks Namespace に起動されます。また、同名の ClusterIP Service も起動されます。この Collector のパイプラインを構成する個々のコンポーネントを見てみましょう。

トレースパイプラインの AWS X-Ray Receiver は、X-Ray Segment 形式のセグメントやスパンを受け取ります。そのため、X-Ray SDK でインストルメントされたマイクロサービスから送られたセグメントを処理できます。AWS X-Ray Receiver は UDP ポート 2000 のトラフィックをリッスンするように構成され、ClusterIP Service として公開されます。この構成では、この Receiver にトレースデータを送信したいワークロードは、環境変数 AWS_XRAY_DAEMON_ADDRESSobservability-collector.aws-otel-eks:2000 に設定する必要があります。Exporter は、PutTraceSegments API を使用して、これらのセグメントを X-Ray に直接送信します。

メトリクスパイプラインの Prometheus Receiver は、Prometheus サーバーの最小限の代替となることを目的としており、Prometheus クライアントライブラリでインストルメントされたマイクロサービスからメトリクスをスクレイピングすることができます。Prometheus Receiver はサービスディスカバリーを含む Prometheus 設定のフルセットをサポートしています。AWS Prometheus Remote Write Exporter は、Remote Write 機能を使用して、長期保存のために Amazon Managed Service for Prometheus の作成済みのワークスペースに透過的にメトリクスデータを送信できます。

セキュリティの観点から、構成で使用する Prometheus Receiver は、クラスター内のすべての Namespace にわたって Node、Service、Endpoint、Pod などのリソースをリストするための Kubernetes RBAC アクセス許可が必要です。これを可能にするために、ADOT Collector は aws-otel-collector という Kubernetes Service Account の ID で起動するように設定されています。この Service Account には、この設定に示されている ClusterRoleBinding と ClusterRole を 使ってこれらのアクセス許可が付与されています。Exporter には、X-Ray、Amazon Managed Service for Prometheus、CloudWatch にデータを送信するために IAM アクセス許可が必要です。これは、EKS がサポートする IAM Roles for Service Accounts (サービスアカウントの IAM ロール) 機能を使用して、Service Account と IAM ロールを関連付けることで実現できます。IAM ロールは、AWS 管理ポリシー の AWSXRayDaemonWriteAccess、AmazonPrometheusRemoteWriteAccess、および CloudWatchAgentServerPolicy に関連付けられる必要があります。CLUSTER_NAME と REGION 変数を設定した後、このヘルパースクリプトを使用して、これらのアクセス許可が付与され、aws-otel-collector Service Account に関連付けられた EKS-ADOT-ServiceAccount-Role という IAM ロールを作成することができます。

メトリクスとトレース収集のエンドツーエンドのテスト

では、これらをすべてまとめて、EKS クラスターにデプロイされたワークロードからのメトリクスとトレースの収集をテストしてみましょう。次の図は、このテストで使用したセットアップを示しています。これは、REST API のセットを公開し、S3 と対話するフロントエンドサービスと、Aurora PostgreSQL データベースのインスタンスと対話するデータストアサービスから構成されます。これらのサービスには、Prometheus クライアントライブラリと X-Ray SDK の両方を使用してインストルメントされています。前のセクションで説明した YAML マニフェストを使用して OpenTelemetryCollector カスタムリソースをデプロイすることにより、ADOT Collector が Deployment モードで起動されます。Postman クライアントは、フロントエンドサービスをターゲットとする外部トラフィックジェネレーターとして使用されます。

ADOT Collector は、フロントエンドサービスから http_requests_total という名前のメトリクスの Prometheus Counter をスクレイピングし、Amazon Managed Service for Prometheus に送信します。このメトリクスから PromQL 式 sum(rate(http_requests_total[5m])) を使用して処理される HTTP リクエストのレートを計算され、以下のグラフに示すように Amazon Managed Grafana で表示されます。

次のスクリーンショットは、サービスから取得したセグメントデータを用いて X-Ray が生成したサービスグラフと、各セグメントにおける平均応答時間を示しています。

Amazon CloudWatch を使用してメトリクスを収集したいお客様は、こちらの YAML 設定ファイルを使用して OpenTelemetryCollector カスタムリソースをデプロイできます。EKS クラスターにデプロイすると、ADOT アドオンがトリガーされ、次の図に示す ADOT Collector がプロビジョニングされます。Collector には、前の例でデプロイされたものと同じトレースパイプラインがあります。メトリクスパイプラインは、前の例と同じスクレイプ設定で Prometheus Receiver を使用してメトリクスを収集しますが、AWS CloudWatch EMF Exporter を使用して、メトリクスデータを埋め込みメトリクス形式 (EMF) のパフォーマンスログイベントに変換し、それを PutLogEvents API を使用して CloudWatch ロググループに直接送信します。このデータから、CloudWatch は http_requests_total という集約されたカスタムメトリクスを作成し、CloudWatch メトリクス名前空間 ContainerInsights/Prometheus で、Exporter 構成設定に従って EKS_ClusterEKS_NamespaceEKS_PodName というディメンションで利用できるようにします。

HTTP リクエストのレートは Metric Math 式を使用して計算され、以下のスクリーンショットに示されているように CloudWatch メトリクスダッシュボードに表示されます。

Collector 設定テンプレート

さまざまなパイプライン構成に関連する OpenTelemetryCollector のカスタムリソース定義を以下に示します。Amazon Managed Service for Prometheus、Amazon CloudWatch、AWS X-Ray と組み合わせて ADOT Collector を使用したいお客様は、これらの設定テンプレートから始めて、プレースホルダー変数をターゲット環境に基づいた値に置き換え、ADOT の EKS アドオンを使用して Amazon EKS クラスターに Collector を迅速にデプロイすることができます。

  1. Prometheus Receiver と AWS Remote Write Exporter を使用して Amazon Managed Service for Prometheus のワークスペースにメトリクスを送信するメトリクスパイプライン
  2. Prometheus Receiver と AWS CloudWatch EMF Exporter を使用して CloudWatch にメトリクスを送信するメトリクスパイプライン
  3. OTLP Receiver と AWS X-Ray Exporter を使用して AWS X-Ray にトレースを昇進するトレースパイプライン

まとめ

このブログ記事では、ADOT の EKS アドオンのデザインの概要と、アドオンが ADOT Operator を使用して EKS クラスター内の ADOT Collector の 1 つ以上のインスタンスのライフサイクルを管理する方法について説明しました。また、関連する構成設定を OpenTelemetryCollector カスタムリソースとしてパッケージし、アドオンをトリガーして AWS X-Ray にトレースを、Amazon Managed Service for Prometheus と Amazon CloudWatch にメトリクスを送信する Collector インスタンスをプロビジョニングする方法についても説明しました。

ADOT は、AWS のお客様に対して、お客様の環境へのオブザーバビリティツールのインストールフットプリントを削減する機能を提供します。ADOT Collector の 1 つのインスタンスは、クラスター内のアプリケーションワークロードからテレメトリデータを収集し、その後の分析や長期保存のためにさまざまな宛先のセットにエクスポートするように構成できます。ADOT Collector でトレース、メトリクス、およびログのパイプラインを構成するさまざまなコンポーネントを設定する方法を理解することは、困難な場合があります。ADOT の EKS アドオンは、EKS クラスターに複数の監視サービスを導入したいお客様に簡素化されたエクスペリエンスを提供することで、この問題に対処します。AWS が提供する設定テンプレートは、お客様が ADOT の使用を開始するための素早い足掛かりとなります。お客様は、これらのテンプレートを EKS クラスターにデプロイする前に、ニーズに応じてカスタマイズすることができます。

お客様には、Getting Started with ADOT using EKS add-ons ガイドを確認し、ADOT を EKS クラスターに導入し、ワークロードからテレメトリデータを収集することをお勧めします。EKS アドオンを使用して ADOT をオブザーバビリティのニーズに使用した経験や、このアドオンで必要な追加機能について、フィードバックを提供してください。AWS Containers Roadmap では、ロードマップを確認し、EKS アドオンでサポートして欲しい追加のアドオンについてフィードバックを提供できます。

翻訳はプロフェッショナルサービスの杉田が担当しました。原文はこちらです。