来自 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
下面是不同代码部分的关联关系图表:
图 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 仪表盘上。
图 2:Prometheus 服务发现
图 3:Prometheus 目标
图 4:Prometheus NGINX 查询
我们可以看到,借助 Helm 和 Prometheus 等原生 Kubernetes 工具,NGINX Ingress Controller 能够在部署伊始更轻松地收集指标,从而快速提供“现成指标”。
以下是安装 “prometheus-operator” 的参考文档: