Prometheus

Prometheus は、オープンソースのモニタリングシステムおよび時系列データベースです。IstioとPrometheusを併用することで、Istioとサービスメッシュ内のアプリケーションの健全性を追跡するメトリクスを記録できます。GrafanaKiali などのツールを使用して、メトリクスを視覚化できます。

インストール

方法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が以下のものをスクレイピングするように設定します。

  1. コントロールプレーン(istiod デプロイメント)
  2. イングレスおよびエグレスゲートウェイ
  3. Envoyサイドカー
  4. ユーザーアプリケーション(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'

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の使用を参照してください。

この情報は役に立ちましたか?
改善のための提案はありますか?

ご意見ありがとうございます!