Prometheus
Prometheus は、オープンソースのモニタリングシステムおよび時系列データベースです。IstioとPrometheusを併用することで、Istioとサービスメッシュ内のアプリケーションの健全性を追跡するメトリクスを記録できます。Grafana や Kiali などのツールを使用して、メトリクスを視覚化できます。
インストール
方法1:クイックスタート
Istioは、Prometheusを迅速に稼働させるための基本的なサンプルインストールを提供します。
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/prometheus.yaml
これにより、Prometheusがクラスタにデプロイされます。これはデモ目的のみを意図したものであり、パフォーマンスやセキュリティについては最適化されていません。
方法2:カスタマイズ可能なインストール
Prometheusを環境にデプロイする方法については、Prometheusドキュメント を参照してください。Istioデプロイメントのスクレイピングを設定する方法の詳細については、設定 を参照してください。
設定
Istioメッシュでは、各コンポーネントはメトリクスを出力するエンドポイントを公開します。Prometheusはこれらのエンドポイントをスクレイピングし、結果を収集することで機能します。これは、Prometheus設定ファイル を通じて設定されます。このファイルは、クエリするエンドポイント、クエリするポートとパス、TLS設定などを制御します。
メッシュ全体のメトリクスを収集するには、Prometheusが以下のものをスクレイピングするように設定します。
- コントロールプレーン(
istiod
デプロイメント) - イングレスおよびエグレスゲートウェイ
- Envoyサイドカー
- ユーザーアプリケーション(Prometheusメトリクスを公開している場合)
メトリクスの設定を簡素化するために、Istioは2つの動作モードを提供します。
方法1:メトリクスマージ
設定を簡素化するために、Istioはprometheus.io
アノテーションによってスクレイピングを完全に制御する機能を備えています。これにより、Helm stable/prometheus
チャートなどで提供される標準的な設定で、Istioスクレイピングがすぐに機能するようになります。
このオプションはデフォルトで有効になっていますが、インストール時に--set meshConfig.enablePrometheusMerge=false
を渡すことで無効にできます。有効にすると、適切なprometheus.io
アノテーションがすべてのデータプレーンポッドに追加され、スクレイピングが設定されます。これらのアノテーションが既に存在する場合は、上書きされます。このオプションを使用すると、EnvoyサイドカーはIstioのメトリクスとアプリケーションのメトリクスをマージします。マージされたメトリクスは:15020/stats/prometheus
からスクレイピングされます。
このオプションは、すべてのメトリクスをプレーンテキストで公開します。
この機能は、次の状況ではニーズに合わない可能性があります。
- TLSを使用してメトリクスをスクレイピングする必要がある場合。
- アプリケーションがIstioメトリクスと同じ名前のメトリクスを公開する場合。たとえば、アプリケーションメトリクスが
istio_requests_total
メトリクスを公開する場合。これは、アプリケーション自体がEnvoyを実行している場合に発生する可能性があります。 - Prometheusデプロイメントが標準の
prometheus.io
アノテーションに基づいてスクレイピングするように設定されていない場合。
必要に応じて、ポッドにprometheus.istio.io/merge-metrics: "false"
アノテーションを追加することで、ワークロードごとにこの機能を無効にできます。
方法2:カスタマイズされたスクレイピング設定
Istioによって生成された統計情報をスクレイピングするように既存のPrometheusインスタンスを設定するには、いくつかのジョブを追加する必要があります。
Istiod
統計情報をスクレイピングするには、そのhttp-monitoring
ポートをスクレイピングする次の例のようなジョブを追加できます。
- job_name: 'istiod'
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- istio-system
relabel_configs:
- source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: istiod;http-monitoring
- サイドカープロキシとゲートウェイプロキシを含むEnvoy統計情報をスクレイピングするには、
-envoy-prom
で終わるポートをスクレイピングする次のジョブを追加できます。
- job_name: 'envoy-stats'
metrics_path: /stats/prometheus
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_container_port_name]
action: keep
regex: '.*-envoy-prom'
- アプリケーション統計情報については、厳格なmTLS が有効になっていない場合、既存のスクレイピング設定は引き続き機能します。それ以外の場合は、PrometheusをIstio証明書を使用してスクレイピングするように設定する必要があります。
TLS設定
コントロールプレーン、ゲートウェイ、Envoyサイドカーのメトリクスはすべてクリアテキストでスクレイピングされます。ただし、アプリケーションメトリクスは、ワークロードに対して設定されているIstio認証ポリシーに従います。
STRICT
モードを使用する場合は、以下に説明されているように、Istio証明書を使用してスクレイピングするようにPrometheusを設定する必要があります。PERMISSIVE
モードを使用する場合は、ワークロードは通常TLSとクリアテキストを受け入れます。ただし、PrometheusはPERMISSIVE
モードに必要なIstioの特別なTLSバリアントを送信できません。そのため、PrometheusでTLSを設定してはいけません。DISABLE
モードを使用する場合は、PrometheusにTLS設定は必要ありません。
PrometheusにIstio証明書をプロビジョニングする1つの方法は、SDS証明書をローテーションしてPrometheusと共有できるボリュームに出力するサイドカーを注入することです。ただし、Prometheusの直接エンドポイントアクセスモデルはIstioのサイドカープロキシモデルと互換性がないため、サイドカーはPrometheusのリクエストを傍受すべきではありません。
これを実現するには、Prometheusサーバーコンテナで証明書ボリュームマウントを設定します。
containers:
- name: prometheus-server
...
volumeMounts:
mountPath: /etc/prom-certs/
name: istio-certs
volumes:
- emptyDir:
medium: Memory
name: istio-certs
次に、Prometheusデプロイメントポッドテンプレートに次のアノテーションを追加し、サイドカーインジェクションを使用してデプロイします。これにより、トラフィックのリダイレクトを設定せずに、サイドカーが共有ボリュームに証明書を書き込むように設定されます。
spec:
template:
metadata:
annotations:
traffic.sidecar.istio.io/includeInboundPorts: "" # do not intercept any inbound ports
traffic.sidecar.istio.io/includeOutboundIPRanges: "" # do not intercept any outbound traffic
proxy.istio.io/config: | # configure an env variable `OUTPUT_CERTS` to write certificates to the given folder
proxyMetadata:
OUTPUT_CERTS: /etc/istio-output-certs
sidecar.istio.io/userVolumeMount: '[{"name": "istio-certs", "mountPath": "/etc/istio-output-certs"}]' # mount the shared volume at sidecar proxy
最後に、スクレイピングジョブのTLSコンテキストを次のように設定します。
scheme: https
tls_config:
ca_file: /etc/prom-certs/root-cert.pem
cert_file: /etc/prom-certs/cert-chain.pem
key_file: /etc/prom-certs/key.pem
insecure_skip_verify: true # Prometheus does not support Istio security naming, thus skip verifying target pod certificate
ベストプラクティス
より大規模なメッシュの場合、高度な設定によりPrometheusのスケーラビリティが向上する可能性があります。詳細については、本番規模のモニタリングのためのPrometheusの使用を参照してください。