BLOG | NGINX

结合使用 F5 NGINX Ingress Controller 和 Prometheus-Operator 获得现成指标数据

NGINX-Part-of-F5-horiz-black-type-RGB
Jason Williams 缩略图
Jason Williams
Published April 03, 2024

来自 F5 NGINX 的 NGINX Ingress Controller (NIC) 与 Prometheus Operator ServiceMonitor CRD 相结合,有助于更轻松、更快速地使用 Helm 从 NGINX Ingress Controller 部署中收集指标数据。

NGINX Ingress Controller Helm Chart 现在支持您立即利用现有 Prometheus 和 Prometheus-Operator 基础设施,以便部署 NIC 并利用 Prometheus ServiceMonitor 获得现成指标数据。

本文将向您介绍什么是 ServiceMonitor,如何安装它,以及如何使用 NGINX Ingress Controller Helm Chart 定义相关特定设置。

Prometheus ServiceMonitor

通过 Prometheus ServiceMonitor 自定义资源 (CRD),您可以声明式地定义应如何监控一组动态服务。监控的服务使用 Kubernetes 标签选择器进行定义,支持企业引入规则来约束指标公开方式。按照这些规则,新服务会被自动发现,Prometheus 无需重新配置系统即可开始收集指标。

ServiceMonitor 是 Prometheus Operator 的一部分。这些资源描述并管理 Prometheus 要抓取的监控目标。Prometheus 资源使用 ServiceMonitor Selector 字段连接到 ServiceMonitor。Prometheus 可轻松识别已标记为要抓取的目标。因此,您可以更有效地控制并灵活地利用 Kubernetes 集群中的 ServiceMonitor 资源,从而轻松监控 NGINX Ingress Controller 等解决方案。

为了简化操作并为 NGINX Ingress Controller 提供现成指标,我们最近在 Helm Chart 中添加了使用 Prometheus ServiceMonitor 的功能。这样,在部署 NGINX Ingress Controller 后,便可轻松启用 Prometheus 的指标抓取特性。

要使用此功能,我们需要添加第二个专为指标收集创建的服务,ServiceMonitor 将“附加”到该服务。这将告知 Prometheus Operator 所应监控的服务(使用元数据中的标签),让它知道要抓取的内容和位置。

NGINX Ingress Controller 服务的示例(作为部署或 Helm 文件的一部分):


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-ingress

上述内容将是部署的一部分。标签 app: nginx-ingress-servicemonitor “连接”到 serviceMonitor,用于 Prometheus 指标抓取。

在下面的示例中,serviceMonitor 将链接到上述名为 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: prometheus

需要创建一个 Prometheus 资源,将其配置为查找 serviceMonitor 资源,以便 Prometheus 快速、轻松地了解要从哪些端点抓取指标。

在下面的示例中,该资源告知 Prometheus 要监控 spec 下的哪些项目。如下所示,我们正在监控 spec.serviceMonitorSelector.matchLabels:。我们可以看到 Prometheus 正在所有命名空间中查找带有 app.nginx-ingress-servicemonitor 的 matchLabels。这对应 NGINX Ingress Controller Helm Chart 和 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

下面是不同代码部分的关联关系图表:

service-monitor object relationship

图 1:service-monitor 对象关系

安装 Prometheus、Prometheus-Operator 和 Grafana

我们将使用 prometheus-community/kube-prometheus-stack 来安装完整部署,包括 Prometheus、Prometheus-Operator 和 Grafana。我们还将指定将其安装在监控命名空间中,以实现隔离。
以下是使用 Helm 进行安装的方法:

helm install metrics01 prometheus-community/kube-prometheus-stack -n monitoring --create-namespace

 

创建并安装 Prometheus 资源

在将 Prometheus 和 Prometheus CRD 安装到集群后,我们便可创建 Prometheus 资源。通过提前部署,我们可以通过将在 Helm Chart 中使用的标签“预置”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 Chart 部署 NGINX Ingress Controller 时,将使用该值。

