NGINX Ingress Controller (F5 NGINX提供)とPrometheus OperatorのServiceMonitor CRDを組み合わせることで、Helmを使用してNGINX Ingress Controllerのデプロイからメトリクスを収集する作業が、はるかに簡単かつ迅速になります。NGINX Ingress Controller Helmチャートでは、既存のPrometheusおよびprometheus-operatorインフラストラクチャをすぐに活用できるようになりました。これにより、Prometheus ServiceMonitorを利用してNICをデプロイし、すぐにメトリクスを取得できます。この記事では、ServiceMonitorの概要、インストール方法、およびNGINX Ingress Controller Helmチャートを使用してこれらの設定を定義する方法について説明します。
Prometheus ServiceMonitor
Prometheus ServiceMonitorカスタムリソース定義(CRD)を使用すると、動的なサービス群を監視する方法を宣言的に定義できます。監視対象のサービスは、Kubernetesラベルセレクターを使用して定義します。これにより、組織はメトリクスの公開方法に関する規則を導入できます。この規則に従うことで、新しいサービスが自動的に検出され、システムを再構成することなくPrometheusがメトリクスの収集を開始します。ServiceMonitorはPrometheus Operatorの一部です。これらのリソースは、Prometheusがスクレイピングする監視対象を記述し、管理します。Prometheusリソースは、ServiceMonitorにServiceMonitor Selectorフィールドを使用して接続します。Prometheusは、スクレイピング対象として指定されたターゲットを容易に識別できます。これにより、Kubernetesクラスター内のServiceMonitorリソースを活用してNGINX Ingress Controllerなどのソリューションを監視する際の制御性と柔軟性が向上します。設定を簡素化し、NGINX Ingress Controllerですぐに利用できるメトリクスを提供するため、最近、helmチャートでPrometheus ServiceMonitorを使用できるようにしました。これにより、NGINX Ingress Controllerのデプロイ直後からPrometheusがスクレイピングを開始できるよう、メトリクスを簡単に有効化できます。この機能を使用するには、メトリクス収集専用の2つ目のサービスを追加し、ServiceMonitorをそのサービスに「関連付ける」必要があります。これにより、Prometheus Operatorは監視すべきサービスをメタデータ内のラベルから特定し、何をどこからスクレイピングするかを判断できます。デプロイメントファイルまたはhelmファイルに含める場合の、NGINX Ingress Controller用サービスの例を以下に示します。
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-servicemonitor
labels:
app: nginx-ingress-servicemonitor
spec:
ports:
- name: prometheus
protocol: TCP
port: 9113
targetPort: 9113
selector:
app: nginx-ingressThe above will be part of the deployment. The label, app: nginx-ingress-servicemonitor “connects” to the serviceMonitor for Prometheus metric scraping. Below is a sample serviceMonitor that would link to the above service named nginx-ingress-servicemonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: nginx-ingress-servicemonitor
labels:
app: nginx-ingress-servicemonitor
spec:
selector:
matchLabels:
app: nginx-ingress-servicemonitor
endpoints:
- port: prometheusPrometheusリソースを作成し、serviceMonitorリソースを検索するように設定する必要があります。これにより、Prometheusはメトリクスを収集するエンドポイントを迅速かつ容易に特定できます。以下の例では、このリソースによって、specで監視する項目をPrometheusに指定します。ここでは、spec.serviceMonitorSelector.matchLabels:を監視しています。Prometheusが、任意の名前空間でapp.nginx-ingress-servicemonitorを持つmatchLabelsを検索していることがわかります。これは、NGINX Ingress ControllerのHelmチャートとHelmによってデプロイされるserviceMonitorリソースと一致します。
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
labels:
prometheus: prometheus
spec:
replicas: 1
serviceAccountName: prometheus
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector:
matchLabels:
app: nginx-ingress-servicemonitor
resources:
requests:
memory: 500Mi各要素の関係を示す図を以下に示します。
Prometheus、prometheus-operator、Grafanaのインストール
完全なデプロイメントをインストールするために、prometheus-community/kube-prometheus-stackを使用します。これにより、prometheus、prometheus-operator、Grafanaがインストールされます。また、分離のため、monitoring名前空間にインストールするよう指定します。helmを使用したインストール方法は次のとおりです:helm install metrics01 prometheus-community/kube-prometheus-stack -n monitoring --create-namespace
Prometheusリソースの作成とインストール
PrometheusとPrometheus CRDをクラスターにインストールしたら、Prometheusリソースを作成できます。このリソースを事前にデプロイしておくことで、Helmチャートで使用するラベルを用いてPrometheus環境をあらかじめ構成できます。この方法により、PrometheusはNGINX Ingress Controllerの検出とメトリクスのスクレイピングを自動的に開始できます。Prometheusリソースは、NGINX Ingress Controllerをインストールする前にデプロイします。これにより、デプロイ後にprometheus-operatorがNGINX Ingress Controllerを自動的に検出してスクレイピングし、メトリクスを迅速に提供できるようになります。
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
namespace: default
labels:
prometheus: monitoring
spec:
replicas: 1
serviceAccountName: prometheus
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector:
matchLabels:
app: nginx-ingress-servicemonitor
resources:
requests:
memory: 500Mi上記は基本的な例です。重要なのは、指定した「spec.serviceMonitorSelector.matchLabels」の値です。この値は、Helmチャートを使用してNGINX Ingress Controllerをデプロイする際に使用します。Prometheusメトリクスをすぐに利用できるようにするため、NGINX Ingress Controller Helmチャートを使用します。
NGINX Ingress Controllerのhelm「values.yaml」の変更
helmチャートのvalues.yamlファイルを確認します。Prometheusセクションには、Prometheusの有効化、必要なサービスの作成、serviceMonitorリソースの作成に必要な項目が含まれているため、ここに注目します。Prometheusセクションには、次の設定があります:prometheus.service prometheus.serviceMonitor helmチャートの使用時に必要なサービスとserviceMonitorが生成されるよう、上記の両方の設定を有効にします。以下は、サービスとserviceMonitorを有効にし、serviceMonitorセクションでラベルを定義する箇所です:
`servicemonitor` support was recently added to the NGINX Ingress controller helm chart.
prometheus:
## Expose NGINX or NGINX Plus metrics in the Prometheus format.
create: true
## Configures the port to scrape the metrics.
port: 9113
secret: ""
## Configures the HTTP scheme used.
scheme: http
service:
## Requires prometheus.create=true
create: true
serviceMonitor:
create: true
labels: { app: nginx-ingress-servicemonitor } 上記の値を個別に示すと、次のようになります。
prometheus:
## Expose NGINX or NGINX Plus metrics in the Prometheus format.
create: trueNIC Prometheusエンドポイントを有効にするようHelmに指示します。必要に応じて、ポート、スキーム、シークレットも定義できます。prometheus.service.createの値をtrueに設定すると、HelmによってNIC ServiceMonitorサービスが自動的に作成されます。
service:
## Creates a ClusterIP Service to expose Prometheus metrics internally
## Requires prometheus.create=true
create: true最後に、serviceMonitorを作成する必要があります。これをtrueに設定し、適切なラベルを追加すると、Prometheusリソースに一致するラベルが作成され、追加されます。
serviceMonitor:
## Creates a serviceMonitor to expose statistics on the kubernetes pods.
create: true
## Kubernetes object labels to attach to the serviceMonitor object.
labels: { app: nginx-ingress-servicemonitor } このラベルはservice.labelsの名前に関連付けられています:{ app: nginx-ingress-servicemointor }まとめると、Prometheusを有効にして、NICのPrometheusエクスポーター機能を公開します。Serviceオブジェクトを定義します。これにより、Prometheus ServiceMonitorがNICのPrometheusエクスポーターエンドポイントを検出できるようになります。serviceMonitorオブジェクトを定義します。これにより、Prometheus ServiceMonitorにこのオブジェクトを監視するよう指示します。
これで、helmを使用してNGINX Ingress Controllerをインストールできます。
Once we have modified our values.yamlを変更したら、NGINX Ingress Controllerのインストールに進みます。helm install nic01 -n nginx-ingress --create-namespace -f values.yaml . NGINX Ingress Controllerをデプロイした後、Prometheusダッシュボードを開き、ステータスメニューに移動します。そこから、ターゲットビューとサービスディスカバリビューに移動できます。Prometheusが新しいServiceMonitorリソースを検出すると、エンドポイントのスクレイピングとメトリクスの収集を開始し、その結果がPrometheusダッシュボードにすぐに反映されます。

図3:Prometheusターゲット

helmやPrometheusなどのKubernetesネイティブツールを使用すると、NGINX Ingress Controllerにより、デプロイ開始時からすぐに利用できるメトリクスが提供され、メトリクスの収集が大幅に容易になることがわかります。インストールについては、以下のリファレンスドキュメントを参照してください。 prometheus-operator: https://prometheus-operator.dev/ https://github.com/prometheus-operator/prometheus-operator
著者について

関連するブログ記事
チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。
AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。
JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。
F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。
NGINX PlusによるAWS Auto Scalingグループの負荷分散
新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります