在这里插入图片描述

Prometheus 监控 Gloo 全栈实战:云原生 API 网关的深度可观测性


Gloo Edge 是由 Solo.io 基于 Envoy 构建的下一代云原生 API 网关,支撑着 Kubernetes 集群的南北流量与东西流量管理。它的 Envoy 代理层 负责实际流量转发,控制平面 (gloo) 则管理路由、上游和虚拟服务。要真正掌控网关的脉搏,必须同时监控这两层:Envoy 的请求吞吐、延迟、重试、连接池,以及控制平面的配置同步延迟、资源状态、错误计数。Prometheus 通过 Gloo 原生暴露的指标端点,无需额外 Exporter 即可将网关的运行时完全透明化。本文将带你从开启指标、配置抓取,到解读核心指标、构建 Grafana 大屏和告警规则,彻底透视 Gloo 网关的每一个角落。


1. Gloo 的 Prometheus 暴露机制

Gloo 的指标分为两部分:

组件默认端口指标路径说明
Gloo 控制平面 (gloo)9091/metrics提供控制平面的业务逻辑指标,如上游状态、代理配置同步状态、API 事件处理次数等
Envoy 代理 (gateway-proxy)19000/stats/prometheus每个 gateway-proxy Pod 提供 Envoy 的标准指标,包括上游请求数、重试、连接、延迟等

两者组合在一起,才能完整呈现“配置是否正确同步 + 流量是否健康转发”。


2. 开启 Gloo 的 Prometheus 端点

2.1 使用 Helm 安装时启用

在安装 Gloo Edge 时,通过 values 确认指标端口开放:

# values.yaml
gloo:
  deployment:
    metricsPort: 9091     # Gloo 控制平面 metrics 端口
gatewayProxies:
  gatewayProxy:
    podTemplate:
      httpPort: 8080
      httpsPort: 8443
      # Envoy admin 端口默认 19000,会暴露 /stats/prometheus

安装:

helm install gloo gloo/gloo -n gloo-system -f values.yaml
2.2 验证端点

控制平面:

kubectl port-forward -n gloo-system deploy/gloo 9091:9091
curl http://localhost:9091/metrics

应该看到 gloo_sync_statusgloo_api_event_countgloo_eds_events_total 等指标。

Envoy 代理:

kubectl port-forward -n gloo-system deploy/gateway-proxy 19000:19000
curl http://localhost:19000/stats/prometheus

大量 envoy_* 指标出现,如 envoy_cluster_upstream_rq_totalenvoy_listener_http_downstream_rq_xx 等。


3. 配置 Prometheus 抓取

3.1 静态配置抓取控制平面
scrape_configs:
  - job_name: 'gloo-control'
    scrape_interval: 30s
    static_configs:
      - targets: ['gloo.gloo-system.svc.cluster.local:9091']
        labels:
          component: 'control-plane'
3.2 抓取所有 gateway-proxy 的 Envoy 指标

由于每个 proxy 实例独立,需要动态发现。在 Kubernetes 环境中,推荐使用 PodMonitor(Prometheus Operator)或基于 Pod 注解发现。

PodMonitor 示例:

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: gloo-envoy
  namespace: gloo-system
spec:
  selector:
    matchLabels:
      gloo: gateway-proxy
  podMetricsEndpoints:
  - port: http   # 可选,只用于标识
  # 但 Envoy 指标在 admin 端口 19000,需自定义 endpoint
  - targetPort: 19000
    path: /stats/prometheus
    interval: 15s

基于注解的自动发现:
为 gateway-proxy Pod 添加注解:

prometheus.io/scrape: "true"
prometheus.io/port: "19000"
prometheus.io/path: "/stats/prometheus"

然后在 Prometheus 中使用 kubernetes_sd_configs 和 relabel 过滤 Pod 标签 gloo=gateway-proxy

3.3 确保 Prometheus 有权限访问

如果使用了 RBAC,确保 Prometheus 的 ServiceAccount 可以读取 Pod 列表。


4. 核心监控指标与 PromQL

4.1 控制平面指标
指标含义
gloo_sync_status控制平面与 Envoy 代理的同步状态(0=成功,其他=失败)
gloo_api_event_count_totalAPI 事件处理总数(按 resource 类型分组)
gloo_eds_updates_totalEDS(端点发现服务)更新次数
gloo_uds_updates_totalUDS(上游发现服务)更新次数
gloo_cds_updates_totalCDS(集群发现服务)更新次数
gloo_lds_updates_totalLDS(监听器发现服务)更新次数

PromQL 示例:

  • 同步失败gloo_sync_status != 0
  • 配置变更频率rate(gloo_api_event_count_total[10m])
4.2 Envoy 流量指标
指标含义
envoy_listener_http_downstream_rq_xx下游 HTTP 请求按状态码分类 (2xx, 3xx, 4xx, 5xx)
envoy_cluster_upstream_rq_total到上游集群的请求总数
envoy_cluster_upstream_rq_time (Histogram)上游请求耗时
envoy_cluster_upstream_rq_retry上游请求重试次数
envoy_cluster_upstream_rq_pending_overflow连接池溢出导致的挂起请求
envoy_cluster_upstream_cx_active活跃上游连接数
envoy_cluster_upstream_cx_connect_timeout连接超时次数
envoy_cluster_health_check_failure健康检查失败计数
envoy_server_liveEnvoy 进程存活(1=live)

