注意:本文基于 Envoy Gateway v1.3.2 编写。
在大规模微服务架构中,可观测性是理解与运维系统的核心能力。Envoy Gateway 构建于 Envoy Proxy 之上,提供了丰富的可观测性功能,包括指标、日志和追踪。本文将通过动手实践的方式,讲解如何基于 Prometheus、Loki 和 Tempo 等开源后端,为 Envoy Gateway 的数据平面(即 Envoy proxy 本身)配置可观测性功能。
在开始配置之前,请确保你已经完成 Envoy Gateway 的基本安装。下图展示了 Envoy Gateway 的可观测性组件架构:
OpenTelemetry Collector 是一个可插拔的数据中转组件,负责接收、处理和转发可观测性数据(如指标和追踪),来源包括 Envoy Gateway 等系统。通过将数据生成与数据消费解耦,它能够灵活对接多种可观测性后端(如 Prometheus、Tempo、Jaeger),同时支持数据增强、格式转换和多路导出。
按照官方 快速开始指南 安装 Envoy Gateway:
helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.3.2 -n envoy-gateway-system --create-namespace
kubectl wait --timeout=5m -n envoy-gateway-system deployment/envoy-gateway --for=condition=Available
kubectl apply -f https://github.com/envoyproxy/gateway/releases/download/v1.3.2/quickstart.yaml -n default
使用官方 Helm chart 安装可观测性组件:
helm install eg-addons oci://docker.io/envoyproxy/gateway-addons-helm --version v1.3.2 -n monitoring --create-namespace --set opentelemetry-collector.enabled=true
注意:OpenTelemetry Collector 默认未启用,需显式开启。
安装完成后,将部署以下组件:
组件 | 角色 | 描述 |
---|---|---|
FluentBit | 日志收集器 | 收集并转发日志到 Loki |
Grafana | 可视化界面 | 展示指标、日志和追踪的仪表盘 |
Loki | 日志存储 | 聚合和索引日志 |
OpenTelemetry Collector | 遥测收集器 | 将指标/追踪数据导出到 Prometheus / Tempo |
Prometheus | 指标后端 | 收集并存储 Prometheus 指标数据 |
Tempo | 追踪后端 | 存储和查询分布式追踪数据 |
为了测试可观测性组件,我们可以向 Envoy Gateway 发送一些简单的请求。由于使用的是 Minikube,本地可通过端口转发的方式访问:
export ENVOY_SERVICE=$(kubectl get svc -n envoy-gateway-system --selector=gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg -o jsonpath='{.items[0].metadata.name}')
kubectl port-forward -n envoy-gateway-system svc/${ENVOY_SERVICE} 8888:80
curl --verbose --header "Host: www.example.com" http://localhost:8888/get
通过以下配置禁用默认的 Prometheus 指标输出,并启用 OpenTelemetry Sink:
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: envoy-gateway-config
namespace: envoy-gateway-system
data:
envoy-gateway.yaml: |
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyGateway
provider:
type: Kubernetes
gateway:
controllerName: gateway.envoyproxy.io/gatewayclass-controller
telemetry:
metrics:
prometheus:
disable: true
sinks:
- type: OpenTelemetry
openTelemetry:
host: otel-collector.monitoring.svc.cluster.local
port: 4317
protocol: grpc
EOF
更新配置后,重启 Envoy Gateway 以生效:
kubectl rollout restart deployment envoy-gateway -n envoy-gateway-system
下图展示了 Envoy Proxy 指标可观测性的整体流程:Envoy 原生采集网络流量等关键指标,并通过 /stats/prometheus
接口暴露,Prometheus 进行抓取并在 Grafana 中可视化。此外,Envoy 还支持自定义指标,并可选集成 StatsD 等系统,实现灵活的监控体系。
本地暴露 Prometheus:
kubectl port-forward -n monitoring svc/prometheus 9090:80
访问 http://localhost:9090 并执行如下查询:
topk(1,envoy_cluster_upstream_cx_connect_ms_sum)
kubectl port-forward -n monitoring svc/grafana 3000:80
打开 http://localhost:3000,默认账户密码为 admin/admin
。
详细配置参考 Proxy Metrics 指南。
Envoy Gateway 使用访问日志(Access Log)进行流量记录,支持格式和输出目标的自定义。
应用以下配置,启用将日志发送至 OpenTelemetry Sink:
kubectl apply -f https://raw.githubusercontent.com/envoyproxy/gateway/refs/heads/main/examples/kubernetes/accesslog/otel-accesslog.yaml
通过 Loki 查询日志示例:
curl -s "http://localhost:3100/loki/api/v1/query_range" --data-urlencode "query={exporter=\"OTLP\"}" | jq '.data.result[0].values'
你将看到类似以下格式的输出:
[
[
"1693314563284333000",
"{"body":"[2025-04-17T13:09:23.284Z] \"- - HTTP/1.1\" 400 DPE 0 11 0 \"-\" \"-\" \"-\" \"-\" \"-\"\n","resources":{"cluster_name":"default/eg","k8s.cluster.name":"cluster-1","log_name":"otel_envoy_accesslog","node_name":"envoy-default-eg-64656661-6fccffddc5-662np","zone_name":""}}"
]
]
下图展示了日志可观测性流程:Envoy 支持自定义日志格式、输出到文件/stdout/syslog/HTTP 目标,亦支持按需采样、过滤,并可包含安全相关字段用于审计。
日志配置详情参考 Proxy Access Logs 指南。
kubectl port-forward -n monitoring svc/grafana 3000:80
打开浏览器访问 http://localhost:3000,首次登录使用 admin/admin
。
点击左侧导航栏的齿轮图标 → Data sources,确保 Loki 数据源配置正确,地址为 http://loki:3100
。
下载并导入日志仪表盘:envoy-gateway-logs-dashboard.json
打开 Envoy Gateway Logs 仪表盘,即可查询和过滤日志数据:
追踪提供了请求路径的详细可视化,是定位性能瓶颈的重要手段。
Envoy Gateway 原生支持 OpenTelemetry 格式的追踪,生成带有 Trace ID 和 Span ID 的请求链路数据,可通过配置发送到 Tempo、Zipkin 等支持 OpenTracing 协议的后端。
启用追踪:
kubectl apply -f https://raw.githubusercontent.com/envoyproxy/gateway/refs/heads/main/examples/kubernetes/tracing/default.yaml
暴露 Tempo:
kubectl port-forward svc/tempo 3100:3100 -n monitoring
查询 trace 概览:
curl -s "http://localhost:3100/api/search" --data-urlencode "q={ component=envoy }" | jq .traces
示例输出:
[
{
"traceID": "8010d4fd89e024c0626d984621babd71",
"rootServiceName": "eg.default",
"rootTraceName": "ingress",
"startTimeUnixNano": "1693377719403756000"
}
]
查询指定 trace:
curl -s "http://localhost:3100/api/traces/<trace_id>" | jq
返回信息将包含完整的 trace span 数据,包括服务名、请求起止时间、状态码、上下游节点等详细字段。
详细参考 Proxy Tracing 指南。
在 Grafana 左侧导航栏点击 Data sources,确认已配置名为 tempo
的 Tempo 数据源,地址为 http://tempo:3100
。
下载并导入追踪仪表盘:envoy-gateway-traces-dashboard.json
打开 Envoy Gateway Traces 仪表盘,浏览可用的 trace 数据:
点击任意 trace 可查看其详细的 span 结构:
通过本文的实践操作,你已掌握了如何为 Envoy Gateway 的数据平面启用完整的可观测性功能。结合 OpenTelemetry Collector 的中转能力,以及 Prometheus、Loki 和 Tempo 等后端系统,你可以构建一个具备可扩展性、可插拔性和一致性的可观测性体系,帮助你在无需修改应用代码的前提下,实现对系统流量、性能和错误的深入洞察与排障能力。
最后更新于 2025/04/17