Amazon Elastic Kubernetes Service スクラスターで AWS Distro for OpenTelemetry を使用してメトリクスの取り込みを設定する
AWS Distro for OpenTelemetry (ADOT) コレクターを使用して、Prometheus でインストルメント化したアプリケーションからメトリクスをスクレイピングし、そのメトリクスを Amazon Managed Service for Prometheus に送信できます。
注記
ADOT コレクターの詳細については、「AWS Distro for OpenTelemetry
Prometheus でインストルメント化したアプリケーションの詳細については、「Prometheus と互換性のあるメトリクスとはどのようなものですか。」を参照してください。
ADOT による Prometheus メトリクスの収集には、Prometheus Receiver、Prometheus Remote Write Exporter、Sigv4 Authentication Extension という 3 つの OpenTelemetry コンポーネントが使用されます。
既存の Prometheus の設定を使用して Prometheus Receiver を構成して、サービス検出とメトリクスのスクレイピングを実行できます。Prometheus Receiver は、メトリクスを Prometheus 公開形式でスクレイピングします。スクレイピング対象のアプリケーションやエンドポイントは、Prometheus クライアントライブラリで構成する必要があります。Prometheus Receiver は、Prometheus ドキュメントの「Configuration
Prometheus Remote Write Exporter は、remote_write エンドポイントを使用して、スクレイピングされたメトリクスを管理ポータルワークスペースに送信します。データをエクスポートする HTTP リクエストは、Sigv4 Authentication Extension を使用して、安全な認証のための AWS プロトコルである AWS SigV4 で署名されます。詳細については、「Signature Version 4 の署名プロセス」を参照してください。
コレクターは、Amazon EKS 上の Prometheus メトリクスエンドポイントを自動的に検出し、<kubernetes_sd_config>
以下のデモは、Amazon Elastic Kubernetes Service または自己管理型 Kubernetes を実行しているクラスターでのこの設定の例を示しています。これらのステップを実行するには、デフォルトの AWS 認証情報チェーンに含まれているオプションのいずれかの AWS 認証情報が必要です。詳細については、「Configuring the AWS SDK for Go」を参照してください。このデモでは、プロセスの統合テストに使用されるサンプルアプリを使用します。このサンプルアプリは、Prometheus クライアントライブラリのように、/metrics エンドポイントでメトリクスを公開します。
前提条件
以下の取り込み設定手順を開始する前に、サービスアカウントの IAM ロールと信頼ポリシーを設定する必要があります。
サービスアカウントの IAM ロールと信頼ポリシーを設定するには
-
「Amazon EKS クラスターからメトリクスを取り込むためのサービスロールの設定」の手順に従って、サービスアカウントの IAM ロールを作成します。
ADOT コレクターは、メトリクスをスクレイピングしてエクスポートするときにこのロールを使用します。
-
次に、信頼ポリシーを編集します。IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
左側のナビゲーションペインで [ロール] を選択し、ステップ 1 で作成した amp-iamproxy-ingest-role を探します。
-
[信頼関係] タブを選択し、[信頼関係の編集] を選択します。
-
信頼関係ポリシーの JSON で、
aws-ampをadot-colに置き換えて [信頼ポリシーの更新] を選択します。最終的なポリシーは次のようになります。 -
[アクセス許可] タブを選択し、次のアクセス許可ポリシーがロールにアタッチされていることを確認します。
Prometheus メトリクスの収集の有効化
注記
Amazon EKS で名前空間を作成すると、alertmanager とノードエクスポーターはデフォルトで無効になっています。
Amazon EKS または Kubernetes クラスターで Prometheus の収集を有効にするには
-
aws-otel-community
のリポジトリから、サンプルアプリをフォークしてクローンします。 次に、以下のコマンドを実行します。
cd ./sample-apps/prometheus-sample-app docker build . -t prometheus-sample-app:latest -
このイメージを Amazon ECR や DockerHub などのレジストリにプッシュします。
-
次のように Kubernetes 設定をコピーして適用し、サンプルアプリをクラスターにデプロイします。
prometheus-sample-app.yamlファイル内の{{PUBLIC_SAMPLE_APP_IMAGE}}は、先ほどプッシュしたイメージに置き換えます。curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/examples/eks/aws-prometheus/prometheus-sample-app.yaml -o prometheus-sample-app.yaml kubectl apply -f prometheus-sample-app.yaml -
次のコマンドを入力して、サンプルアプリが起動したことを確認します。コマンドの出力で、
NAME列にprometheus-sample-appが表示されます。kubectl get all -n aoc-prometheus-pipeline-demo -
ADOT コレクターのデフォルトのインスタンスを起動します。そのためには、まず次のコマンドを入力して、ADOT コレクターの Kubernetes 設定を取得します。
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/examples/eks/aws-prometheus/prometheus-daemonset.yaml -o prometheus-daemonset.yaml次に、テンプレートファイルを編集して、
YOUR_ENDPOINTを Amazon Managed Service for Prometheus ワークスペースの remote_write エンドポイントに、YOUR_REGIONを使用中のリージョンに置き換えます。ワークスペースの詳細を確認したときに Amazon Managed Service for Prometheus コンソールに表示される remote_write エンドポイントを使用してください。また、Kubernetes 設定のサービスアカウントセクションで、
YOUR_ACCOUNT_IDを AWS のアカウント ID に変更する必要もあります。この例では、ADOT コレクターの設定で注釈 (
scrape=true) を使用して、スクレイピングするターゲットエンドポイントを指定しています。ADOT コレクターは、これによってサンプルアプリのエンドポイントをクラスター内の kube-system エンドポイントから区別できます。別のサンプルアプリをスクレイピングする場合は、これを再ラベル付けの設定から削除できます。 -
次のコマンドを入力して、ADOT コレクターをデプロイします。
kubectl apply -f prometheus-daemonset.yaml -
次のコマンドを入力して、ADOT コレクターが起動したことを確認します。
NAMESPACE列でadot-colを探してください。kubectl get pods -n adot-col -
ログエクスポーターを使用して、パイプラインが機能することを確認します。サンプルテンプレートは既にログエクスポーターと統合されています。次のコマンドを入力します。
kubectl get pods -A kubectl logs -n adot-colname_of_your_adot_collector_podサンプルアプリからスクレイピングされたメトリクスの一部は、次の例のようになります。
Resource labels: -> service.name: STRING(kubernetes-service-endpoints) -> host.name: STRING(192.168.16.238) -> port: STRING(8080) -> scheme: STRING(http) InstrumentationLibraryMetrics #0 Metric #0 Descriptor: -> Name: test_gauge0 -> Description: This is my gauge -> Unit: -> DataType: DoubleGauge DoubleDataPoints #0 StartTime: 0 Timestamp: 1606511460471000000 Value: 0.000000 -
Amazon Managed Service for Prometheus がメトリクスを受け取ったかどうかをテストするには、
awscurlを使用します。このツールでは、AWS SigV4 認証を使用してコマンドラインから HTTP リクエストを送信できます。そのためには、Amazon Managed Service for Prometheus からクエリを実行するための適切なアクセス許可を使用して、AWS 認証情報がローカルに設定されている必要があります。awscurlのインストール手順については、awscurlを参照してください。 次のコマンドの
AMP_REGIONとAMP_ENDPOINTは、Amazon Managed Service for Prometheus ワークスペースの情報に置き換えます。awscurl --service="aps" --region="AMP_REGION" "https://AMP_ENDPOINT/api/v1/query?query=adot_test_gauge0" {"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"adot_test_gauge0"},"value":[1606512592.493,"16.87214000011479"]}]}}レスポンスとしてメトリクスを受け取れば、パイプラインの設定が成功し、サンプルアプリから Amazon Managed Service for Prometheus にメトリクスが正常に伝搬されたことを意味します。
クリーンアップ
このデモをクリーンアップするには、次のコマンドを入力します。
kubectl delete namespace aoc-prometheus-pipeline-demo kubectl delete namespace adot-col
高度な設定
Prometheus Receiver は、Prometheus ドキュメントの「Configuration
Prometheus Receiver の設定には、サービス検出、スクレイピング設定、再ラベル設定が含まれます。レシーバーの設定は次のようになります。
receivers: prometheus: config: [[Your Prometheus configuration]]
設定ファイルの例を以下に示します。
receivers: prometheus: config: global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: kubernetes-service-endpoints sample_limit: 10000 kubernetes_sd_configs: - role: endpoints tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
既存の Prometheus 設定がある場合は、値が環境変数で置き換えられないように、$ 文字を $$ に置き換える必要があります。*これは、relabel_configurations の replacement の値で特に重要です。例えば、次のような relabel_configurations があるとします。
relabel_configs: - source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path] regex: (.+);(.+);(.+) replacement: ${1}://${2}${3} target_label: __param_target
これは次のように変更します。
relabel_configs: - source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path] regex: (.+);(.+);(.+) replacement: $${1}://${2}${3} target_label: __param_target
Prometheus Remote Write Exporter と Sigv4 Authentication Extension
Prometheus Remote Write Exporter と Sigv4 Authentication Extension の設定は、Prometheus Receiver よりも簡単です。パイプラインのこの段階では、既にメトリクスが取り込まれていて、このデータを Amazon Managed Service for Prometheus にエクスポートする準備ができています。次の例は、Amazon Managed Service for Prometheus と通信するための適切な設定の最小要件を示しています。
extensions: sigv4auth: service: "aps" region: "user-region" exporters: prometheusremotewrite: endpoint: "https://aws-managed-prometheus-endpoint/api/v1/remote_write" auth: authenticator: "sigv4auth"
この設定は、デフォルトの AWS 認証情報チェーンから AWS 認証情報を使用して、AWS SigV4 で署名された HTTPS リクエストを送信します。詳細については、「Configuring the AWS SDK for Go」を参照してください。サービスには aps を指定する必要があります。
デプロイ方法にかかわらず、ADOT コレクターは、デフォルトの AWS 認証情報チェーンに含まれているオプションのいずれかにアクセスできる必要があります。Sigv4 Authentication Extension は AWS SDK for Go に依存し、これを使用して認証情報を取得して認証します。これらの認証情報に、Amazon Managed Service for Prometheus のリモート書き込みアクセス許可があることを確認する必要があります。