PromQL 示例:

  • 下游 QPSrate(envoy_listener_http_downstream_rq_xx[1m])
  • 上游 5xx 错误率sum(rate(envoy_cluster_upstream_rq_xx{envoy_response_code_class="5"}[5m])) by (envoy_cluster_name) / sum(rate(envoy_cluster_upstream_rq_total[5m])) by (envoy_cluster_name)
  • 上游 P95 延迟histogram_quantile(0.95, rate(envoy_cluster_upstream_rq_time_bucket[5m]))
  • 连接池溢出rate(envoy_cluster_upstream_rq_pending_overflow[5m]) > 0
  • 健康检查失败envoy_cluster_health_check_failure > 0

注意:Envoy 指标名称长且带有大量标签,可以使用 metric_relabel_configs 丢弃不需要的标签以减少基数。


5. Grafana 仪表盘推荐

  • Envoy Dashboard:Dashboard ID 11021(通用 Envoy 仪表盘),展示上下游请求、延迟、连接池、重试、健康检查等,完美适配 Gloo 的 Envoy 指标。
  • Gloo Edge Control Plane:ID 14039(Solo.io 社区贡献),展示控制平面同步状态、API 事件、EDS 更新等。
  • 自定义组合仪表盘:使用变量 gateway 区分不同集群,将控制平面指标与 Envoy 指标放在同一行,形成网关全貌。

导入后选择数据源,用 componentnamespace 变量过滤。


6. 告警规则实战

groups:
  - name: gloo_alerts
    rules:
      - alert: GlooControlPlaneDown
        expr: up{job="gloo-control"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Gloo 控制平面不可达"

      - alert: GlooSyncFailed
        expr: gloo_sync_status != 0
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Gloo 控制平面与 Envoy 代理同步失败,配置可能未生效"

      - alert: GlooEnvoyDown
        expr: envoy_server_live == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Envoy 代理实例 {{ $labels.pod }} 已停止"

      - alert: GlooUpstream5xxHigh
        expr: sum(rate(envoy_cluster_upstream_rq_xx{envoy_response_code_class="5"}[5m])) by (envoy_cluster_name)
              / sum(rate(envoy_cluster_upstream_rq_total[5m])) by (envoy_cluster_name) > 0.01
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "上游集群 {{ $labels.envoy_cluster_name }} 5xx 错误率超过 1%"

      - alert: GlooUpstreamHighLatency
        expr: histogram_quantile(0.99, rate(envoy_cluster_upstream_rq_time_bucket[5m])) > 2
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "上游集群 {{ $labels.envoy_cluster_name }} P99 延迟超过 2 秒"

      - alert: GlooConnectionPoolOverflow
        expr: rate(envoy_cluster_upstream_rq_pending_overflow[5m]) > 0
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "上游连接池溢出,考虑增加最大连接数或扩容上游服务"

      - alert: GlooHealthCheckFailed
        expr: envoy_cluster_health_check_failure > 0
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "上游集群 {{ $labels.envoy_cluster_name }} 健康检查失败,服务可能不可用"

      - alert: GlooRetryRateHigh
        expr: rate(envoy_cluster_upstream_rq_retry[5m]) / rate(envoy_cluster_upstream_rq_total[5m]) > 0.1
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "上游重试率超过 10%,下游可能遇到错误"

根据集群规模和业务灵敏度调整阈值。


7. 进阶:多集群、安全与性能调优

7.1 多集群监控

如果你的 Gloo 部署在多个 Kubernetes 集群,可以在每个集群内配置 Prometheus,并通过外部标签 cluster 区分。使用 Thanos 或 Grafana Mimir 聚合视图,在仪表盘变量中切换集群。

7.2 安全加固
  • 控制平面指标端口:通过 Service 仅暴露 ClusterIP,不对外。
  • Envoy Admin 端口19000 不应暴露到公网,务必使用 NetworkPolicy 限制仅 Prometheus 可访问。也可以配置 --envoy-admin-access-log 记录访问。
  • 认证:Gloo 控制平面和 Envoy 均无内置鉴权,建议在抓取路径前添加 sidecar 代理或使用 Kubernetes RBAC 限制 Pod 访问。
7.3 减少 Envoy 指标基数

Envoy 暴露的指标非常多,尤其包含大量标签(如 envoy_cluster_name)。可在 Prometheus 抓取时使用 metric_relabel_configs 丢弃不需要的指标,例如只保留 envoy_cluster_upstream_rq_*envoy_listener_*。或者在 Envoy 配置中启用 stats_matcher 来限制统计项(Gloo 允许通过 settings 配置 Envoy 的 statsConfig)。

7.4 结合 Gloo API 日志

当出现路由错误或 5xx 时,可以结合 gloo 控制平面日志(kubectl logs deploy/gloo -n gloo-system)以及 Envoy 的访问日志进行深入排查。Grafana 可与 Loki 集成,实现指标到日志的跳转。

7.5 监控 VirtualService 和 Upstream 资源

通过 kube-state-metrics 监控 Gloo CRD 的状态(例如 VirtualServiceUpstream 的数量和状态条件),确保期望的网关配置已应用。可以补充创建告警:VirtualService 长时间未 Ready。


8. 总结

通过 Gloo 原生暴露的 Prometheus 指标,你能以零侵入的方式捕捉到控制平面的同步异常和 Envoy 代理的每一个请求波动。上游 5xx 错误、连接池溢出、配置同步失败、延迟突增——所有这些信号都被转化为可查询、可告警的时序数据,在 Grafana 中直观呈现。将 Gloo 网关的可观测性纳入你的全栈监控体系,意味着从边缘路由到后端服务,整个流量链路的透明化闭环已经完成。部署它,让云原生网关的“黑盒”彻底点亮,为业务可用性筑起最后一道可观测防线。

更多推荐