第 3 章:Istio 的数据平面 - Envoy 代理
本文梳理了 Envoy 作为 Istio 数据平面的核心角色,涵盖其原理、主要功能、配置方式及与 Istio 的集成实践,适合云原生与服务网格技术人员快速掌握 Envoy 的关键知识。
Envoy 代理基础
Envoy 是由 Lyft 开发并捐赠给 CNCF 的高性能应用层代理,专为解决分布式系统中的网络通信、可观测性和弹性问题而设计。它以 C++ 编写,强调性能和稳定性,广泛应用于服务网格场景。
代理的作用
代理作为客户端与服务端之间的中介,能够实现安全、负载均衡、健康检查等功能。Envoy 作为应用层代理,支持 HTTP、gRPC 等多种协议,能够实现请求级别的流量治理和弹性控制。

代理隐藏了后端服务的拓扑细节,实现了流量的智能分发和故障隔离。

Envoy 的核心功能
Envoy 提供了丰富的服务间通信能力,主要包括:
- 监听器(Listeners):对外暴露端口,接收流量。
- 路由(Routes):定义流量如何根据规则转发到后端集群。
- 集群(Clusters):上游服务的逻辑分组,支持服务发现和负载均衡。

主要特性概览
- 服务发现:自动发现上游服务,无需应用感知。
- 负载均衡:支持多种算法(随机、轮询、最小请求数、一致性哈希等)。
- 高级路由:基于路径、头信息、权重等实现流量分流、镜像、金丝雀发布。
- 弹性能力:支持超时、重试、熔断、限流等网络弹性机制。
- 协议支持:原生支持 HTTP/1.1、HTTP/2、gRPC 等。
- 可观测性:内置丰富的指标收集与分布式追踪能力,支持 StatsD、Prometheus、OpenTracing 等。
- TLS 支持:自动终止和发起 TLS,简化安全配置。
- 可扩展性:支持 C++、Lua、Wasm 等多种扩展方式。
统计项 | 描述 |
---|---|
downstream_cx_total | 连接总数 |
downstream_cx_http1_active | 活跃 HTTP/1.1 连接数 |
downstream_rq_http2_total | HTTP/2 请求总数 |
cluster. | 集群连接熔断次数 |
cluster. | 请求重试次数 |
cluster. | 连续 5xx 异常剔除次数 |
Envoy 配置实践
Envoy 支持静态和动态两种配置方式,配置文件采用 YAML 或 JSON 格式,主要包括监听器、路由、集群等资源定义。
静态配置示例
以下为一个简单的静态配置,声明监听器、路由和集群:
static_resources:
listeners:
- name: httpbin-demo
address:
socket_address: { address: 0.0.0.0, port_value: 15001 }
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
stat_prefix: egress_http
route_config:
name: httpbin_local_route
virtual_hosts:
- name: httpbin_local_service
domains: ["*"]
routes:
- match: { prefix: "/" }
route:
auto_host_rewrite: true
cluster: httpbin_service
http_filters:
- name: envoy.router
clusters:
- name: httpbin_service
connect_timeout: 5s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
hosts:
- socket_address: { address: httpbin, port_value: 8000 }
动态配置与 xDS
Envoy 支持通过 xDS API 动态获取监听器、路由、集群、端点等配置,实现大规模代理的集中管理。xDS 包括 LDS(监听器)、RDS(路由)、CDS(集群)、EDS(端点)、SDS(证书)等。
动态配置示例:
dynamic_resources:
lds_config:
api_config_source:
api_type: GRPC
grpc_services:
- envoy_grpc:
cluster_name: xds_cluster
clusters:
- name: xds_cluster
connect_timeout: 0.25s
type: STATIC
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
hosts:
- socket_address: { address: 127.0.0.3, port_value: 5678 }
Envoy 实操与管理
通过 Docker 快速体验 Envoy 的部署与调试:
- 拉取镜像:
docker pull envoyproxy/envoy:v1.19.0
docker pull curlimages/curl
docker pull citizenstig/httpbin
- 启动 httpbin 服务:
docker run -d --name httpbin citizenstig/httpbin
- 启动 Envoy 代理(传入配置文件):
docker run --name proxy --link httpbin envoyproxy/envoy:v1.19.0 \
--config-yaml "$(cat ch3/simple.yaml)"
- 使用 curl 验证代理转发:
docker run -it --rm --link proxy curlimages/curl \
curl -X GET http://proxy:15001/headers
管理 API 使用
Envoy 提供丰富的管理 API,便于实时监控和调试:
- 查看统计指标:
docker run -it --rm --link proxy curlimages/curl \
curl -X GET http://proxy:15000/stats
- 其他常用端点包括
/certs
、/clusters
、/config_dump
、/listeners
、/logging
、/stats/prometheus
等。
请求重试配置
通过 retry_policy
实现自动重试:
- match: { prefix: "/" }
route:
auto_host_rewrite: true
cluster: httpbin_service
retry_policy:
retry_on: 5xx
num_retries: 3
Envoy 与 Istio 的集成
Istio 以 Envoy 作为数据平面代理,控制平面(如 istiod
)通过 xDS API 动态下发配置,实现服务注册、流量治理、可观测性、安全等能力的解耦与自动化。

Istio 还负责:
- 服务注册与发现(对接 Kubernetes API)
- 指标与追踪数据采集(集成 Prometheus、Jaeger 等)
- 证书签发与轮换(自动化 mTLS)
总结
- Envoy 是 Istio 服务网格的数据平面核心,具备高性能、协议支持丰富、弹性与可观测性强等优势。
- 支持静态与动态配置,便于大规模服务治理。
- 管理 API 丰富,便于监控与调试。
- 与 Istio 控制平面深度集成,实现服务注册、流量治理、安全与可观测性的自动化。
- 适合云原生环境下构建高可用、可观测、弹性的微服务体系。
参考文献
- Envoy 官方文档 - envoyproxy.io
- Istio 官方文档 - istio.io
- OpenTracing - opentracing.io
- Jaeger 分布式追踪 - jaegertracing.io
- Envoy 微服务模式博客 - bit.ly/2M6Yld3