2. Envoy 基础架构:线程模型、核心概念与 xDS 协议

Envoy 作为高性能的七层代理,其架构设计围绕非阻塞事件驱动与动态配置下发展开。理解线程模型、核心抽象(Listener/Cluster/Endpoint)以及 xDS 协议,是掌握 Envoy 访问控制策略与运行基线核验的基础。

2.1 线程模型:单进程多线程架构

Envoy 采用 单进程多线程 模型,主线程负责配置管理与统计刷新,工作线程负责实际的 I/O 与请求处理。这种设计避免了多进程模型下的共享内存开销,同时通过线程绑定(Thread Affinity)实现高并发。

核心要点:Envoy 不依赖多进程,而是通过 --concurrency 参数控制工作线程数,通常设置为物理 CPU 核心数。
Envoy 线程模型架构 主线程 (Main Thread) 配置加载 xDS 订阅 统计刷新 工作线程 1 Listener 监听 连接处理 请求转发 工作线程 2 Listener 监听 连接处理 请求转发 工作线程 N(可配置,通常 = CPU 核心数)
设计优势:每个工作线程独立拥有自己的连接池与内存池,避免了锁竞争。主线程通过 共享内存(Shared Memory) 将更新后的配置原子性地发布给所有工作线程。

2.2 三大核心抽象:Listener、Cluster、Endpoint

Envoy 的配置模型围绕三个核心概念构建,它们构成了流量处理的基本链路:Listener(监听器)→ Filter(过滤器链)→ Cluster(集群)→ Endpoint(端点)。

概念 角色 关键属性 访问控制关联
Listener 流量入口,监听端口并接收连接 地址、端口、过滤器链、TLS 上下文 RBAC 过滤器、IP 白名单在此生效
Cluster 上游服务集群,定义连接目标与负载均衡策略 类型(EDS/STRICT_DNS/STATIC)、连接超时、健康检查 熔断、限流、异常检测在此配置
Endpoint 具体的后端实例(IP:Port) 地址、端口、健康状态、元数据 通过元数据实现灰度路由与基线核验

2.2.1 Listener:流量入口

Listener 定义了 Envoy 如何接收来自下游的流量。每个 Listener 可以绑定多个端口,并通过 过滤器链(Filter Chain) 对流量进行匹配与处理。在访问控制场景中,envoy.filters.network.rbac 和 envoy.filters.http.rbac 过滤器通常挂载在 Listener 的过滤器链上。

listeners:
- name: ingress_listener
  address:
    socket_address: { address: 0.0.0.0, port_value: 8080 }
  filter_chains:
  - filters:
    - name: envoy.filters.network.rbac
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.network.rbac.v3.RBAC
        rules:
          action: ALLOW
          policies:
            "allow-whitelist":
              permissions:
                - any: true
              principals:
                - remote_ip: { address_prefix: "10.0.0.0/8" }
    - 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: backend_service }
        http_filters:
        - name: envoy.filters.http.router

2.2.2 Cluster:上游服务集群

Cluster 定义了 Envoy 如何将请求转发到上游服务。它支持多种服务发现类型,其中 EDS(Endpoint Discovery Service) 是最灵活的方式,允许控制平面动态管理端点。Cluster 也是配置熔断、连接池、负载均衡策略的载体。

clusters:
- name: backend_service
  type: EDS
  eds_cluster_config:
    eds_config:
      resource_api_version: V3
      api_config_source:
        api_type: GRPC
        transport_api_version: V3
        grpc_services:
        - envoy_grpc:
            cluster_name: xds_cluster
  connect_timeout: 0.25s
  lb_policy: LEAST_REQUEST
  circuit_breakers:
    thresholds:
    - priority: DEFAULT
      max_connections: 1000
      max_pending_requests: 500

2.2.3 Endpoint:具体实例

Endpoint 是 Cluster 下的具体后端实例。在云原生环境中,Endpoint 通常对应 Pod 的 IP:Port。通过 端点元数据(Endpoint Metadata),Envoy 可以实现精细化的路由策略,例如将带有 version: v2 标签的请求只路由到元数据中包含 canary: true 的端点。

基线核验关键点:在运行基线核验场景中,Endpoint 的健康状态(HEALTHY/UNHEALTHY)和元数据(如 security_baseline: passed)是控制平面决策的重要依据。不满足基线的端点应被标记为 UNHEALTHY 或通过元数据过滤掉。

2.3 xDS 协议概述:动态配置的核心

xDS 是 Envoy 与控制平面之间的 发现服务(Discovery Service) 协议族。它基于 gRPC 流式传输,实现了配置的实时下发与热更新,无需重启 Envoy 进程。

2.3.1 核心 xDS 类型

协议 全称 资源内容 更新频率
LDS Listener Discovery Service Listener 配置(端口、过滤器链、TLS) 低(新增/删除监听端口时)
RDS Route Discovery Service 路由规则(域名、路径匹配、流量拆分) 中(灰度发布、策略变更时)
CDS Cluster Discovery Service Cluster 配置(服务发现类型、熔断、负载均衡) 中(新增/删除服务时)
EDS Endpoint Discovery Service Endpoint 列表(IP:Port、健康状态、元数据) 高(Pod 扩缩容、滚动更新时)
SDS Secret Discovery Service TLS 证书、私钥 低(证书轮换时)

2.3.2 xDS 工作流程

  1. 订阅(Subscribe):Envoy 启动后,向控制平面(如 Istiod)发起 gRPC 流订阅请求,声明需要监听哪些资源类型(如 LDS、CDS)。
  2. 推送(Push):控制平面将当前配置作为 初始快照(Initial Snapshot) 推送给 Envoy。
  3. 增量更新(Incremental Update):当配置发生变化时,控制平面仅推送变更部分(Delta xDS),Envoy 热更新对应资源。
  4. ACK/NACK:Envoy 每次收到更新后,会回复 ACK(成功应用)或 NACK(校验失败),控制平面据此判断配置是否生效。
xDS 协议动态配置流程 控制平面 (Istiod / go-control-plane) Envoy 数据平面 (Sidecar / Gateway) ① 订阅请求(Subscribe LDS/CDS/EDS) ② 初始快照推送(Initial Snapshot) ③ 增量更新(Delta xDS) ④ ACK / NACK 响应

2.3.3 xDS 与访问控制策略的集成

在云原生运行基线核验场景中,xDS 协议扮演了 策略下发通道 的角色:

  • LDS 携带 RBAC 规则:控制平面根据基线要求,动态生成包含 RBAC 过滤器的 Listener 配置,通过 LDS 下发给 Envoy。
  • EDS 携带端点元数据:控制平面将基线核验结果(如 security_baseline: passed)写入 Endpoint 的元数据中,Envoy 根据元数据进行路由决策。
  • CDS 携带熔断阈值:当基线核验发现某个服务异常时,控制平面可通过 CDS 动态调整该 Cluster 的熔断阈值,实现快速降级。
最佳实践:在生产环境中,建议启用 Delta xDS 以减少控制平面与数据平面之间的带宽消耗。同时,为 xDS 订阅设置合理的超时与重试策略,避免因网络抖动导致配置中断。