Envoy Gateway代理可观测性实践指南
前言
在现代云原生架构中,服务网格和API网关的可观测性至关重要。Envoy Gateway作为基于Envoy Proxy构建的API网关解决方案,提供了完整的可观测性能力。本文将深入探讨如何配置和使用Envoy Gateway的代理可观测性功能,包括指标(Metrics)、日志(Logs)和追踪(Traces)三大支柱。
核心概念
在开始实践前,我们需要了解几个关键概念:
- 指标(Metrics):反映系统运行状态的量化数据,如请求数、延迟、错误率等
- 日志(Logs):系统运行过程中产生的详细事件记录
- 追踪(Traces):记录请求在系统中流转的完整路径
- OpenTelemetry:云原生可观测性标准,提供统一的指标、日志和追踪收集方案
环境准备
基础组件安装
Envoy Gateway的可观测性需要依赖几个核心组件:
- FluentBit:轻量级日志收集器,负责从EnvoyProxy实例收集日志并转发到Loki
- Loki:Grafana开源的日志聚合系统,专为云原生环境设计
- Tempo:Grafana开源的分布式追踪后端
- OpenTelemetry Collector:可观测性数据收集、处理和导出的统一组件
以下是安装这些组件的命令:
# 安装FluentBit
helm repo add fluent https://fluent.github.io/helm-charts
helm upgrade --install fluent-bit fluent/fluent-bit -f fluent-bit-values.yaml -n monitoring --create-namespace
# 安装Loki
kubectl apply -f loki.yaml -n monitoring
# 安装Tempo
helm repo add grafana https://grafana.github.io/helm-charts
helm upgrade --install tempo grafana/tempo -f tempo-values.yaml -n monitoring --create-namespace
# 安装OpenTelemetry Collector
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm upgrade --install otel-collector open-telemetry/opentelemetry-collector -f otel-collector-values.yaml -n monitoring --create-namespace
指标监控实践
默认指标配置
Envoy Gateway默认通过Prometheus端点暴露指标数据。可以通过以下方式验证:
# 获取Envoy Pod名称并设置端口转发
export ENVOY_POD_NAME=$(kubectl get pod -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 pod/$ENVOY_POD_NAME -n envoy-gateway-system 19001:19001
# 查询指标数据
curl localhost:19001/stats/prometheus | grep "default/backend/rule/0/match/0-www"
指标配置调整
如果需要禁用Prometheus指标,可以通过修改EnvoyProxy CRD实现:
apiVersion: config.gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
name: disable-prometheus
namespace: envoy-gateway-system
spec:
telemetry:
metrics:
prometheus:
disable: true
OpenTelemetry指标收集
Envoy Gateway支持将指标发送到OpenTelemetry Collector:
apiVersion: config.gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
name: otel-sink
namespace: envoy-gateway-system
spec:
telemetry:
metrics:
prometheus:
disable: true
sinks:
- openTelemetry:
host: otel-collector.monitoring.svc.cluster.local
port: 4317
验证OpenTelemetry Collector收集的指标:
# 获取OTel Collector Pod并设置端口转发
export OTEL_POD_NAME=$(kubectl get pod -n monitoring --selector=app.kubernetes.io/name=opentelemetry-collector -o jsonpath='{.items[0].metadata.name}')
kubectl port-forward pod/$OTEL_POD_NAME -n monitoring 19001:19001
# 查询指标
curl localhost:19001/metrics | grep "default/backend/rule/0/match/0-www"
日志管理实践
默认日志配置
Envoy Gateway默认将日志输出到stdout,采用Envoy的标准文本格式。可以通过Loki查询这些日志:
LOKI_IP=$(kubectl get svc loki -n monitoring -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl -s "http://$LOKI_IP:3100/loki/api/v1/query_range" --data-urlencode "query={job=\"fluentbit\"}" | jq '.data.result[0].values'
日志配置调整
禁用访问日志的配置示例:
apiVersion: config.gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
name: disable-accesslog
namespace: envoy-gateway-system
spec:
telemetry:
accessLog:
disable: true
OpenTelemetry日志收集
Envoy Gateway支持将日志发送到OpenTelemetry Collector:
apiVersion: config.gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
name: otel-accesslog
namespace: envoy-gateway-system
spec:
telemetry:
accessLog:
sinks:
- openTelemetry:
host: otel-collector.monitoring.svc.cluster.local
port: 4317
验证OpenTelemetry Collector收集的日志:
curl -s "http://$LOKI_IP:3100/loki/api/v1/query_range" --data-urlencode "query={exporter=\"OTLP\"}" | jq '.data.result[0].values'
分布式追踪实践
启用追踪功能
默认情况下,Envoy Gateway不启用追踪功能。可以通过以下配置启用:
apiVersion: config.gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
name: enable-tracing
namespace: envoy-gateway-system
spec:
telemetry:
tracing:
provider:
type: OpenTelemetry
host: otel-collector.monitoring.svc.cluster.local
port: 4317
注意:当前Envoy Gateway使用100%采样率,可能影响性能,生产环境应根据实际情况调整。
追踪数据查询
可以通过Tempo查询追踪数据:
TEMPO_IP=$(kubectl get svc tempo -n monitoring -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
# 查询追踪列表
curl -s "http://$TEMPO_IP:3100/api/search" --data-urlencode "q={ component=envoy }" | jq .traces
# 查询具体追踪详情
curl -s "http://$TEMPO_IP:3100/api/traces/<trace_id>" | jq
最佳实践建议
- 生产环境采样率:追踪功能应设置合理的采样率,避免全量采集影响性能
- 日志级别控制:根据实际需求调整日志级别,避免过多冗余日志
- 指标聚合:合理设置指标聚合周期,平衡实时性和系统负载
- 资源限制:为可观测性组件设置适当的资源限制,避免影响业务性能
- 安全考虑:确保可观测性端点有适当的访问控制
总结
Envoy Gateway提供了完整的可观测性解决方案,通过本文的实践指南,您可以轻松配置指标监控、日志管理和分布式追踪功能。合理利用这些功能,可以帮助您更好地理解系统运行状态、快速定位问题并优化系统性能。
在实际生产环境中,建议根据业务规模和需求,对这些可观测性功能进行定制化配置,以达到最佳的效果和性能平衡。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考