我们希望提供现成的 Prometheus 指标。方法是使用 NGINX Ingress Controller Helm Chart。

NGINX Ingress Controller helm values.yaml 更改

我们可以查看 Helm Chart的 values.yaml 文件。需要重点关注 Prometheus 部分,因为它包含启用 Prometheus 以及创建所需服务和 serviceMonitor 资源所需的内容。

在 Prometheus 部分,我们可以看到几项设置:

prometheus.service
prometheus.serviceMonitor
我们将启用上述两项设置,以便在使用 Helm Chart时生成所需的服务和 serviceMonitor。

通过以下代码,我们启用服务和 serviceMonitor 并在 serviceMonitor 部分定义标签:


`servicemonitor` support was recently added to the NGINX Ingress controller helm chart. 
prometheus:
  ## 以 Prometheus 格式公开 NGINX 或 NGINX Plus 指标。
  create: true

  ## 配置端口以抓取指标。
  port: 9113

  secret: ""

  ## 配置使用的 HTTP 方案。
  scheme: http

  service:
    ## 需要 prometheus.create=true

    create: true

  serviceMonitor:
    create: true
    labels: { app: nginx-ingress-servicemonitor }


上述值的详解如下:


prometheus:
  ## 以 Prometheus 格式公开 NGINX 或 NGINX Plus 指标。
  create: true


告知 Helm 您要启用 NIC Prometheus 端点。您还可按需定义端口、方案和密钥。

通过将 prometheus.service.create 的值设置为 true,Helm 将自动创建 NIC ServiceMonitor 服务。


service:

    ## 创建 ClusterIP 服务,以在内部公开 Prometheus 指标
    ## 需要 prometheus.create=true
    create: true


最后,我们需要创建 serviceMonitor。将此设置为 true 并添加正确的标签,从而创建并添加与我们的 Prometheus 资源相匹配的标签。


serviceMonitor:
    ## 创建 serviceMonitor,以公开有关 kubernetes pod 的统计数据。
    create: true
    ## 要附加到 serviceMonitor 对象的 Kubernetes 对象标签。
    labels: { app: nginx-ingress-servicemonitor } 


标签链接回至 service.labels: { app: nginx-ingress-servicemointor } 的名称。

总结一下。启用 Prometheus — 这将公开 NIC 的 Prometheus Exporter 功能。定义服务对象 — 这是 Prometheus ServiceMonitor 发现 NIC Prometheus Exporter 端点的方式。定义 serviceMonitor 对象 — 这将指示 Prometheus ServiceMonitor 对其进行监控。

 

现在,我们可以使用 helm 安装 NGINX Ingress Controller。

修改完 values.yaml 之后,即可继续安装 NGINX Ingress Controller。

helm install nic01 -n nginx-ingress --create-namespace -f values.yaml .

在部署 NGINX Ingress Controller 后,我们便可打开 Prometheus 仪表盘并导航到状态菜单,然后导航到目标和服务发现视图。在 Prometheus 找到新的 ServiceMonitor 资源之后,它将开始获取端点并收集指标,这些指标会立即显示在 Prometheus 仪表盘上。

Prometheus service discovery

图 2:Prometheus 服务发现

Prometheus target

图 3:Prometheus 目标

Prometheus NGINX Query

图 4:Prometheus NGINX 查询

我们可以看到,借助 Helm 和 Prometheus 等原生 Kubernetes 工具,NGINX Ingress Controller 能够在部署伊始更轻松地收集指标,从而快速提供“现成指标”。

以下是安装 “prometheus-operator” 的参考文档:

https://prometheus-operator.dev/

https://github.com/prometheus-operator/prometheus-operator


"This blog post may reference products that are no longer available and/or no longer supported. For the most current information about available F5 NGINX products and solutions, explore our NGINX product family. NGINX is now part of F5. All previous NGINX.com links will redirect to similar NGINX content on F5.com."