Prometheus监控Ingress-NGINX

举报
鱼弦 发表于 2025/05/05 00:06:55 2025/05/05
【摘要】 引言在 Kubernetes 集群中,Ingress-NGINX 是一个非常流行的用于暴露集群内部服务到外部世界的 Ingress 控制器。监控 Ingress-NGINX 的性能和健康状况对于确保服务的稳定性和可靠性至关重要。Prometheus 是一款流行的开源监控和告警工具,非常适合用于收集和查询 Ingress-NGINX 的指标。通过集成 Prometheus 和 Ingress...

引言

在 Kubernetes 集群中,Ingress-NGINX 是一个非常流行的用于暴露集群内部服务到外部世界的 Ingress 控制器。监控 Ingress-NGINX 的性能和健康状况对于确保服务的稳定性和可靠性至关重要。Prometheus 是一款流行的开源监控和告警工具,非常适合用于收集和查询 Ingress-NGINX 的指标。通过集成 Prometheus 和 Ingress-NGINX,我们可以实时了解 Ingress 控制器的请求处理量、延迟、错误率、资源使用情况等关键指标,从而及时发现和解决潜在问题。

技术背景

  1. Kubernetes Ingress: Kubernetes Ingress 是一种 API 对象,定义了如何将外部请求路由到集群内部的服务。Ingress 控制器(如 Ingress-NGINX)负责实现 Ingress 规则。

  2. Ingress-NGINX: 这是一个使用 NGINX 作为反向代理和负载均衡器的 Ingress 控制器。它监听 Kubernetes API 中的 Ingress 资源,并根据这些资源配置 NGINX。

  3. Prometheus: 一个开源的系统监控和告警工具包。它通过 HTTP/HTTPS 协议从目标暴露的 /metrics 端点拉取指标数据,并存储在时间序列数据库中。Prometheus 提供了强大的查询语言 (PromQL) 用于分析和可视化监控数据。

  4. Prometheus Exporter: 为了让 Prometheus 能够监控特定的应用程序或服务(如 Ingress-NGINX),通常需要一个 Exporter。Exporter 负责收集应用程序的内部指标,并将它们转换为 Prometheus 可以理解的格式(通常是简单的文本格式,通过 /metrics 端点暴露)。

  5. 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-nginxapp.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-nginxapp.kubernetes.io/component=controller 的 Pods。
    • 第二个 relabel_config 将 Pod 的 IP 地址和 Prometheus 监听端口组合成抓取目标地址。
    • 后续的 relabel_config 添加 instancenamespace 标签,方便识别监控数据来源。

应用: 修改 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 的关键指标。

原理解释

  1. Ingress-NGINX 指标暴露原理: 当 Ingress-NGINX Controller 启动时,如果启用了 Prometheus 指标暴露 (--enable-prometheus-metrics),它会在指定的端口(默认为 10254)启动一个 HTTP 服务器,并在 /metrics 路径下以 Prometheus 的文本格式暴露其内部的各种监控指标。这些指标由 Ingress-NGINX Controller 进程自身收集和维护。

  2. Prometheus 抓取原理:

    • Prometheus Server 会定期根据其配置(例如 ServiceMonitorprometheus.yml 中的 scrape_configs)发现监控目标(targets)。
    • 对于每个 target,Prometheus Server 会发送 HTTP GET 请求到其配置的 /metrics 路径。
    • Exporter(在这里是 Ingress-NGINX Controller 暴露的 HTTP 端点)会将当前的指标数据以文本格式响应给 Prometheus Server。
    • Prometheus Server 解析这些文本数据,并将指标数据存储在其时间序列数据库中,每个指标都带有时间戳和一组标签(用于标识指标的属性,例如 Pod 名称、命名空间等)。
  3. 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'

