服务重启时用户连接中断?故障节点还在接收流量导致大量超时?这些是微服务架构运维中的常见问题。今天介绍的Envoy项目,专门用来解决这类流量管理难题。
项目背景
Envoy是Lyft在2016年开源的网络代理,用C++编写,现在是CNCF毕业项目。它的定位是处理微服务之间的网络通信,可以部署为边缘代理、API网关或服务网格的数据面。
目前在GitHub上有26.8k星标,被Uber、Apple、Netflix等公司用于生产环境。
核心功能
1. 热重启机制
配置变更时,新进程启动并接管连接,老进程处理完现有请求后退出,整个过程用户无感知。这解决了传统代理reload时连接中断的问题。
2. 动态配置
通过xDS协议(包括LDS、RDS、CDS、EDS等)实时下发配置,运维人员修改路由规则、调整后端节点,都不需要重启服务。
3. 故障自动处理
- 健康检查:定期探测后端服务,自动摘除故障节点
- 熔断器:当错误率超过阈值时快速失败,避免雪崩
- 重试机制:可配置重试次数和退避策略
4. 完整的监控数据
内置Prometheus指标导出,记录请求延迟、状态码分布、连接池状态等。通过Admin接口(默认9901端口)可以查看实时统计:
curl localhost:9901/stats/prometheus
配置示例
一个基础的HTTP代理配置:
static_resources:
listeners:
- address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: backend_service
timeout: 5s
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: backend_service
type: STRICT_DNS
lb_policy: ROUND_ROBIN
connect_timeout: 2s
load_assignment:
cluster_name: backend_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: backend.example.com
port_value: 8080
health_checks:
- timeout: 1s
interval: 10s
unhealthy_threshold: 3
healthy_threshold: 2
http_health_check:
path: "/health"
这个配置实现了:
- 监听10000端口接收HTTP请求
- 将流量转发到backend.example.com:8080
- 每10秒检查一次后端健康状态
- 请求超时时间5秒
Docker启动命令:
docker run -d \
-p 10000:10000 \
-p 9901:9901 \
-v $(pwd)/envoy.yaml:/etc/envoy/envoy.yaml \
envoyproxy/envoy:v1.28-latest
实际应用场景
灰度发布
通过配置路由权重,将10%流量导向新版本服务,观察指标正常后逐步放量。
API网关
统一处理认证、限流、路由分发,后端服务只需关注业务逻辑。
服务网格数据面
配合Istio或Consul使用,以Sidecar模式部署在每个Pod中,接管服务间通信。
边缘代理
替代Nginx作为入口网关,利用动态配置能力简化运维。
运维要点
-
监控配置
部署后接入Prometheus,重点关注这些指标:
envoy_cluster_upstream_rq_time
:请求延迟分布
envoy_cluster_upstream_cx_active
:活跃连接数
envoy_cluster_health_check_failure
:健康检查失败次数
-
熔断参数设置
根据后端服务容量合理配置:
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 1024
max_requests: 1024
max_retries: 3
-
日志格式
使用JSON格式便于日志系统解析:
access_log:
- name: envoy.access_loggers.file
typed_config:
"@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
path: /dev/stdout
log_format:
json_format:
start_time: "%START_TIME%"
method: "%REQ(:METHOD)%"
path: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%"
response_code: "%RESPONSE_CODE%"
duration: "%DURATION%"
-
Admin接口使用
常用命令:
/config_dump
:导出当前完整配置
/clusters
:查看集群状态和健康检查结果
/stats
:查看所有统计指标
/drain_listeners
:优雅下线
适用场景判断
适合使用Envoy的情况:
- 微服务架构需要统一的流量管理
- 需要频繁调整路由规则但不能中断服务
- 需要详细的请求级别监控数据
- 准备部署服务网格
可能不需要Envoy的情况:
- 单体应用或服务数量很少
- 对性能要求不高且配置变更频率低
- 团队对C++调试和问题排查经验不足
学习资源
官方文档写得比较详细,建议按这个顺序学习:
- Introduction - Architecture overview(了解整体架构)
- Configuration reference(学习配置语法)
- Operations - Admin interface(掌握运维工具)
社区提供了envoy-filter-example项目,演示如何开发自定义Filter扩展功能。
总结
Envoy解决的是微服务架构中流量管理的具体问题:零宕机配置变更、自动故障处理、详细监控数据。它不是必需品,但如果你的系统正在经历服务拆分,或者在为流量管理发愁,可以尝试在测试环境部署验证效果。
关注「云栈运维云原生」,获取更多云原生技术实践经验
项目地址:
https://github.com/envoyproxy/envoy
官方文档:
https://www.envoyproxy.io/docs
CNCF项目页:
https://www.cncf.io/projects/envoy
标签:#Envoy #Github #微服务 #ServiceMesh #云原生 #流量管理 #CNCF #运维工具