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 决策引擎,实现细粒度访问控制。
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 工作流程
- 初始订阅:Envoy 启动后,向控制平面发起 LDS 订阅,获取 Listener 配置。
- 级联发现:Listener 中的 HTTP 连接管理器引用 RDS 名称,Envoy 自动发起 RDS 订阅获取路由规则。
- 集群发现:路由规则中引用了 Cluster 名称,Envoy 发起 CDS 订阅获取集群定义。
- 端点发现:若集群类型为 EDS,Envoy 进一步发起 EDS 订阅获取实时端点列表。
- 增量推送:控制平面通过 gRPC 流推送增量更新,Envoy 热加载新配置,不中断现有连接。
关键依赖顺序: LDS → RDS → CDS → EDS 是典型的级联依赖链。如果 LDS 推送失败,Envoy 将无法接收任何流量;如果 EDS 推送延迟,可能导致流量被路由到已下线的端点。在生产环境中,必须为控制平面配置高可用和健康检查。
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。