欢迎阅读我的这篇博客——“超越 Sidecar:深入解析 Istio Ambient Mode 的流量机制与成本效益”。本文内容源自我在 KCD 北京的一次演讲。主要探讨的是 Istio 全新推出的一种数据面模式 —— Ambient Mode。它的核心理念是去除 Sidecar,减少资源开销与运维复杂度。本文将带大家了解 Ambient Mode 的出现背景、核心组件、流量路径机制以及与现有 Sidecar 模式的对比,从而帮助你快速评估并上手这项新特性。
首先,我们来思考一个问题:为什么要关注、甚至尝试这种新模式?Sidecar 在服务网格里一直都用得好好的,为什么要“去 Sidecar”呢?
让我们看看当前服务网格面临的一些问题和挑战。
思考:有没有一种方式在保留服务网格核心能力(安全、可观测、流量控制)的同时,减少对每个 Pod 的侵入和额外资源消耗?
服务网格架构一直在探索代理部署位置的多种可能性。例如:
这些模式在功能、安全、性能和管理复杂度上都有不同的侧重。Istio Ambient Mode 则是针对 Sidecar 带来的高资源消耗和运维成本,而提出的新尝试。
以下表格是对比常见服务网格部署模式的一些简要特点:
模式 | 安全性 | 效率 | 可管理性 | 性能 |
---|---|---|---|---|
Sidecar 模式 | 高安全性,隔离的代理 | 资源使用率高 | 集中化管理但较为复杂 | 增加一定延迟 |
Ambient 模式 | 通过 ztunnel 提供安全性,仍在发展中 | 更高效,共享代理 | 管理更简单但功能在完善中 | 良好;跨可用区时需注意网络开销 |
Cilium mesh | 中等安全性,基于 eBPF | 内核级效率 | 配置复杂 | 可视场景不同而异 |
gRPC | 应用集成安全,依赖应用自身 | 高效 | 更新管理复杂 | 低延迟,适用于实时场景 |
接下来我们正式进入第二部分,深入看看 Ambient Mode 的具体组件,包括 ztunnel、Waypoint Proxy 以及 Istio CNI 在其中扮演的角色。
istio-init
容器,负责流量劫持在 Ambient 模式下,Istio 数据面可分为两层:
Control Plane 依然由 Istiod 提供,主要负责给 ztunnel、Waypoint 下发配置和证书。
istio-init
容器,使安装更加清晰简洁。iptables REDIRECT
规则。这张图简单示意了 Istio CNI 如何与 Kubernetes 本身的网络插件(如 Calico、Cilium 等)组合在一起。它修改了本机的 CNI 配置,增加了 CNI 链,在 Kubernetes 分配完 Pod IP 后,紧接着就会执行 Istio CNI 的拦截逻辑,把网络流量规则注入到 Pod netns。并且为不同模式中 Pod 配置不同的 iptables 规则。 这样就与原本的 CNI 配置(包括网络策略)形成一个链式流程,不会相互冲突。
这张图详细描绘了当 Pod 启动时,Istio CNI 会怎么做:
介绍完组件之后,我们来看看最核心的“流量路径”。zTunnel 和 Waypoint 究竟是怎么拦截并转发流量的?我们会从透明流量拦截、HBONE 协议等角度进行解析。
在 Ambient 模式中,Istio CNI 会在 Pod 网络命名空间中注入 iptables 规则,将出站流量透明拦截到所在节点的 ztunnel 进程。之后由 ztunnel 决定是直接进行 L4 转发,还是将流量转发至 Waypoint Proxy 做进一步的 L7 处理。
如图所示,Kubelet 在节点上启动了一个 Pod,这个事件被 Istio CNI Agent 监听到,Istio CNI Agent 进入 Pod 的网络空间,设置 iptables 规则将流量重定向到本地 socket,并将 Pod 的文件描述符(FD)发送为 ztunnel。ztunnel 获取到 FD 之后就可以在 Pod 的网络空间中创建 socket。
Pod 在发送流量时,本该直连目标地址,但是 iptables 规则会把它拦截到本节点的 ztunnel 进程里,然后 ztunnel 决定这条流量需不需要交给 Waypoint 做 L7 代理。 如果不需要,就直接在 L4 层把它加密转发到目标 Pod;如果要 L7,例如鉴权,就再把流量隧道给 Waypoint。
Ambient 模式中,zTunnel 与 Waypoint 之间使用 HBONE (HTTP/2 + CONNECT) 协议来建立安全隧道,实现 mTLS 加密 和多路复用,减少额外的连接开销,简化代理转发流程。
下面是一个简化的 HBONE CONNECT 请求示例,利用 x-envoy-original-dst-host
、x-istio-auth-userinfo
等头信息来传递路由和身份认证所需上下文。
:method: CONNECT
:scheme: https
:authority: Pod_B_IP:9080
:path: /api/v1/users?id=123
x-envoy-original-dst-host: Pod_B_IP:9080
x-forwarded-proto: hbone
x-istio-attributes: ...
...
在这个示例里,假设 ztunnel A 需要把流量发送给 目标节点 B,我们可以看到外层的 TCP 连接其实是从 ztunnel_A_IP:52368 连到 Node_B_IP:15008。这是 ztunnel A 和 ztunnel B 之间的隧道端口,15008 就是 HBONE 监听端口。
进入到 HTTP/2 层后,就会有一个 CONNECT 请求,里面的 :authority
显示的是 Pod_B_IP:9080,表示实际上要连到 Pod B 的 9080 端口。x-envoy-original-dst-host
里也能看出相同信息。
同时我们看到了一些自定义头,比如 x-forwarded-proto
、x-istio-attributes 等,用来给目标 ztunnel 或后续代理带去更多上下文和安全验证信息。
可以把这个理解为:在 HTTP/2 CONNECT 之上,流量就像加了一个“内层”隧道,把应用层的请求(例如 /api/v1/users?id=123
)封装在这里面,然后在 ztunnel B 端解封装并转发到真实的 Pod B。
整个过程对应用来说是透明的,但对我们来说,通过查看这种 CONNECT 请求头,可以了解 Ambient 模式如何在 HTTP/2 层做流量路由和身份认证。这就是为什么说 HBONE 比传统的 Sidecar-to-Sidecar通信更加灵活,也更便于做 mTLS 以及 L7 扩展。
如果源 Pod 和目标 Pod 恰好在同一个节点上,流量会走 ztunnel 的 L4 加密流程。 这里显示,ztunnel 是使用 DaemonSet 部署在每个节点上的,并且使用了host Network,共享主机的网络。Istio CNI 将 Pod 的出站流量拦截到 ztunnel的15001端口,如果源和目的 pod 在同一个节点上,ztunnel 直接在内部完成加解密后将流量发送到目的地 pod。
如果需要 L7 的流量处理,比如鉴权,ztunnel 就会与 Waypoint 代理建立 HBONE 隧道,经过 Waypoint 代理的转发到目的 Pod。
这是跨节点的情况,也就是最常见的场景:
源节点的 ztunnel 把流量通过 HBONE 隧道加密后发给目标节点的 ztunnel;目标节点 ztunnel 解封装,再把明文流量递给目标 Pod。只要是纯 L4 无需 L7,就不必加一层 Waypoint,减少了代理链路。
当我们需要 L7 处理时,流量就会多经过一下 Waypoint。也就是:
这个流程比 L4 多了一次代理,但好处是只有特定流量才会被 L7 代理解析,减少不必要的开销。
对于非 Istio网格内部的流量,通过 Pod IP和端口直接访问 Pod时,为了防止这些流量逃出 ztunnel的掌控,也需要拦截这些流量。如果流量是访问的应用端口,通过判断数据包上是否带有 0x539 标记,如果没有,则将其转发到 ztunnel 监听的 15006 明文端口,经 ztunnel 处理后会带上 0x539 标记,然后就可以访问应用的目标端口了;如果流量的目的端口是 15008,那么实际上就会被 ztunnel 监听和处理,判断 HBONE 协议。
流量类型 | 处理位置 | 示例场景 |
---|---|---|
L4 | ztunnel(透明转发) | TCP 级别流量,不需应用层策略 |
L7 | ztunnel → Waypoint Proxy | HTTP/gRPC 需要鉴权、熔断、路由、可观测等高级功能 |
对于大部分只需 TCP 层加密和转发的流量,Ambient Mode 仅通过 ztunnel 即可;只有在需要 HTTP 层策略时才会额外经过 Waypoint。
有了对 Ambient 的了解后,我们还是得和原有的 Sidecar 模式做对比,来看看哪些功能还不完善,哪些场景更适合 Ambient。
与传统 Sidecar 模式相比,Ambient 目前仍有一些不完善之处:
指标 | Sidecar 模式 | Ambient 模式 |
---|---|---|
代理位置 | 每个 Pod 都运行 Envoy Sidecar | Node 级 ztunnel + 可选的 Waypoint Proxy |
资源开销 | 在大规模场景下 CPU/内存消耗相对更高 | 相对更低:代理共享在节点/命名空间级 |
运维复杂度 | 升级 Sidecar 需滚动更新所有关联 Pod,操作较繁琐 | 部署/升级集中在少数组件(ztunnel / Waypoint),运维更简单 |
性能 | 每个 Pod 都有 Envoy,使得隔离性更强,但整体有额外代理开销 | L4 性能较好,L7 场景需要多经过一次 Waypoint 转发 |
功能完整度 | 成熟稳定,支持多集群、VM、混合网络 | 尚在演进,多网络、VM 等高级场景支持仍在完善 |
典型使用场景 | 注重严格隔离或依赖特定的 EnvoyFilter、WASM 插件等深度定制 | 大规模集群、需要轻量化管理且大部分流量以 L4 为主的场景 |
好的,最后我们来总结一下 Ambient Mode 的优缺点,以及当前适合哪些场景。
你也可以通过 jimmysong.io 网站找到更多云原生相关的文章和实践分享。如果对此文或 Istio 有任何疑问,欢迎给我留言或在社区中交流。谢谢!
最后更新于 2025/03/22