すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:Prometheus を使用した mTLS 経由でのアプリケーションメトリクスの収集

最終更新日:Mar 11, 2026

Service Mesh (ASM) インスタンスで相互 TLS (mTLS) が有効になっている場合、サイドカープロキシは Prometheus のスクレイプリクエストを含む、アプリケーションへのすべてのインバウンドトラフィックをインターセプトします。各アプリケーションのメトリクスエンドポイントに到達するには、Prometheus は ASM のルート認証局 (CA) によって発行された有効な証明書を提示する必要があります。

このガイドでは、セルフマネージド Prometheus インスタンス (Prometheus Operator) を設定して、ASM インスタンス内の mTLS 経由でアプリケーションメトリクスをスクレイプする方法を説明します。

重要

代わりに Application Real-Time Monitoring Service (ARMS) を使用してメトリクスを収集するには、ARMS エージェントをバージョン 1.1.20 以降にアップグレードする必要があります。ARMS コンソールで、左側のナビゲーションウィンドウで [連携管理] をクリックし、対象のクラスターを見つけて、[操作] 列の [エージェント設定] をクリックしてエージェントのバージョンを確認します。

仕組み

Prometheus が mTLS 経由でメトリクスをスクレイプするには、ASM コントロールプレーンによって発行された証明書が必要です。サイドカープロキシの証明書マウント機能は、手動での証明書管理なしでこれを処理します。

  1. メモリをバックエンドとする emptyDir ボリューム (istio-certs) が Prometheus Pod に追加されます。

  2. Pod のアノテーションは、サイドカープロキシに証明書とキーをこの共有ボリュームに書き込むように指示します。

  3. Prometheus コンテナは同じボリュームをマウントし、そこから証明書を読み取ります。

  4. ServiceMonitor カスタムリソース (CR) は、HTTPS 経由でスクレイプする際にこれらの証明書を使用するように Prometheus を設定します。

その結果、Prometheus はサイドカーが提供する証明書とキーをすべてのスクレイプリクエストにアタッチし、mTLS 認証を透過的にパスします。

前提条件

作業を開始する前に、以下のものがあることを確認してください。

  • ASM インスタンスに関連付けられた Kubernetes クラスター

  • デプロイ済みの Bookinfo サンプルアプリケーション -- 詳細については、「ASM インスタンスでのアプリケーションのデプロイ」をご参照ください

  • 対象クラスターの kubeconfig ファイルで設定された kubectl

ステップ 1: Prometheus Operator のインストール

  1. Prometheus Operator リポジトリをクローンします。

       git clone https://github.com/prometheus-operator/prometheus-operator.git
  2. Prometheus Operator をインストールします。

       cd prometheus-operator/
       kubectl create -f bundle.yaml
  3. インストールを確認します。

       kubectl get pods

    期待される出力:

       NAME                                     READY   STATUS    RESTARTS
       prometheus-operator-58dd988c9c-qhrrp     2/2     Running   0

ステップ 2: mTLS 証明書マウントを使用した Prometheus インスタンスのデプロイ

このステップでは、ASM が発行した証明書にアクセスできる Prometheus インスタンスを実行するために必要な ServiceAccount、ClusterRole、および Prometheus CR を作成します。

説明

このガイドの CR はデモンストレーション用です。本番環境の要件に合わせて調整してください。

  1. 次の YAML を prometheus.yaml として保存します。

       apiVersion: v1
       kind: ServiceAccount
       metadata:
         name: prometheus-full-access
         namespace: default
       ---
       apiVersion: rbac.authorization.k8s.io/v1
       kind: ClusterRole
       metadata:
         name: prometheus-full-access
       rules:
       - apiGroups: [""]
         resources:
         - nodes
         - nodes/metrics
         - services
         - endpoints
         - pods
         verbs: ["get", "list", "watch"]
       - apiGroups:
         - extensions
         - apps
         resources:
         - deployments
         - replicasets
         verbs: ["get", "list", "watch"]
       - apiGroups: [""]
         resources:
         - configmaps
         verbs: ["get"]
       - nonResourceURLs: ["/metrics"]
         verbs: ["get"]
       ---
       apiVersion: monitoring.coreos.com/v1
       kind: Prometheus
       metadata:
         name: default
         labels:
           prometheus: default
       spec:
         logLevel: debug
         podMetadata:
           annotations:
             traffic.sidecar.istio.io/includeInboundPorts: ""   # インバウンドポートをインターセプトしない
             traffic.sidecar.istio.io/includeOutboundIPRanges: ""  # アウトバウンドトラフィックをインターセプトしない
             proxy.istio.io/config: |  # 証明書を共有ボリュームに書き込む
               proxyMetadata:
                 OUTPUT_CERTS: /etc/istio-output-certs
             sidecar.istio.io/userVolumeMount: '[{"name": "istio-certs", "mountPath": "/etc/istio-output-certs"}]'  # サイドカープロキシに共有ボリュームをマウントする
         volumes:
         - emptyDir:
             medium: Memory
           name: istio-certs
         volumeMounts:
         - mountPath: /etc/prom-certs/  # Prometheus はこのパスから証明書を読み取る
           name: istio-certs
         replicas: 2
         version: v2.26.0
         serviceAccountName: prometheus-full-access
         serviceMonitorSelector:
           matchLabels:
             team: bookinfo
         ruleSelector:
           matchLabels:
             role: alert-rules
             prometheus: example

    主なアノテーションの説明:

    アノテーション目的
    traffic.sidecar.istio.io/includeInboundPorts: ""サイドカーが Prometheus へのインバウンドトラフィックをインターセプトするのを防ぎます。Prometheus の直接エンドポイントスクレイピングモデルは、サイドカープロキシと互換性がありません。
    traffic.sidecar.istio.io/includeOutboundIPRanges: ""サイドカーがアウトバウンドのスクレイプリクエストをインターセプトするのを防ぎます。
    proxy.istio.io/configOUTPUT_CERTSサイドカープロキシに証明書とキーを /etc/istio-output-certs
    sidecar.istio.io/userVolumeMountサイドカーコンテナ内の /etc/istio-output-certsistio-certs ボリュームをマウントします。

    volumeMounts セクションは、同じ istio-certs ボリュームを Prometheus コンテナ内の /etc/prom-certs/ にマウントします。両方のコンテナがボリュームを共有するため、Prometheus はサイドカーが書き込んだ証明書を読み取ることができます。

  2. 設定を適用します。

       kubectl apply -f prometheus.yaml
  3. Prometheus Pod が実行中であることを確認します。

       kubectl get pods

    期待される出力:

       NAME                                   READY   STATUS    RESTARTS
       prometheus-default-0                   3/3     Running   0
       prometheus-default-1                   3/3     Running   0
       prometheus-operator-58dd988c9c-qhrrp   2/2     Running   0

