標準的な Prometheus の設定では、prometheus.io アノテーションを使用して、Pod ごとに 1 つのメトリックエンドポイントをスクレイプします。Service Mesh (ASM) がサイドカープロキシをインジェクトすると、プロキシは別のエンドポイントで Istio メトリックを公開します。これは、アプリケーションの既存のスクレイプターゲットと競合します。メトリックのマージは、両方のメトリックセットを 1 つのエンドポイントに統合することでこの問題を解決します。Prometheus は追加設定なしでこのエンドポイントをスクレイプできます。
メトリックのマージを有効化すると、各サイドカープロキシは、(元の prometheus.io アノテーションを使用して) アプリケーションのメトリックをフェッチし、それらを Istio メトリックと結合して、すべてを :15020/stats/prometheus で公開します。ASM は Pod の prometheus.io アノテーションを更新して、このマージされたエンドポイントを指すようにします。これにより、Prometheus はアプリケーションと Istio の両方のメトリックを自動的に取得します。
メトリックのマージがご利用の環境に適さない場合は、アプリケーションとサイドカーのエンドポイントを個別にスクレイプするように Prometheus を設定してください。
メトリックのマージを使用しないケース
この機能を有効化する前に、以下のシナリオを評価してください。該当する場合は、代わりにアプリケーションとサイドカーのエンドポイントを個別にスクレイプするように Prometheus を設定してください。
機密性の高いアプリケーションメトリック。 マージされたメトリックはサイドカープロキシを通じて公開されます。Istio メトリックを表示する権限を持つユーザーは、アプリケーションメトリックも表示できます。
メトリックのマージの仕組み
次の図は、メトリックのマージが有効化された後のデータフローを示しています。
+---------------------------------------------------------+
| Pod |
| |
| +----------------+ +--------------------------+ |
| | Application | | Sidecar proxy | |
| | | | | |
| | :9080 |------>| Fetches app metrics | |
| | /metrics | | from original endpoint | |
| +----------------+ | | |
| | Merges with Istio | |
| | proxy metrics | |
| | | |
| | :15020 | |
| | /stats/prometheus |------> Prometheus
| +--------------------------+ |
+---------------------------------------------------------+ASM が Pod でメトリックのマージを有効化すると、次のようになります。
元の
prometheus.ioアノテーション (スクレイプターゲット、ポート、パス) は、サイドカーコンテナ内のISTIO_PROMETHEUS_ANNOTATIONS環境変数に保存されます。prometheus.ioアノテーションは、データプレーン上のすべての Pod に追加され、マージされたエンドポイント (:15020/stats/prometheus) を指すように上書きされます。これらのアノテーションが既に存在する場合も上書きされます。サイドカープロキシは保存されたアノテーションを読み取り、元のエンドポイントからアプリケーションメトリックをフェッチし、自身の Istio メトリックと結合して、マージされたエンドポイントですべてを提供します。
前提条件
開始する前に、以下を確認してください。
バージョン 1.17.2.30 以降を実行している ASM インスタンス。インスタンスを作成またはアップグレードするには、「ASM インスタンスの作成」または「ASM インスタンスの更新」をご参照ください。
標準の
prometheus.ioアノテーションでデプロイされたアプリケーション。デプロイ手順については、「ASM インスタンスでのアプリケーションのデプロイ」をご参照ください。
ステップ 1: アプリケーションの Prometheus アノテーションの確認
メトリックのマージを有効化する前に、アプリケーションの Pod に prometheus.io アノテーションが含まれていることを確認してください。次の Deployment マニフェストは、一般的な設定例です。
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
labels:
app: productpage
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v1
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9080"
prometheus.io/path: "/metrics"
labels:
app: productpage
version: v1
spec:
......kubectl get pod <pod-name> -o yaml を実行し、次のアノテーションが存在することを確認します。
prometheus.io/path: /metrics
prometheus.io/port: '9080'
prometheus.io/scrape: 'true'ステップ 2: メトリックのマージの有効化
メトリックのマージはデフォルトで無効になっています。ASM インスタンスレベル (すべてのワークロードに適用) またはワークロードごとに有効化します。
オプション A: ASM インスタンスに対してグローバルに有効化
ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、対象の ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[ASM インスタンス] > [基本情報] を選択します。
[設定情報] セクションで、[Istio のメトリックとアプリケーションのメトリックをマージ] の横にある [有効化] をクリックします。確認ダイアログボックスで、[OK] をクリックします。
オプション B: 特定のワークロードに対して有効化
対象のワークロードの Pod spec に、次のアノテーションを追加します。
prometheus.istio.io/merge-metrics: "true"この方法を使用して、グローバルでは無効のまま特定のサービスでマージを有効にしたり、個々のワークロードでインスタンスレベルの設定をオーバーライドしたりできます。
ステップ 3: マージされたエンドポイントの確認
メトリックのマージを有効化した後、影響を受ける Pod を再起動して、更新されたサイドカー設定を適用します。その後、Pod を確認して変更を検証します。
kubectl get pod <pod-name> -o yaml を実行し、以下を確認します。
更新されたアノテーション。 prometheus.io アノテーションがマージされたエンドポイントを指すようになります。
prometheus.io/path: /stats/prometheus
prometheus.io/port: '15020'
prometheus.io/scrape: 'true'新しい環境変数。 サイドカーコンテナに、元のアプリケーションのスクレイプ設定を保持する ISTIO_PROMETHEUS_ANNOTATIONS 環境変数が含まれます。
env:
- name: ISTIO_PROMETHEUS_ANNOTATIONS
value: '{"scrape":"true","path":"/metrics","port":"9080"}'メトリックのマージの無効化
メトリックのマージを無効化するには、有効化した方法に応じて次のいずれかの方法を選択します。
インスタンスレベル: ASM コンソールで、[ASM インスタンス] > [基本情報] に移動します。[設定情報] セクションで、[Istio のメトリックとアプリケーションのメトリックをマージ] の横にある [無効化] をクリックします。確認ダイアログボックスで、[OK] をクリックします。
ワークロードレベル: 対象の Pod spec に次のアノテーションを追加します。
prometheus.istio.io/merge-metrics: "false"
ワークロードごとのアノテーションは、オーバーライドとしても機能します。メトリックのマージがインスタンスレベルで有効になっている場合、このアノテーションを追加して、機密性の高いメトリックを持つ特定のワークロードを除外できます。