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

Alibaba Cloud Service Mesh:mTLS 経由でのメッシュアプリケーションのメトリクス収集

最終更新日:Jun 21, 2026

Service Mesh (ASM) で相互 TLS (mTLS) を有効にすると、サイドカープロキシはアプリケーションへのすべてのインバウンドトラフィックをインターセプトします。その結果、アプリケーションメトリクスを公開するポートにも mTLS 経由でアクセスする必要があります。重要なサービスにとって、メトリクス収集の保護は、サービス間の通信を暗号化することと同じくらい重要です。このトピックでは、Prometheus Operator と共にデプロイされた Service Mesh (ASM) インスタンスを使用して、サービスメッシュ内のアプリケーションから mTLS 経由でメトリクスを収集する方法を説明します。

重要

Alibaba Cloud Application Real-Time Monitoring Service (ARMS) を使用してメトリクスを収集する場合、エージェントのバージョンは 1.1.20 以降である必要があります。ARMS コンソールにログインします。左側のナビゲーションペインで、アクセス管理 をクリックします。リストからクラスターを見つけ、[Actions] 列の [Configure Agent] をクリックして Prometheus エージェントのバージョンを確認し、必要に応じてアップグレードします。

前提条件

Bookinfo サンプルアプリケーションがデプロイされていること。詳細については、「ASM インスタンスに関連付けられたクラスターへのアプリケーションのデプロイ」をご参照ください。

TLS 経由でメトリクスをスクレイプするための Prometheus の設定

サイドカープロキシが強制する TLS 認証をパスするために、Prometheus は ASM インスタンスのルート証明書によって発行された証明書を使用する必要があります。これは、サイドカープロキシの証明書マウント機能を使用することで実現できます。Prometheus Pod に特定の annotation を定義することで、ASM コントロールプレーンによって発行された証明書を共有 volume にマウントするようにサイドカープロキシを設定します。その後、Prometheus コンテナはこの共有 volume をマウントすることで、証明書とキーにアクセスできます。このプロセスを以下の手順で説明します。

  1. istio-certs volume を Prometheus Pod に追加します。

    volumes:
    - emptyDir:
        medium: Memory
      name: istio-certs
  2. 次の 2 つの annotation を Prometheus Pod に追加します。

    annotations:
      proxy.istio.io/config: |
        proxyMetadata:
          OUTPUT_CERTS: /etc/istio-output-certs
      sidecar.istio.io/userVolumeMount: '[{"name": "istio-certs", "mountPath": "/etc/istio-output-certs"}]'
    • proxy.istio.io/config:プロキシ設定を指定します。ここで、proxyMetadata.OUTPUT_CERTS は証明書とキーを /etc/istio-output-certs パスに格納します。

    • sidecar.istio.io/userVolumeMount:サイドカープロキシコンテナの /etc/istio-output-certs パスに volume をマウントします。

  3. istio-certs volume を Prometheus コンテナの /etc/prom-certs/ パスにマウントして、Prometheus がサイドカープロキシによってこのパスに書き込まれた証明書とキーを取得できるようにします。

    volumeMounts:
    - mountPath: /etc/prom-certs/
      name: istio-certs
  4. スクレイプ設定で、TLS を使用してメトリクススクレイプリクエストを開始するワークロードを指定し、証明書パスを提供します。この設定は、サイドカープロキシがインジェクトされたワークロードにのみ必要です。

    このトピックでは、Prometheus Operator 環境を例として使用します。

    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
        tlsConfig:
          caFile: /etc/prom-certs/root-cert.pem
          certFile: /etc/prom-certs/cert-chain.pem
          keyFile: /etc/prom-certs/key.pem
          insecureSkipVerify: true

    上記の YAML では、labels フィールドは productpage アプリケーションのメトリクス収集を指定し、そのスクレイプエンドポイントが定義されています。エンドポイント定義における TLS 関連の設定は次のとおりです。

    • scheme: https:リクエストが HTTPS 経由で送信されることを指定します。

    • tlsConfig:証明書、CA 証明書、およびキーのファイルパスを指定します。

    • insecureSkipVerify: true:Prometheus が Istio のアイデンティティ命名スキームをサポートしていないため、安全でない認証を許可します。

上記の設定により、Prometheus はサイドカープロキシによって提供された証明書とキーをマウントし、それらを使用して TLS リクエストを開始することが可能になります。

