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

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_status、gloo_api_event_count、gloo_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_total、envoy_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_total | API 事件处理总数(按 resource 类型分组) |
gloo_eds_updates_total | EDS(端点发现服务)更新次数 |
gloo_uds_updates_total | UDS(上游发现服务)更新次数 |
gloo_cds_updates_total | CDS(集群发现服务)更新次数 |
gloo_lds_updates_total | LDS(监听器发现服务)更新次数 |
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_live | Envoy 进程存活(1=live) |
PromQL 示例:
- 下游 QPS:
rate(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 指标放在同一行,形成网关全貌。
导入后选择数据源,用 component 或 namespace 变量过滤。
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 的状态(例如 VirtualService、Upstream 的数量和状态条件),确保期望的网关配置已应用。可以补充创建告警:VirtualService 长时间未 Ready。
8. 总结
通过 Gloo 原生暴露的 Prometheus 指标,你能以零侵入的方式捕捉到控制平面的同步异常和 Envoy 代理的每一个请求波动。上游 5xx 错误、连接池溢出、配置同步失败、延迟突增——所有这些信号都被转化为可查询、可告警的时序数据,在 Grafana 中直观呈现。将 Gloo 网关的可观测性纳入你的全栈监控体系,意味着从边缘路由到后端服务,整个流量链路的透明化闭环已经完成。部署它,让云原生网关的“黑盒”彻底点亮,为业务可用性筑起最后一道可观测防线。
更多推荐
所有评论(0)