流程解释:

  1. Ingress 配置: Kubernetes API Server 存储着 Ingress 资源。
  2. Ingress-NGINX 监听: Ingress-NGINX Controller Pod 监听 Kubernetes API Server 中 Ingress 资源的变化。
  3. 指标暴露: Ingress-NGINX Controller 启动时,通过 --enable-prometheus-metrics 参数启用指标暴露,并在指定的端口(例如 10254)的 /metrics 路径上提供 HTTP 接口。
  4. Prometheus 抓取: Prometheus Server 根据配置(例如 ServiceMonitor 或 prometheus.yml)定期向 Ingress-NGINX Controller Pod 的 /metrics 端点发送 HTTP 请求,拉取指标数据。
  5. 数据存储: Prometheus Server 将抓取到的指标数据存储在自己的时间序列数据库中,每个数据点都带有时间戳和标签。
  6. 可视化: Grafana 通过配置好的 Prometheus 数据源,使用 PromQL 查询存储在 Prometheus 中的 Ingress-NGINX 指标数据,并以图表等形式可视化展示。
  7. 告警: Prometheus 可以配置告警规则,当监控指标达到预设的阈值时,触发告警。
  8. 告警通知: Alertmanager 接收来自 Prometheus 的告警,并根据配置将告警通知发送给用户或系统。

环境准备

  1. 运行中的 Kubernetes 集群: 需要一个可以部署 Ingress-NGINX 和 Prometheus 的 Kubernetes 集群。
  2. Ingress-NGINX Controller 部署: 确保 Ingress-NGINX Controller 已经部署在你的集群中。
  3. Prometheus Server 部署: 确保 Prometheus Server 已经部署在你的集群中。你可以选择直接部署 Prometheus,或者使用 Prometheus Operator 进行管理。
  4. kubectl 命令行工具: 用于与 Kubernetes 集群进行交互。
  5. 可选:Grafana 部署: 如果需要可视化监控数据,需要部署 Grafana 并配置 Prometheus 数据源。
  6. 确认网络连通性: 确保 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 和内存使用率
  • 配置重载次数

测试步骤以及详细代码

  1. 部署 Ingress-NGINX 并启用指标:

    • 按照 Ingress-NGINX 的官方文档部署 Ingress Controller。
    • 修改 Ingress-NGINX Controller 的 Deployment YAML 文件,添加 --enable-prometheus-metrics--prometheus-listen-port=10254controller 容器的 args 中,并暴露 10254 端口。
    • 使用 kubectl apply -f <modified-ingress-nginx-deployment.yaml> 更新部署。
  2. 部署 Prometheus:

    • 按照 Prometheus 的官方文档或使用 Prometheus Operator 部署 Prometheus Server 到你的 Kubernetes 集群。
  3. 配置 Prometheus 抓取 Ingress-NGINX 指标:

    • 如果使用 Prometheus Operator: 创建一个 ServiceMonitor 资源(如前面的示例),确保其 selector 匹配 Ingress-NGINX Controller Pod 的标签,并且 endpoints 配置正确指向 /metricsprometheus 端口。使用 kubectl apply -f <your-ingress-nginx-servicemonitor.yaml> 创建。
    • 如果直接部署 Prometheus: 修改 Prometheus 的 prometheus.yml 配置文件,添加 kubernetes_sd_configs 来发现 Ingress-NGINX Controller Pods,并配置正确的 relabel_configs 来过滤和设置抓取目标。重新加载 Prometheus 配置。
  4. 验证 Prometheus 是否能抓取指标:

    • 等待几分钟,让 Prometheus 完成服务发现和首次抓取。
    • 访问 Prometheus 的 Web UI (<prometheus-service-ip>:<prometheus-port>).
    • 在查询框中输入 nginx_ingress_controller_requests_total,如果能看到以你的 Ingress-NGINX Controller Pod 名称作为 instance 标签的时间序列数据,则说明 Prometheus 已经成功抓取到指标。
  5. 部署 Grafana (可选):

    • 按照 Grafana 的官方文档部署 Grafana 到你的 Kubernetes 集群。
    • 在 Grafana 中添加 Prometheus 作为数据源。
    • 创建新的仪表盘,或者导入社区提供的 Ingress-NGINX 仪表盘(可以在 Grafana 的官方仪表盘库中搜索 “NGINX Ingress Controller”)。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。