Prometheus监控Ingress-NGINX
引言
在 Kubernetes 集群中,Ingress-NGINX 是一个非常流行的用于暴露集群内部服务到外部世界的 Ingress 控制器。监控 Ingress-NGINX 的性能和健康状况对于确保服务的稳定性和可靠性至关重要。Prometheus 是一款流行的开源监控和告警工具,非常适合用于收集和查询 Ingress-NGINX 的指标。通过集成 Prometheus 和 Ingress-NGINX,我们可以实时了解 Ingress 控制器的请求处理量、延迟、错误率、资源使用情况等关键指标,从而及时发现和解决潜在问题。
技术背景
-
Kubernetes Ingress: Kubernetes Ingress 是一种 API 对象,定义了如何将外部请求路由到集群内部的服务。Ingress 控制器(如 Ingress-NGINX)负责实现 Ingress 规则。
-
Ingress-NGINX: 这是一个使用 NGINX 作为反向代理和负载均衡器的 Ingress 控制器。它监听 Kubernetes API 中的 Ingress 资源,并根据这些资源配置 NGINX。
-
Prometheus: 一个开源的系统监控和告警工具包。它通过 HTTP/HTTPS 协议从目标暴露的
/metrics
端点拉取指标数据,并存储在时间序列数据库中。Prometheus 提供了强大的查询语言 (PromQL) 用于分析和可视化监控数据。 -
Prometheus Exporter: 为了让 Prometheus 能够监控特定的应用程序或服务(如 Ingress-NGINX),通常需要一个 Exporter。Exporter 负责收集应用程序的内部指标,并将它们转换为 Prometheus 可以理解的格式(通常是简单的文本格式,通过
/metrics
端点暴露)。 -
Ingress-NGINX Metrics: Ingress-NGINX 自身暴露了一些有用的指标,例如请求计数、请求延迟、连接数、SSL 指标等。这些指标可以通过配置 Ingress-NGINX 的 Deployment 来启用。
应用使用场景
监控 Ingress-NGINX 的 Prometheus 指标在以下场景中非常有用:
- 性能分析: 了解 Ingress 控制器的请求处理能力、延迟分布,识别性能瓶颈。
- 故障排查: 当服务出现问题时,可以查看 Ingress 控制器的错误率、连接数等指标,帮助定位问题是否出在 Ingress 层。
- 容量规划: 基于历史监控数据,预测 Ingress 控制器的资源需求,进行合理的容量规划。
- 健康检查: 监控 Ingress 控制器的基本健康指标,例如是否正常运行、是否能处理新的连接。
- 告警设置: 基于关键指标设置告警规则,例如当错误率过高或延迟过长时及时通知运维人员。
- 可观测性: 将 Ingress-NGINX 的监控数据与其他组件的监控数据(如应用 Pod 的指标)结合起来,构建全面的可观测性体系。
不同场景下详细代码实现
以下是在不同场景下配置和使用 Prometheus 监控 Ingress-NGINX 的详细步骤和代码示例。
场景 1:启用 Ingress-NGINX 的 Prometheus 指标暴露
Ingress-NGINX 自身通常已经内置了 Prometheus 指标暴露的功能,只需要通过修改其 Deployment 的参数来启用。
# 示例:修改 Ingress-NGINX Controller 的 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
template:
spec:
containers:
- name: controller
# ... 其他配置 ...
args:
- /nginx-ingress-controller
# ... 其他参数 ...
- --enable-prometheus-metrics # 启用 Prometheus 指标
- --prometheus-listen-port=10254 # 指定 Prometheus 监听的端口 (默认是 10254)
ports:
# ... 其他端口 ...
- containerPort: 10254
protocol: TCP
name: prometheus
解释:
- 在 Ingress-NGINX Controller 的 Deployment 中,我们需要找到
controller
容器的args
字段。 - 添加
--enable-prometheus-metrics
参数来启用指标暴露。 - 可以使用
--prometheus-listen-port
参数指定 Prometheus 监听的端口,默认是10254
。 - 确保在
ports
字段中暴露该端口。
应用: 使用 kubectl apply -f <your-ingress-nginx-deployment.yaml>
命令更新 Ingress-NGINX Controller 的 Deployment。
场景 2:配置 Prometheus 抓取 Ingress-NGINX 的指标
需要配置 Prometheus Server 来发现并抓取 Ingress-NGINX Controller Pod 的指标。这通常通过 Kubernetes 服务发现机制实现。
# 示例:Prometheus Server 的 ServiceMonitor 配置 (如果使用 Prometheus Operator)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: ingress-nginx-monitor
namespace: monitoring
spec:
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/component: controller
endpoints:
- port: prometheus
scheme: http
path: /metrics
解释:
- 这是一个
ServiceMonitor
资源定义,用于告诉 Prometheus Operator 如何发现需要监控的服务。 selector.matchLabels
用于匹配具有特定标签的 Service。你需要根据你的 Ingress-NGINX Controller Pod 的标签进行调整。通常,Ingress-NGINX Controller Pod 会有app.kubernetes.io/name: ingress-nginx
和app.kubernetes.io/component: controller
这样的标签。endpoints
定义了如何抓取指标:port: prometheus
:指定抓取名为prometheus
的端口(在 Ingress-NGINX Deployment 中定义的端口名)。scheme: http
:使用 HTTP 协议。path: /metrics
:Ingress-NGINX 暴露指标的默认路径是/metrics
。
应用: 使用 kubectl apply -f <your-ingress-nginx-servicemonitor.yaml>
命令创建或更新 ServiceMonitor。如果你的 Prometheus 不是通过 Operator 管理,你需要修改 Prometheus 的配置文件 (prometheus.yml
),使用 kubernetes_sd_configs
来发现 Ingress-NGINX Controller Pods 或 Service。
# 示例:Prometheus Server 的 prometheus.yml 配置 (非 Operator)
scrape_configs:
- job_name: 'ingress-nginx'
kubernetes_sd_configs:
- role: pod
namespaces:
names:
- ingress-nginx # 替换为 Ingress-NGINX Controller 所在的命名空间
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name, __meta_kubernetes_pod_label_app_kubernetes_io_component]
regex: (ingress-nginx);(controller)
action: keep
- source_labels: [__address__]
regex: ([^:]+)(?::\d+)?
replacement: $1:10254 # 替换为 Ingress-NGINX Controller 暴露 Prometheus 指标的实际端口
target_label: __address__
- source_labels: [__meta_kubernetes_pod_name]
target_label: instance
- source_labels: [__meta_kubernetes_pod_namespace]
target_label: namespace
解释:
kubernetes_sd_configs
配置 Prometheus 从 Kubernetes API Server 发现 Pods。namespaces
指定了要发现 Pods 的命名空间。relabel_configs
用于过滤和修改发现的 targets (Pods):- 第一个
relabel_config
保留标签app.kubernetes.io/name=ingress-nginx
和app.kubernetes.io/component=controller
的 Pods。 - 第二个
relabel_config
将 Pod 的 IP 地址和 Prometheus 监听端口组合成抓取目标地址。 - 后续的
relabel_config
添加instance
和namespace
标签,方便识别监控数据来源。
- 第一个
应用: 修改 Prometheus 的配置文件 (prometheus.yml
) 并重新加载 Prometheus Server 的配置。
场景 3:使用 Grafana 可视化 Ingress-NGINX 指标
Grafana 可以连接到 Prometheus Server,并使用 PromQL 查询语言创建各种图表和仪表盘来可视化 Ingress-NGINX 的监控数据。你可以手动创建仪表盘,或者导入社区已经创建好的 Ingress-NGINX 仪表盘。
一个常用的 PromQL 查询示例,用于查看 Ingress 控制器的总请求量:
sum(nginx_ingress_controller_requests_total)
查看特定 Ingress 的请求量(假设你的 Ingress 对象有一个名为 my-ingress
的标签):
sum(nginx_ingress_controller_requests_total{ingress="my-ingress"})
查看 Ingress 控制器的请求延迟(以毫秒为单位):
histogram_quantile(0.99, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket[5m])) by (le)) * 1000
应用: 在 Grafana 中创建一个新的仪表盘,添加 Prometheus 作为数据源,并使用 PromQL 查询创建各种图表来展示 Ingress-NGINX 的关键指标。
原理解释
-
Ingress-NGINX 指标暴露原理: 当 Ingress-NGINX Controller 启动时,如果启用了 Prometheus 指标暴露 (
--enable-prometheus-metrics
),它会在指定的端口(默认为10254
)启动一个 HTTP 服务器,并在/metrics
路径下以 Prometheus 的文本格式暴露其内部的各种监控指标。这些指标由 Ingress-NGINX Controller 进程自身收集和维护。 -
Prometheus 抓取原理:
- Prometheus Server 会定期根据其配置(例如
ServiceMonitor
或prometheus.yml
中的scrape_configs
)发现监控目标(targets)。 - 对于每个 target,Prometheus Server 会发送 HTTP GET 请求到其配置的
/metrics
路径。 - Exporter(在这里是 Ingress-NGINX Controller 暴露的 HTTP 端点)会将当前的指标数据以文本格式响应给 Prometheus Server。
- Prometheus Server 解析这些文本数据,并将指标数据存储在其时间序列数据库中,每个指标都带有时间戳和一组标签(用于标识指标的属性,例如 Pod 名称、命名空间等)。
- Prometheus Server 会定期根据其配置(例如
-
PromQL 查询原理: Grafana 等可视化工具使用 PromQL(Prometheus Query Language)与 Prometheus Server 进行交互。PromQL 允许用户根据指标名称、标签、时间范围等条件查询和聚合监控数据。Prometheus Server 会执行 PromQL 查询,并返回结果给可视化工具进行展示。
核心特性
- 丰富的内置指标: Ingress-NGINX 暴露了大量有用的指标,涵盖请求处理、连接、SSL、更新等多个方面。
- 标准化格式: Prometheus 使用标准的文本格式来暴露和抓取指标,易于集成。
- 灵活的配置: 可以通过 Deployment 参数和 Prometheus 的配置来灵活地控制指标的暴露和抓取。
- 强大的查询语言: PromQL 提供了强大的数据查询和聚合能力,方便进行复杂的监控分析。
- 广泛的生态系统: Prometheus 与 Grafana 等可视化工具以及 Alertmanager 等告警工具无缝集成,构建完善的监控体系。
原理流程图以及原理解释
Parse error on line 4: ...-- Exposes /metrics (HTTP) on Port 10254 -----------------------^ Expecting 'SEMI', 'NEWLINE', 'SPACE', 'EOF', 'GRAPH', 'DIR', 'subgraph', 'SQS', 'SQE', 'end', 'AMP', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'START_LINK', 'LINK', 'PIPE', 'STYLE', 'LINKSTYLE', 'CLASSDEF', 'CLASS', 'CLICK', 'DOWN', 'UP', 'DEFAULT', 'NUM', 'COMMA', 'ALPHA', 'COLON', 'MINUS', 'BRKT', 'DOT', 'PCT', 'TAGSTART', 'PUNCTUATION', 'UNICODE_TEXT', 'PLUS', 'EQUALS', 'MULT', 'UNDERSCORE', got 'PS'流程解释:
- Ingress 配置: Kubernetes API Server 存储着 Ingress 资源。
- Ingress-NGINX 监听: Ingress-NGINX Controller Pod 监听 Kubernetes API Server 中 Ingress 资源的变化。
- 指标暴露: Ingress-NGINX Controller 启动时,通过
--enable-prometheus-metrics
参数启用指标暴露,并在指定的端口(例如 10254)的/metrics
路径上提供 HTTP 接口。 - Prometheus 抓取: Prometheus Server 根据配置(例如 ServiceMonitor 或
prometheus.yml
)定期向 Ingress-NGINX Controller Pod 的/metrics
端点发送 HTTP 请求,拉取指标数据。 - 数据存储: Prometheus Server 将抓取到的指标数据存储在自己的时间序列数据库中,每个数据点都带有时间戳和标签。
- 可视化: Grafana 通过配置好的 Prometheus 数据源,使用 PromQL 查询存储在 Prometheus 中的 Ingress-NGINX 指标数据,并以图表等形式可视化展示。
- 告警: Prometheus 可以配置告警规则,当监控指标达到预设的阈值时,触发告警。
- 告警通知: Alertmanager 接收来自 Prometheus 的告警,并根据配置将告警通知发送给用户或系统。
环境准备
- 运行中的 Kubernetes 集群: 需要一个可以部署 Ingress-NGINX 和 Prometheus 的 Kubernetes 集群。
- Ingress-NGINX Controller 部署: 确保 Ingress-NGINX Controller 已经部署在你的集群中。
- Prometheus Server 部署: 确保 Prometheus Server 已经部署在你的集群中。你可以选择直接部署 Prometheus,或者使用 Prometheus Operator 进行管理。
- kubectl 命令行工具: 用于与 Kubernetes 集群进行交互。
- 可选:Grafana 部署: 如果需要可视化监控数据,需要部署 Grafana 并配置 Prometheus 数据源。
- 确认网络连通性: 确保 Prometheus Server 可以通过网络访问 Ingress-NGINX Controller Pod 的 Prometheus 指标暴露端口(通常是 10254)。
代码示例实现
前面的“不同场景下详细代码实现”部分已经提供了相关的代码示例,包括:
- 修改 Ingress-NGINX Deployment 以启用指标暴露。
- 配置 Prometheus ServiceMonitor 或
prometheus.yml
以抓取 Ingress-NGINX 指标。 - PromQL 查询示例。
运行结果
成功配置后,你将能够在 Prometheus 的 Web UI (通常通过 <prometheus-service-ip>:<prometheus-port>
) 中查询到以 nginx_ingress_controller_
为前缀的 Ingress-NGINX 指标。例如,你可以查询 nginx_ingress_controller_requests_total
来查看总请求量。
如果配置了 Grafana,你将能够创建或导入 Ingress-NGINX 仪表盘,看到各种图表展示 Ingress 控制器的性能指标,例如:
- 总请求量
- 请求延迟分布 (P50, P90, P99 等)
- HTTP 状态码分布 (2xx, 4xx, 5xx)
- 活动连接数
- SSL 连接数和握手延迟
- Ingress Controller 的 CPU 和内存使用率
- 配置重载次数
测试步骤以及详细代码
-
部署 Ingress-NGINX 并启用指标:
- 按照 Ingress-NGINX 的官方文档部署 Ingress Controller。
- 修改 Ingress-NGINX Controller 的 Deployment YAML 文件,添加
--enable-prometheus-metrics
和--prometheus-listen-port=10254
到controller
容器的args
中,并暴露10254
端口。 - 使用
kubectl apply -f <modified-ingress-nginx-deployment.yaml>
更新部署。
-
部署 Prometheus:
- 按照 Prometheus 的官方文档或使用 Prometheus Operator 部署 Prometheus Server 到你的 Kubernetes 集群。
-
配置 Prometheus 抓取 Ingress-NGINX 指标:
- 如果使用 Prometheus Operator: 创建一个
ServiceMonitor
资源(如前面的示例),确保其selector
匹配 Ingress-NGINX Controller Pod 的标签,并且endpoints
配置正确指向/metrics
和prometheus
端口。使用kubectl apply -f <your-ingress-nginx-servicemonitor.yaml>
创建。 - 如果直接部署 Prometheus: 修改 Prometheus 的
prometheus.yml
配置文件,添加kubernetes_sd_configs
来发现 Ingress-NGINX Controller Pods,并配置正确的relabel_configs
来过滤和设置抓取目标。重新加载 Prometheus 配置。
- 如果使用 Prometheus Operator: 创建一个
-
验证 Prometheus 是否能抓取指标:
- 等待几分钟,让 Prometheus 完成服务发现和首次抓取。
- 访问 Prometheus 的 Web UI (
<prometheus-service-ip>:<prometheus-port>
). - 在查询框中输入
nginx_ingress_controller_requests_total
,如果能看到以你的 Ingress-NGINX Controller Pod 名称作为instance
标签的时间序列数据,则说明 Prometheus 已经成功抓取到指标。
-
部署 Grafana (可选):
- 按照 Grafana 的官方文档部署 Grafana 到你的 Kubernetes 集群。
- 在 Grafana 中添加 Prometheus 作为数据源。
- 创建新的仪表盘,或者导入社区提供的 Ingress-NGINX 仪表盘(可以在 Grafana 的官方仪表盘库中搜索 “NGINX Ingress Controller”)。
- 在
- 点赞
- 收藏
- 关注作者
评论(0)