3. 静态配置入门:使用静态YAML配置启动Envoy,实现一个最简单的TCP代理

Envoy 的配置方式分为静态配置和动态配置(xDS)。对于初学者或固定拓扑场景,静态配置是最直接、最可控的入门方式。本章将使用一个纯静态 YAML 配置文件,启动 Envoy 并实现一个最简单的 TCP 代理——将客户端的 TCP 流量透明转发到上游服务。

3.1 核心概念:Listener、Filter、Cluster

在编写配置之前,需要理解 Envoy 代理的三个核心抽象层。它们构成了 Envoy 数据平面的基本骨架。

组件 角色 类比
Listener 定义 Envoy 在哪个 IP:Port 上监听入站连接 大门(入口)
Filter 对经过 Listener 的流量进行匹配、处理或转发决策 门卫(检查与路由)
Cluster 定义上游服务(目标后端)的地址、端口、负载均衡策略 目的地列表(地址簿)
关键理解: 在 TCP 代理场景中,Filter 的作用是“匹配所有 TCP 连接,并将其转发到指定的 Cluster”。不需要 HTTP 协议解析,因此使用 envoy.filters.network.tcp_proxy 过滤器。

3.2 静态配置结构总览

一个完整的 Envoy 静态配置文件是一个 YAML 文档,顶层包含 admin、static_resources 等关键字段。下面是最简 TCP 代理的配置骨架:

admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.filters.network.tcp_proxy
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
          stat_prefix: tcp_proxy
          cluster: backend_service

  clusters:
  - name: backend_service
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: backend_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 8080
配置要点:
  • admin:暴露 Envoy 管理接口(端口 9901),用于健康检查和指标采集。
  • listeners:监听 0.0.0.0:10000,接收所有 TCP 连接。
  • filter_chains:使用 tcp_proxy 过滤器,将流量转发到名为 backend_service 的 Cluster。
  • clusters:定义上游为 127.0.0.1:8080,使用 STRICT_DNS 类型和轮询负载均衡。

3.3 流量路径与组件交互

下图展示了客户端请求经过 Envoy TCP 代理到达后端服务的完整数据流:

TCP 代理流量路径(静态配置) 客户端 192.168.1.10 Envoy 代理 Listener: 0.0.0.0:10000 Filter: tcp_proxy Cluster: backend_service 后端服务 127.0.0.1:8080 TCP 连接 转发 说明 Envoy 在 10000 端口接收 TCP 连接,通过 tcp_proxy 过滤器直接转发到 127.0.0.1:8080

3.4 启动与验证步骤

按照以下步骤启动 Envoy 并验证 TCP 代理是否正常工作:

  1. 准备后端服务:使用 nc 或 python 启动一个简单的 TCP 回显服务监听 8080 端口。
  2. 编写配置文件:将上述 YAML 保存为 envoy-tcp.yaml。
  3. 启动 Envoy:
    envoy -c envoy-tcp.yaml --log-level info
  4. 验证管理接口:
    curl http://localhost:9901/server_info
  5. 测试 TCP 代理:
    echo "Hello Envoy" | nc localhost 10000
常见问题:
  • 如果 Envoy 启动失败,检查 YAML 缩进是否正确(Envoy 对缩进敏感)。
  • 确保后端服务先于 Envoy 启动,否则 Envoy 会报告 Cluster 无健康端点。
  • 管理接口端口 9901 不要与业务端口 10000 冲突。

3.5 配置参数详解

下表对 TCP 代理配置中的关键参数进行说明:

参数路径 值示例 说明
listeners[].address.socket_address.port_value 10000 Envoy 监听的端口,客户端连接的目标端口
filter_chains[].filters[].typed_config.cluster backend_service 指定流量转发到的 Cluster 名称,必须与 clusters 中定义一致
clusters[].type STRICT_DNS Cluster 发现类型:STATIC(静态IP)、STRICT_DNS(DNS解析)、LOGICAL_DNS
clusters[].lb_policy ROUND_ROBIN 负载均衡策略:ROUND_ROBIN、LEAST_REQUEST、RING_HASH 等
load_assignment.endpoints[].lb_endpoints[].endpoint.address.socket_address 127.0.0.1:8080 上游服务的实际 IP 和端口

3.6 进阶:多端点与负载均衡

静态配置同样支持定义多个上游端点,Envoy 会自动进行负载均衡。下面是一个包含两个后端实例的 Cluster 配置片段:

clusters:
- name: backend_service
  type: STATIC
  lb_policy: ROUND_ROBIN
  load_assignment:
    cluster_name: backend_service
    endpoints:
    - lb_endpoints:
      - endpoint:
          address:
            socket_address:
              address: 10.0.0.1
              port_value: 8080
      - endpoint:
          address:
            socket_address:
              address: 10.0.0.2
              port_value: 8080
生产建议: 在开发环境使用 STATIC 类型直接写死 IP;在测试环境使用 STRICT_DNS 配合 DNS 轮询;生产环境推荐使用动态 xDS 实现服务发现。

3.7 本章小结