【Istio 控制面】Ambient:ztunnel 与 waypoint 作为两类 xDS 客户端

💡 原文中文,约7500字,阅读约需18分钟。
📝

内容提要

本文探讨Istio Ambient模式下控制面istiod如何区分并服务ztunnel与waypoint两类代理。ztunnel按节点部署,仅处理L4,订阅地址与授权资源;waypoint是标准Envoy,按挂载关系订阅资源。当前ambient代理跳过sidecar的作用域过滤优化,源码留有TODO,是大规模部署的已知差距。

🔎

延伸解读

ztunnel 的故障域:节点级爆炸半径

ztunnel 按节点部署,一个节点上的所有工作负载共享同一个 ztunnel 实例。这意味着 ztunnel 故障时,该节点上所有 Pod 的 mTLS 身份和 L4 遥测都会同时失效,故障域从 sidecar 的“单 Pod”扩大为“整个节点”。这种设计简化了资源订阅(只消费 Address 和 WorkloadAuthorization),但运维上需要将 ztunnel 视为节点级关键组件,监控和容灾策略应与此匹配。

waypoint 排障:先查挂载关系

waypoint 虽然也是 Envoy,但其订阅范围由“挂载关系”决定,而非 Sidecar CR。当某个 Service 的 L7 策略未生效时,应首先确认该 Service 是否已通过 use-waypoint 标签等方式挂载到目标 waypoint。挂载关系的变化(如 VIP 或 Pod IP 变更)会通过 kind.Address 更新触发推送,因此排查路径与 sidecar 不同,需先检查挂载状态,再深入 CDS/RDS 内容。

ambient 推送优化缺失:规模化部署的考量

当前 ambient 代理(waypoint/ztunnel)在推送判断时跳过了 sidecar 已有的作用域过滤优化,源码中留有 TODO。这意味着在大规模集群中,任何配置变更都会让所有 ambient 代理进入完整的推送判断路径,增加控制面开销。这是评估是否将整个集群迁移到 ambient 模式时需考虑的具体机制,而非抽象的新技术风险。

Q&A

Istio Ambient 模式下,istiod 如何区分 ztunnel 和 waypoint 代理?

istiod 通过一个封闭的 NodeType 集合(SidecarProxy、Router、Waypoint、Ztunnel)来区分代理身份。在推送判断的第一行代码(xdsNeedsPush)中,就会根据 proxy.Type 进行分支,Waypoint 和 Ztunnel 从这一行起就走不同的路径。

ztunnel 代理订阅哪些 xDS 资源?它和 sidecar 的资源订阅有什么不同?

ztunnel 只订阅 Address 和 WorkloadAuthorization 两类资源,不消费 CDS/LDS/RDS 等标准 Envoy 资源树。它只处理 L4 流量,没有 HTTP 路由表或 Listener 上的 Filter Chain 概念。而 sidecar 会订阅完整的 LDS/RDS/CDS/EDS 资源树。

waypoint 代理的订阅范围是如何决定的?与 sidecar 有何不同?

waypoint 的订阅范围由挂载关系决定,即哪些 Service/Workload 通过 kind.Address 更新(如 use-waypoint 标签变化、VIP 或 Pod IP 变化)挂载到该 waypoint。而 sidecar 的作用域由 Sidecar CR 或命名空间可见性决定。因此,排障时需先检查服务是否挂载到目标 waypoint。

Ambient 模式下,istiod 的推送过滤逻辑有哪些未完成的优化?

在 DefaultProxyNeedsPush 中,对于 waypoint、ztunnel 和 agentgateway 代理,会跳过 sidecar 已有的作用域过滤优化(filterRelevantUpdates),直接返回需要推送。源码中留有 TODO: implement ambient aware scoping,意味着当前版本中,任意配置变更都会让所有 ambient 代理进入完整的推送判断路径,这是大规模部署的已知差距。

ztunnel 的故障域是什么?与 sidecar 相比有何不同?

ztunnel 是每节点一个的代理,其故障域是整个节点:如果 ztunnel 挂了,该节点上所有 Pod 都会失去 mTLS 身份和 L4 遥测。而 sidecar 的故障域是单个 Pod,因此 ztunnel 的爆炸半径更大。

waypoint 代理的故障域是什么?

waypoint 通常按命名空间或服务账号共享,其故障域覆盖所有挂载到它的 Service/Workload 的 L7 处理。如果 waypoint 故障,所有依赖它的 L7 策略(如重试、超时、路由)都会失效。

🏷️

标签

➡️

继续阅读