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 コントロールプレーンによって発行された証明書が必要です。サイドカープロキシの証明書マウント機能は、手動での証明書管理なしでこれを処理します。
メモリをバックエンドとする
emptyDirボリューム (istio-certs) が Prometheus Pod に追加されます。Pod のアノテーションは、サイドカープロキシに証明書とキーをこの共有ボリュームに書き込むように指示します。
Prometheus コンテナは同じボリュームをマウントし、そこから証明書を読み取ります。
ServiceMonitor カスタムリソース (CR) は、HTTPS 経由でスクレイプする際にこれらの証明書を使用するように Prometheus を設定します。
その結果、Prometheus はサイドカーが提供する証明書とキーをすべてのスクレイプリクエストにアタッチし、mTLS 認証を透過的にパスします。
前提条件
作業を開始する前に、以下のものがあることを確認してください。
ASM インスタンスに関連付けられた Kubernetes クラスター
デプロイ済みの Bookinfo サンプルアプリケーション -- 詳細については、「ASM インスタンスでのアプリケーションのデプロイ」をご参照ください
対象クラスターの kubeconfig ファイルで設定された
kubectl
ステップ 1: Prometheus Operator のインストール
Prometheus Operator リポジトリをクローンします。
git clone https://github.com/prometheus-operator/prometheus-operator.gitPrometheus Operator をインストールします。
cd prometheus-operator/ kubectl create -f bundle.yamlインストールを確認します。
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 はデモンストレーション用です。本番環境の要件に合わせて調整してください。
次の 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/configとOUTPUT_CERTSサイドカープロキシに証明書とキーを /etc/istio-output-certssidecar.istio.io/userVolumeMountサイドカーコンテナ内の /etc/istio-output-certsにistio-certsボリュームをマウントします。volumeMountsセクションは、同じistio-certsボリュームを Prometheus コンテナ内の/etc/prom-certs/にマウントします。両方のコンテナがボリュームを共有するため、Prometheus はサイドカーが書き込んだ証明書を読み取ることができます。設定を適用します。
kubectl apply -f prometheus.yamlPrometheus 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 はデモンストレーション用です。本番環境の要件に合わせて調整してください。
次の 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 ハンドシェイクは、クライアント証明書検証を通じて相互認証を提供します。
ServiceMonitor を適用します。
kubectl apply -f service-monitor.yaml
ステップ 4: メトリクス収集の確認
Prometheus サービスへのポートフォワーディングを設定します。
kubectl port-forward svc/prometheus-operated 9090ブラウザで
http://localhost:9090を開きます。
上部のナビゲーションバーで [Status] > [Target] をクリックします。監視対象のターゲットの [State] が [Up] であることを確認します。これは、Prometheus が mTLS 経由でメトリクスを正常にスクレイプしていることを示します。
説明[State] が Unavailable と表示される場合、mTLS 認証が正しく設定されていない可能性があります。ServiceMonitor の証明書パスがボリュームマウントパスと一致していること、およびサイドカープロキシが Prometheus Pod にインジェクトされていることを確認してください。

上部のナビゲーションバーで [Graph] をクリックします。クエリボックスに
python_gc_objects_collected_totalと入力し、[Execute] をクリックします。クエリ結果に収集されたメトリクスが表示されます。
設定の概要
次の表は、すべてのコンポーネントにわたる主要な設定ポイントをまとめたものです。
| コンポーネント | 設定 | 目的 |
|---|---|---|
| Pod ボリューム | istio-certs という名前の emptyDir | 証明書用の共有ストレージ |
| サイドカーアノテーション | OUTPUT_CERTS + userVolumeMount | サイドカーが証明書を共有ボリュームに書き込む |
| Prometheus ボリュームマウント | /etc/prom-certs/ | Prometheus が共有ボリュームから証明書を読み取る |
| ServiceMonitor | scheme: https + tlsConfig | Prometheus が mTLS スクレイプリクエストに証明書を使用する |