操作手順

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

  1. 次のコマンドを実行して、GitHub から Prometheus Operator のソースリポジトリをローカルマシンにクローンします。

    git clone https://github.com/prometheus-operator/prometheus-operator.git
  2. 次のコマンドを実行して、Prometheus Operator をインストールします。

    cd prometheus-operator/
    kubectl create -f bundle.yaml
  3. 次のコマンドを実行して、Pod のステータスを確認します。

    kubectl get pods

    期待される出力:

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

    この出力は、Prometheus Operator が正常にインストールされたことを示します。

ステップ 2:CR を使用した Prometheus のデプロイ

  1. 次の YAML を prometheus.yaml という名前のローカルファイルに保存します。

    この YAML には、Prometheus インスタンスの宣言と、必要な ServiceAccount、ClusterRole、および ClusterRoleBinding が含まれています。デプロイ設定には、「TLS 経由でメトリクスをスクレイプするための Prometheus の設定」で説明されている証明書 volume のマウント設定が含まれています。

    説明

    このトピックで提供される Prometheus 関連のカスタムリソース (CR) は、デモンストレーションのみを目的としています。本番環境に合わせて調整してください。

    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: |  # 環境変数 `OUTPUT_CERTS` を設定して、証明書を指定されたフォルダーに書き込みます
            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/
        name: istio-certs
      replicas: 2
      version: v2.26.0
      serviceAccountName: prometheus-full-access
      serviceMonitorSelector:
        matchLabels:
          team: bookinfo
      ruleSelector:
        matchLabels:
          role: alert-rules
          prometheus: example
  2. 次のコマンドを実行して、prometheus.yaml ファイルをクラスターに適用します。

    kubectl apply -f prometheus.yaml
  3. 次のコマンドを実行して、Prometheus インスタンスが正しく起動したか確認します。

    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  

    出力は、prometheus-default-0 と prometheus-default-1 の Pod が実行中であることを示しています。

ステップ 3:ServiceMonitor を使用したスクレイプルールの定義

  1. 次の YAML を service-monitor.yaml という名前のローカルファイルに保存します。

    この YAML ファイルには、ワークロードからメトリクスを収集する方法を記述する ServiceMonitor API の宣言が含まれています。この YAML ファイルには、「TLS 経由でメトリクスをスクレイプするための Prometheus の設定」で言及されている証明書パスと scheme 設定が示されています。

    説明

    このトピックで提供される Prometheus 関連の CR は、デモンストレーションのみを目的としています。本番環境に合わせて調整してください。

    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
        tlsConfig:
          caFile: /etc/prom-certs/root-cert.pem
          certFile: /etc/prom-certs/cert-chain.pem
          keyFile: /etc/prom-certs/key.pem
          insecureSkipVerify: true
  2. 次のコマンドを実行して、service-monitor.yaml ファイルをクラスターに適用します。

    kubectl apply -f service-monitor.yaml

ステップ 4:Prometheus UI へのアクセスとメトリクスの検証

  1. 次のコマンドを実行して、ローカルポート 9090 から prometheus-operated サービスのポート 9090 へのポートフォワーディングを設定します。

    kubectl port-forward svc/prometheus-operated 9090
  2. ブラウザで localhost:9090 と入力して、Prometheus Web UI を開きます。

    Prometheus のクエリインターフェイスが開きます。[Expression] 入力ボックスにクエリ式を入力し、[Execute] をクリックしてクエリを実行し、[Table] または [Graph] タブで結果を表示できます。

  3. トップメニューバーで [ステータス] > [ターゲット] を選択すると、監視対象のステータスが表示されます。

    説明

    ターゲットが TLS 経由でスクレイプされる場合、最初はステータスが "Unavailable" と表示されることがあります。これは、TLS が設定されているものの、認証設定が正しくない場合に発生する可能性があります。

    ターゲットの [State][Up] になっていることを確認します。これは、メトリクスが正常にスクレイプされていることを示します。

  4. 上部メニューで [Graph] をクリックし、クエリテキストボックスに python_gc_objects_collected_total と入力して、右側の [Execute] をクリックします。

    クエリが完了すると、レポートされたメトリクスデータが表示されます。

    クエリ結果は [Table] ビューに表示され、generation タグによって 3 つのレコード (generation 0、1、2) にグループ化されます。これらのレコードは、Python の 3 つのガベージコレクション (GC) 世代のそれぞれによって収集されたオブジェクトの総数に対応します。