haproxy 对照 envoy

3 阅读4分钟

在 Cilium 的架构语境下,Envoy Proxy 与传统的 HAProxy 存在显著的差异。这种差异不仅体现在功能集上,更体现在设计哲学、云原生集成方式以及在 OSI 模型中所处位置的实现逻辑。

以下是从第一性原理出发,对两者在功能和实现层次上的深度对比分析:

1. 实现层次与架构模型 (Implementation Layers)

Envoy (Cilium 集成模式)

  • 云原生内生 (Cloud-Native Native): Envoy 是为分布式微服务设计的。在 Cilium 中,Envoy 通常作为 DaemonSet 运行在每个节点上(Per-node Proxy),而不是每个 Pod 一个 Sidecar。
  • eBPF 透明拦截: Cilium 利用 eBPF (Socket Proxy) 技术,在内核层直接拦截流量。当网络策略(CiliumNetworkPolicy)定义了 L7 规则(如 HTTP 路径过滤)时,eBPF 程序会自动将 TCP 流重定向到节点本地的 Envoy 监听端口。
  • xDS 动态控制平面: Envoy 的核心是 xDS API。Cilium 充当了 Envoy 的控制平面(Management Server),通过 gRPC 实时将 K8s 的 Service、Endpoint 和 Policy 变更推送到 Envoy,无需重启或重新加载配置。

传统 HAProxy

  • 边缘负载均衡器 (Edge Load Balancer): HAProxy 的设计初衷是作为高可靠的入口网关或负载均衡器。
  • 静态/半静态配置: 传统 HAProxy 强依赖于 haproxy.cfg 静态配置文件。虽然现代版本支持 Runtime API 和 Lua 脚本,但在自动化处理成千上万个动态容器 IP 变更时,其配置更新机制(重载进程)在高并发场景下可能存在抖动或复杂性。
  • 用户态手动接入: 流量通常需要显式指向 HAProxy 的 IP 地址,或者通过外部机制(如负载均衡 VIP)引入。它不具备类似 eBPF 那种深度集成到主机内核协议栈、对应用完全透明的流量劫持能力。

2. 功能特性对比 (Feature Comparison)

功能维度Envoy (Cilium Context)传统 HAProxy
协议支持深度支持 HTTP/2, gRPC, MongoDB, MySQL, Kafka, Redis 等多种 L7 协议。极强的高并发 TCP/HTTP 处理能力,对数据库协议支持相对较弱。
可观测性原生内置。 提供极其详尽的 L7 指标(Prometheus)、分布式追踪(Zipkin/Jaeger)和访问日志。依赖标准的 Syslog 和状态页。虽然现代版本有改进,但维度不如 Envoy 丰富。
可扩展性WebAssembly (Wasm) 。支持使用多种语言编写过滤器(Filter),无需重新编译。主要通过 Lua 脚本或 C 语言开发模块进行扩展。
动态性最终一致性配置。 专为节点、服务频繁变动的环境设计。强一致性配置。 变更配置通常需要重新加载(Reload),在高频变动的 K8s 环境中较为吃力。
安全策略执行复杂的 L7 网络策略(基于 HTTP Header、Method、Path 等)。主要用于流量转发和简单的 ACL 匹配。

3. 第一性原理下的底层区别

数据处理模型

  • Envoy: 采用多线程事件驱动模型,每个线程运行一个事件循环(Event Loop)。关键创新在于其 Thread-local 存储,减少了多线程间的锁竞争。在处理复杂 L7 逻辑(如编解码 gRPC)时,这种架构能更好地利用多核性能。
  • HAProxy: 历史上采用单进程/多进程模型(现在也支持多线程)。HAProxy 的底层代码经过了极致优化,通过内存零拷贝(Zero-copy)和自定义的缓冲区管理,在单纯的 L4 吞吐量并发连接数上,HAProxy 往往优于 Envoy。

流量控制逻辑

  • Envoy (Policy-driven): 在 Cilium 中,Envoy 是“策略的执行者”。它的存在是为了实现 Security Observability。每当一个包进来,Envoy 会解析完整的 L7 上下文,并将其与 Cilium 注入的身份信息(Identity)进行比对。
  • HAProxy (Routing-driven): HAProxy 是“流量的引导者”。它的核心目标是基于规则(URL、Cookie、Header)将流量最快地送到后端服务器,其安全功能多为防御性的(如 Rate Limiting, WAF 模式)。

4. 总结:为什么 Cilium 选择 Envoy 而非 HAProxy?

从逻辑架构上看,Cilium 需要一个**可编程性极强、能深度集成到动态服务发现、且原生支持现代协议(gRPC/Wasm)**的组件来处理非内核层(L7)的逻辑。

  1. 动态 API 优先: Envoy 的设计就是为了被程序控制(xDS),这完美契合了 Cilium 自动管理网络策略的需求。
  2. L7 解析深度: Cilium 追求微服务级别的精细化控制(例如:允许 Pod A 调用 Pod B 的 GET /metrics 但拒绝 POST /admin),Envoy 在这方面的解析器(Parser)生态更成熟。
  3. Sidecar-less 潜力: Envoy 的线程模型和动态能力使其非常适合作为节点级的统一代理,从而支撑 Cilium 的高性能透明代理架构。

结论: HAProxy 是性能极其卓越的“传统公路立交桥”,而 Envoy 更像是云原生生态中可实时编程的“智能交通枢纽”。在 Cilium 体系内,Envoy 实际上是作为 eBPF 内核过滤能力的高层延伸