第 3 章:Istio 的数据平面 - Envoy 代理

本文梳理了 Envoy 作为 Istio 数据平面的核心角色,涵盖其原理、主要功能、配置方式及与 Istio 的集成实践,适合云原生与服务网格技术人员快速掌握 Envoy 的关键知识。

Envoy 代理基础

Envoy 是由 Lyft 开发并捐赠给 CNCF 的高性能应用层代理,专为解决分布式系统中的网络通信、可观测性和弹性问题而设计。它以 C++ 编写,强调性能和稳定性,广泛应用于服务网格场景。

代理的作用

代理作为客户端与服务端之间的中介,能够实现安全、负载均衡、健康检查等功能。Envoy 作为应用层代理,支持 HTTP、gRPC 等多种协议,能够实现请求级别的流量治理和弹性控制。

图 1: 代理是流量中介
图 1: 代理是流量中介

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

图 2: 代理实现负载均衡
图 2: 代理实现负载均衡

Envoy 的核心功能

Envoy 提供了丰富的服务间通信能力,主要包括:

  • 监听器(Listeners):对外暴露端口,接收流量。
  • 路由(Routes):定义流量如何根据规则转发到后端集群。
  • 集群(Clusters):上游服务的逻辑分组,支持服务发现和负载均衡。
图 3: 流量流经 Envoy 的路径
图 3: 流量流经 Envoy 的路径

主要特性概览

  • 服务发现:自动发现上游服务,无需应用感知。
  • 负载均衡:支持多种算法(随机、轮询、最小请求数、一致性哈希等)。
  • 高级路由:基于路径、头信息、权重等实现流量分流、镜像、金丝雀发布。
  • 弹性能力:支持超时、重试、熔断、限流等网络弹性机制。
  • 协议支持:原生支持 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_totalHTTP/2 请求总数
cluster..upstream_cx_overflow集群连接熔断次数
cluster..upstream_rq_retry请求重试次数
cluster..ejections_detected_consecutive_5xx连续 5xx 异常剔除次数
表 1: Envoy 代理常见统计指标

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 动态下发配置,实现服务注册、流量治理、可观测性、安全等能力的解耦与自动化。

图 4: Istio 控制平面动态配置 Envoy
图 4: Istio 控制平面动态配置 Envoy

Istio 还负责:

  • 服务注册与发现(对接 Kubernetes API)
  • 指标与追踪数据采集(集成 Prometheus、Jaeger 等)
  • 证书签发与轮换(自动化 mTLS)

图 5: Istio 集成可观测性与安全
图 5: Istio 集成可观测性与安全
图 6: Istio 自动证书管理
图 6: Istio 自动证书管理

总结

  • Envoy 是 Istio 服务网格的数据平面核心,具备高性能、协议支持丰富、弹性与可观测性强等优势。
  • 支持静态与动态配置,便于大规模服务治理。
  • 管理 API 丰富,便于监控与调试。
  • 与 Istio 控制平面深度集成,实现服务注册、流量治理、安全与可观测性的自动化。
  • 适合云原生环境下构建高可用、可观测、弹性的微服务体系。

参考文献

  1. Envoy 官方文档 - envoyproxy.io
  2. Istio 官方文档 - istio.io
  3. OpenTracing - opentracing.io
  4. Jaeger 分布式追踪 - jaegertracing.io
  5. Envoy 微服务模式博客 - bit.ly/2M6Yld3

文章导航

独立页面

这是书籍中的独立页面。

书籍首页

评论区