F5 NGINX Ingress Controller与Prometheus-operator集成,实现开箱即用的指标监控

NGINX | 2024年4月03日

NGINX Ingress Controller 由F5 NGINX提供与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的ServiceMonitor Selector字段与其连接。Prometheus 可以轻松识别已标记为待抓取的目标。这样,您可以更灵活地控制和利用 Kubernetes 集群中的ServiceMonitor资源,监控 NGINX Ingress Controller 等解决方案。为了简化操作,并为 NGINX Ingress Controller 提供开箱即用的指标,我们最近在 helm chart 中新增了使用Prometheus ServiceMonitor的功能。这样,部署 NGINX Ingress Controller 后即可轻松启用指标,让 Prometheus 立即开始抓取。要使用此功能,需要添加专门用于收集指标的第二个服务,供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-ingress

以上内容将作为部署的一部分。标签 app:nginx-ingress-servicemonitor与用于抓取 Prometheus 指标的serviceMonitor“关联”。以下是一个示例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

下图展示了各个组件之间的连接关系:

ServiceMonitor示意图
图 1:service-monitor 对象关系

安装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 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:
  ## 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: true

指示Helm启用NIC Prometheus端点。还可以根据需要定义端口、方案和密钥。将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。

修改完values.yaml后,即可继续安装NGINX Ingress Controller。helm install nic01 -n nginx-ingress --create-namespace -f values.yaml .部署NGINX Ingress Controller后,可以打开Prometheus仪表板并转到状态菜单,然后进入目标和服务发现视图。Prometheus找到新的ServiceMonitor资源后,将开始抓取端点并收集指标,这些指标会立即显示在Prometheus仪表板中。

Prometheus服务发现
图2:Prometheus服务发现

图 3:Prometheus 目标

Prometheus NGINX查询
图 4:Prometheus NGINX 查询

可以看到,借助Helm和Prometheus等Kubernetes原生工具,NGINX Ingress Controller可以显著简化部署初期的指标收集,并提供“开箱即用的指标”。以下是安装 prometheus-operator的参考文档:https://prometheus-operator.dev/ https://github.com/prometheus-operator/prometheus-operator

分享

关于作者

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。