译者按:Istio 于2022年9月7日宣布了一种全新的数据平面模式 “ambient mesh”(ambient 意思是“环境的”,这里指 ambient mesh 使用了环境中的共享代理而不是 sidecar,下文直接使用英文原文),简单地讲就是将数据面的代理从应用 pod 中剥离出来独立部署,以彻底解决 mesh 基础设施和应用部署耦合的问题。该变化是 Istio 自创建以来的第二次大的架构变动,也说明 Istio 社区在持续创新,以解决 service mesh 生产中面临的实际问题。
今天,我们很高兴地介绍 “ambient mesh”,这是 Istio 提供的一种新的数据平面模式,旨在简化操作,提供更广泛的应用兼容性,并降低基础设施的成本。Ambient mesh 使得用户可以选择使用一种可以集成到其基础设施中的 Mesh 数据平面,而不是需要和应用一起部署的 sidecar。同时,该模式可以提供和 Sidecar 模式相同的零信任安全、遥测和流量管理等 Istio 的核心功能。目前 ambient mesh 已提供了预览版,我们正努力争取在未来几个月内将其推向生产就绪。
自创立以来,Istio 架构的一个关键特征就是使用 Sidecar – 与应用容器一起部署的可编程代理。sidecar 模式可以让应用程序在不对代码进行重大修改的前提下获得 Istio 提供的各种好处(流量治理,应用安全,可观察性等)。
Istio 的传统模式将 Envoy 代理作为 sidecar 部署在应用 pod 中
虽然相对于重构应用程序而言,sidecar 模式有很大的优势,但这种模式并没有在应用程序和 Istio 数据平面之间提供完美的隔离。这导致了下述这些限制:
虽然 sidecar 模式依然有它的用武之地 - 后面我们对此会有更多的讨论 - 但我们认为需要有一个侵入性更低、更容易使用的选择,该选择将更适合许多服务网格用户。
在之前的模式中,Istio 在单一的架构组件 sidecar 中实现了从基本的加密到高级的 L7 策略的所有数据平面功能。在实践中,这使得 sidecar 成为一个要么全选,要么没有的功能组件。即使工作负载只需要简单的传输安全,管理员仍然需要付出部署和维护 sidecar 的运营成本。sidecar 对每个工作负载都有固定的运维成本,无法根据用例的复杂性的不同进行伸缩。
Ambient mesh 采取了一种不同的方法。它将 Istio 的功能分成两个不同的层次。在底层,有一个安全覆盖层来处理流量的路由和零信任安全。在这之上,当需要时,用户可以通过启用 L7 处理来获得 Istio 的全部能力。L7 处理模式虽然比安全覆盖层更重,但仍然作为基础设施的一个 ambient 组件运行,不需要对应用 pod 进行修改。
ambient mesh 的分层
这种分层的方法允许用户以增量的方式应用 Istio,从完全没有 mesh,到安全覆盖,再到完整的 L7 处理,用户可以根据需要以 namespace 为操作单位进行平滑过渡。此外,ambient 模式和 sidecar 模式下运行的工作负载可以无缝地进行交互,允许用户根据随着时间变化的需求而混合使用不同模式并进行演进。
Ambient mesh 使用了一个共享代理,该共享代理运行在 Kubernetes 集群的每个节点上。这个代理是一个零信任隧道(简称为 ztunnel),其主要职责是安全地连接和认证 mesh 内的工作负载。节点上的网络栈会将工作负载的所有流量重定向到本地的 ztunnel 代理。这将 Istio 的数据平面与应用程序的关注点完全分开,可以让运维在不影响应用的情况下启用、禁用、伸缩和升级数据平面。ztunnel 不对工作负载流量进行 L7 处理,因此相对 sidecar 更为精简。大幅降低的复杂性和相关的资源成本使得 ambient mesh 适合作为共享基础设施进行交付。
Ztunnel 实现了一个服务网格的核心功能:零信任。当为一个 namespace 启用 ambient 时,Istio 会创建一个安全覆盖层(secure overlay),该安全覆盖层为工作负载提供 mTLS, 遥测和认证,以及 L4 权限控制,并不需要中断 HTTP 链接或者解析 HTTP 数据。
Ambient mesh 使用一个节点上的共享 ztunnel 来提供一个零信任的安全覆盖层
在启用 ambient mesh 并创建安全覆盖层后,一个 namepace 也可以配置使用 L7 的相关特性。这样可以在一个 namespae 中提供完整的 Istio 功能,包括 Virtual Service API、L7 遥测 和 L7授权策略。以这种模式运行的 namespace 使用一个或多个基于 Envoy 的 “waypoint proxy”(waypoint 意味路径上的一个点,下文直接使用英文原文) 来为工作负载进行 L7 处理。Istio 控制平面会配置集群中的 ztunnel,将所有需要进行 L7 处理的流量发送到 waypoint proxy。重要的是,从Kubernetes 的角度来看,waypoint proxy 只是普通的 pod,可以像其他Kubernetes 工作负载一样进行自动伸缩。由于 waypoint proxy 可以根据其服务的 namespace 的实时流量需求进行自动伸缩,而不是按照可能的最大工作负载进行配置,我们预计这将为用户节省大量资源。
当需要支持更多(七层)特性时,ambient mesh 会部署 waypoint proxy,并把 ztunnel 连接到 waypoint proxy 以为流量应用(七层)策略
Ambient mesh 使用 HTTP CONNECT over mTLS 来实现其安全隧道,并在流量路径中插入 waypoint proxy,我们把这种模式称为 HBONE(HTTP-Based Overlay Network Environment)。HBONE 提供了比 TLS 本身更干净的流量封装,同时实现了与通用负载平衡器基础设施的互操作性。Ambient mesh 将默认使用 FIPS 构建,以满足合规性需求。关于 HBONE 的更多细节,其基于标准的方法,以及 UDP 和其他非 TCP 协议的计划,将在未来的博客中介绍。
在一个 mesh 中 中混合部署 sidecar 和 ambient 模式并不会对系统的能力或安全带来限制。无论用户选择何种部署模式,Istio 控制平面都将确保策略的正确执行。Ambient 只是引入了一个具有更好人体工程学和更灵活的选项而已。
Ambient mesh 采用一个部署在本地节点上的共享 ztunnel 代理来处理 mesh 的零信任方面,而 L7 的处理则交给了独立部署 的 waypoint proxy pod。 为何要这么麻烦地将流量从 ztunnel 转接到 waypoint proxy,而不是直接在节点上使用一个共享的完整 L7 代理呢?主要有几个原因:
在 ambient mesh 中,一个 waypoint proxy 与它所服务的工作负载不一定在同一个节点上。看上去这可能是一个性能问题,但我们认为,该模式中的网络延迟最终将与 Istio 目前的 sidecar 实现差不多。我们将在专门的性能博文中讨论这个话题,但现在我们可以总结出两点:
总的来说,我们认为对大多数用户而言,ambient mesh 具有有更少和更可预测的资源需求。ztunnel 有限的功能允许其作为一个共享资源部署在节点上,这将显著减少大多数用户为每个工作负荷所需的保留资源。此外,由于 waypoint proxy 是普通的 Kubernetes pods,我们可以根据其服务的工作负载的实时流量需求对其进行动态部署和扩展。
另一方面,我们需要根据最坏情况为每个工作负载的 sidecar proxy 预留内存和CPU。进行这些计算是很复杂的,很难计算出一个非常准确的数值,所以在实践中,管理员倾向于为 sidecar 过度配置。sidecar 的高额资源预留会导致其他工作负载无法被调度,从而导致节点利用率不足。Ambient mesh 的每节点的 ztunnel 代理的固定开销较低,其 waypoint proxy 则可以动态伸缩,因此需要的资源预留总体上要少得多,从而使集群的资源利用效率更高。
随着一个彻底的新架构的出现,自然会有关于安全的问题。这篇关于 ambient 安全的博文对此做了深入的讨论,我们这里总结下面几点:
绝对不是。虽然我们认为 ambient mesh 将是许多网格用户未来的最佳选择,但对于那些需要专用数据平面资源的场景,例如合规要求或性能调优,sidecar 仍然是一个不错的选择。Istio 将继续支持 sidecar,而且重要的是,Istio 支持 sidecar 与 ambient mesh 无缝互通。事实上,我们今天发布的 ambient mesh 代码已经支持与基于 sidecar 的 Istio 进行互操作。
请看一个简短的视频,Christian 运行了 Istio ambient mesh 的相关组件,并演示 ambient mesh 的一些功能。
我们今天发布的是 Istio ambient mesh 的早期版本,目前 ambient mesh 仍处于活跃的开发之中。我们很高兴能在更广泛的社区进行分享,并期待有更多人参与 ambien mesh 的相关工作,以帮助其在 2023 年进入生产就绪。
我们期待通过你的反馈来帮助建造 ambient mesh 这个解决方案。你可以在 Istio 实验版中下载和试用 ambient mesh。在 README 中有一份目前缺失的功能和工作项目的清单。请尝试使用 ambient mesh,并告知我们你的想法!