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 をマウントすることで、証明書とキーにアクセスできます。このプロセスを以下の手順で説明します。
istio-certsvolume を Prometheus Pod に追加します。volumes: - emptyDir: medium: Memory name: istio-certs次の 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 をマウントします。
istio-certsvolume を Prometheus コンテナの/etc/prom-certs/パスにマウントして、Prometheus がサイドカープロキシによってこのパスに書き込まれた証明書とキーを取得できるようにします。volumeMounts: - mountPath: /etc/prom-certs/ name: istio-certsスクレイプ設定で、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 のインストール
次のコマンドを実行して、GitHub から Prometheus Operator のソースリポジトリをローカルマシンにクローンします。
git clone https://github.com/prometheus-operator/prometheus-operator.git次のコマンドを実行して、Prometheus Operator をインストールします。
cd prometheus-operator/ kubectl create -f bundle.yaml次のコマンドを実行して、Pod のステータスを確認します。
kubectl get pods期待される出力:
NAME READY STATUS RESTARTS prometheus-operator-58dd988c9c-qhrrp 2/2 Running 0この出力は、Prometheus Operator が正常にインストールされたことを示します。
ステップ 2:CR を使用した Prometheus のデプロイ
次の YAML を prometheus.yaml という名前のローカルファイルに保存します。
この YAML には、Prometheus インスタンスの宣言と、必要な ServiceAccount、ClusterRole、および ClusterRoleBinding が含まれています。デプロイ設定には、「TLS 経由でメトリクスをスクレイプするための Prometheus の設定」で説明されている証明書 volume のマウント設定が含まれています。
説明このトピックで提供される Prometheus 関連のカスタムリソース (CR) は、デモンストレーションのみを目的としています。本番環境に合わせて調整してください。
次のコマンドを実行して、prometheus.yaml ファイルをクラスターに適用します。
kubectl apply -f prometheus.yaml次のコマンドを実行して、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 を使用したスクレイプルールの定義
次の 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次のコマンドを実行して、service-monitor.yaml ファイルをクラスターに適用します。
kubectl apply -f service-monitor.yaml
ステップ 4:Prometheus UI へのアクセスとメトリクスの検証
次のコマンドを実行して、ローカルポート 9090 から
prometheus-operatedサービスのポート 9090 へのポートフォワーディングを設定します。kubectl port-forward svc/prometheus-operated 9090ブラウザで
localhost:9090と入力して、Prometheus Web UI を開きます。Prometheus のクエリインターフェイスが開きます。[Expression] 入力ボックスにクエリ式を入力し、[Execute] をクリックしてクエリを実行し、[Table] または [Graph] タブで結果を表示できます。
トップメニューバーで を選択すると、監視対象のステータスが表示されます。
説明ターゲットが TLS 経由でスクレイプされる場合、最初はステータスが "Unavailable" と表示されることがあります。これは、TLS が設定されているものの、認証設定が正しくない場合に発生する可能性があります。
ターゲットの [State] が [Up] になっていることを確認します。これは、メトリクスが正常にスクレイプされていることを示します。
上部メニューで [Graph] をクリックし、クエリテキストボックスに
python_gc_objects_collected_totalと入力して、右側の [Execute] をクリックします。クエリが完了すると、レポートされたメトリクスデータが表示されます。
クエリ結果は [Table] ビューに表示され、
generationタグによって 3 つのレコード (generation 0、1、2) にグループ化されます。これらのレコードは、Python の 3 つのガベージコレクション (GC) 世代のそれぞれによって収集されたオブジェクトの総数に対応します。