ステップ 3: mTLS 経由でメトリクスをスクレイプするための ServiceMonitor の作成

ServiceMonitor CR は、どのワークロードをスクレイプするか、また mTLS 経由でどのように認証するかを Prometheus に指示します。mTLS スクレイピングが必要なのは、サイドカープロキシがインジェクトされたワークロードのみです。ServiceMonitor の team: bookinfo ラベルは、ステップ 2 の Prometheus CR の serviceMonitorSelector と一致する必要があります。

説明

このガイドの CR はデモンストレーション用です。本番環境の要件に合わせて調整してください。

  1. 次の YAML を service-monitor.yaml として保存します。

       apiVersion: monitoring.coreos.com/v1
       kind: ServiceMonitor
       metadata:
         name: productpage
         labels:
           app: productpage
           team: bookinfo
       spec:
         selector:
           matchLabels:
             app: productpage
         endpoints:
         - port: http-9080
           interval: 30s
           path: /metrics
           scheme: https                                    # HTTPS 経由でスクレイプ
           tlsConfig:
             caFile: /etc/prom-certs/root-cert.pem          # ASM ルート CA 証明書
             certFile: /etc/prom-certs/cert-chain.pem       # クライアント証明書チェーン
             keyFile: /etc/prom-certs/key.pem                # クライアントの秘密鍵
             insecureSkipVerify: true                        # サーバー ID 検証をスキップ (下記の注記を参照)

    設定の詳細:

    • scheme: https -- Prometheus は HTTPS 経由でスクレイプリクエストを送信します。これは mTLS に必要です。

    • tlsConfig -- サイドカープロキシが共有ボリュームに書き込んだ証明書、CA 証明書、およびキーファイルを指します。

    • insecureSkipVerify: true -- Prometheus は Istio の ID 命名スキーム (SPIFFE) をサポートしていないため、サーバー証明書検証をスキップする必要があります。mTLS ハンドシェイクは、クライアント証明書検証を通じて相互認証を提供します。

  2. ServiceMonitor を適用します。

       kubectl apply -f service-monitor.yaml

ステップ 4: メトリクス収集の確認

  1. Prometheus サービスへのポートフォワーディングを設定します。

       kubectl port-forward svc/prometheus-operated 9090
  2. ブラウザで http://localhost:9090 を開きます。

    Prometheus web UI

  3. 上部のナビゲーションバーで [Status] > [Target] をクリックします。監視対象のターゲットの [State][Up] であることを確認します。これは、Prometheus が mTLS 経由でメトリクスを正常にスクレイプしていることを示します。

    説明

    [State] が Unavailable と表示される場合、mTLS 認証が正しく設定されていない可能性があります。ServiceMonitor の証明書パスがボリュームマウントパスと一致していること、およびサイドカープロキシが Prometheus Pod にインジェクトされていることを確認してください。

    Target status showing Up

  4. 上部のナビゲーションバーで [Graph] をクリックします。クエリボックスに python_gc_objects_collected_total と入力し、[Execute] をクリックします。クエリ結果に収集されたメトリクスが表示されます。

    Reported metrics graph

設定の概要

次の表は、すべてのコンポーネントにわたる主要な設定ポイントをまとめたものです。

コンポーネント設定目的
Pod ボリュームistio-certs という名前の emptyDir証明書用の共有ストレージ
サイドカーアノテーションOUTPUT_CERTS + userVolumeMountサイドカーが証明書を共有ボリュームに書き込む
Prometheus ボリュームマウント/etc/prom-certs/Prometheus が共有ボリュームから証明書を読み取る
ServiceMonitorscheme: https + tlsConfigPrometheus が mTLS スクレイプリクエストに証明書を使用する