3. Envoy Proxy 基础:架构与核心配置模型

Envoy Proxy 是服务网格数据平面的核心组件,负责拦截、处理并转发服务间所有流量。理解 Envoy 的架构与配置模型,是掌握 OPA 策略注入与审计日志采集的前提。本节将深入剖析 Envoy 的三层配置模型(Listener、Cluster、Route)以及动态配置协议 xDS 的工作原理。

3.1 Envoy 整体架构

Envoy 采用单进程多线程架构,主线程负责配置管理与统计收集,工作线程通过非阻塞 I/O 处理网络事件。其核心组件包括:

  • Listener(监听器):绑定端口并接收入站/出站连接。
  • Filter Chain(过滤器链):对流量进行 L3/L4/L7 处理,包括 TLS 终止、HTTP 解析、RBAC 授权、日志记录等。
  • Cluster(集群):定义上游服务端点集合及负载均衡策略。
  • Router(路由器):根据路由规则将请求分发至目标集群。
  • xDS 客户端:通过 gRPC 流从控制平面拉取动态配置。
架构要点: Envoy 的过滤器链机制是 OPA 策略注入的关键扩展点——通过 HTTP 过滤器(如 RBAC 或 External Authorization 过滤器)将请求上下文发送给 OPA 决策引擎,实现细粒度访问控制。
Envoy 内部架构与数据流 Envoy 内部架构与数据流 入站流量 Listener 端口绑定 / TLS Filter Chain HTTP解析 / RBAC OPA授权 / 审计日志 Router 路由匹配 / 重写 Cluster 端点 / 负载均衡 xDS 客户端 (gRPC) LDS / RDS / CDS / EDS 控制平面 (Istiod) 配置推送 / 服务发现 说明: OPA 作为 External Authorization 过滤器 嵌入 Filter Chain,实现策略决策。

3.2 Listener / Cluster / Route 配置模型

Envoy 的配置模型围绕三个核心资源构建,它们共同定义了流量处理的全路径:

配置资源 作用域 核心字段 典型用途
Listener 入站/出站端口 address, filter_chains, listener_filters 绑定 8080 端口,附加 TLS 证书
Cluster 上游服务端点 type (STATIC/EDS/STRICT_DNS), endpoints, lb_policy 定义 product-service 的 3 个 Pod 端点
Route 请求分发规则 match (prefix/regex), route (cluster, timeout), decorator 将 /api/v1/* 路由至 product-cluster
配置模型要点: 在服务网格中,Sidecar Envoy 通常配置两个 Listener:一个绑定虚拟入站端口(如 15006)处理进入 Pod 的流量,另一个绑定虚拟出站端口(如 15001)拦截 Pod 发出的流量。这种“双监听器”模式是透明流量劫持的基础。

3.2.1 静态配置示例

以下是一个简化的静态配置片段,展示了 Listener、Cluster 和 Route 的关联关系:

static_resources:
  listeners:
  - name: inbound_listener
    address:
      socket_address: { address: 0.0.0.0, port_value: 15006 }
    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: service_cluster }
          http_filters:
          - name: envoy.filters.http.router
  clusters:
  - name: service_cluster
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 127.0.0.1, port_value: 8080 }

3.3 xDS 协议工作原理

xDS(Discovery Service)是 Envoy 与控制平面之间的动态配置协议族。Envoy 通过 gRPC 流订阅四种核心资源,实现配置的热更新而无需重启进程。

3.3.1 四种核心 xDS 资源

协议 全称 推送内容 更新频率
LDS Listener Discovery Service 监听器配置(端口、过滤器链、TLS) 低(服务启动/端口变更)
RDS Route Discovery Service 路由规则(域名匹配、路径转发、重试策略) 中(灰度发布/路由变更)
CDS Cluster Discovery Service 集群定义(端点类型、负载均衡算法、熔断设置) 低(服务注册/集群变更)
EDS Endpoint Discovery Service 集群内具体端点 IP:Port 列表及健康状态 高(Pod 扩缩/健康检查)

3.3.2 xDS 工作流程

  1. 初始订阅:Envoy 启动后,向控制平面发起 LDS 订阅,获取 Listener 配置。
  2. 级联发现:Listener 中的 HTTP 连接管理器引用 RDS 名称,Envoy 自动发起 RDS 订阅获取路由规则。
  3. 集群发现:路由规则中引用了 Cluster 名称,Envoy 发起 CDS 订阅获取集群定义。
  4. 端点发现:若集群类型为 EDS,Envoy 进一步发起 EDS 订阅获取实时端点列表。
  5. 增量推送:控制平面通过 gRPC 流推送增量更新,Envoy 热加载新配置,不中断现有连接。
关键依赖顺序: LDS → RDS → CDS → EDS 是典型的级联依赖链。如果 LDS 推送失败,Envoy 将无法接收任何流量;如果 EDS 推送延迟,可能导致流量被路由到已下线的端点。在生产环境中,必须为控制平面配置高可用和健康检查。
xDS 协议级联发现与数据流 xDS 协议级联发现与数据流 控制平面 (Istiod) xDS 配置聚合与推送 Envoy Sidecar xDS 客户端 / 配置热加载 gRPC 双向流 ① LDS 推送 Listener ② RDS 推送 Route ③ CDS 推送 Cluster ④ EDS 推送 Endpoint 级联依赖顺序: LDS → RDS → CDS → EDS Envoy 按需订阅,控制平面 增量推送,配置热更新。

3.4 xDS 与 OPA 策略集成的关键点

在服务网格中,OPA 策略引擎通常通过以下方式与 Envoy 的 xDS 配置模型集成:

  • External Authorization 过滤器:在 Listener 的 HTTP 过滤器链中插入 envoy.ext_authz 过滤器,将请求属性(路径、方法、JWT 等)发送给 OPA 决策。
  • 动态路由注入:通过 RDS 动态更新路由规则,将特定路径的请求强制经过 OPA 授权检查。
  • 集群级熔断:通过 CDS 配置熔断阈值,当 OPA 服务响应延迟过高时,Envoy 自动熔断,防止级联故障。
  • 端点级健康检查:通过 EDS 动态剔除不健康的 OPA 实例,确保授权请求始终发送到可用端点。
实践建议: 在 Istio 环境中,OPA 通常作为独立服务部署,并通过 EnvoyFilter CRD 将 ext_authz 过滤器注入到目标工作负载的 Sidecar 中。xDS 的级联发现机制确保了 OPA 策略变更可以秒级生效,无需重启任何 Pod。