https://bbs.huaweicloud.com/blogs/400901

Istio 数据面新模式 —Ambient Mesh-云社区-华为云

作者简介:姚增增 / 华为云容器技术专家

如果说在以Kubernetes为基础构建起的云原生世界里,哪种设计模式最为经典,Sidecar模式无疑是其中最有力的竞争者。当需要为应用提供与自身逻辑无关的辅助功能时,在应用Pod内注入对应功能的Sidecar显然是最Kubernetes Native的方式,而Istio则是这种模式的代表。

Istio项目的愿景是以尽量透明的方式,解决微服务场景下,服务间的连接、安全以及可观测性问题。主要实现手段则是通过在应用旁部署一个Proxy,在Kubernetes场景下则为应用Pod注入Sidecar,拦截应用流量至Sidecar。Sidecar根据从Istio控制面获取的用户配置对应用流量进行处理,以一种对应用代码几乎无侵入的方式实现了服务治理。

虽然Istio 并不局限于仅支持Kubernetes平台,但是Istio的设计理念与Kubernetes的Sidecar模式有着天然的亲和性。基于Sidecar模式,Istio能够实现在Kubernetes平台上的快速开发、部署、验证。同时,在功能层面,Isito将服务治理功能从应用代码中剥离,作为基础设施下沉至Sidecar,抽象出了事实上的云原生应用网络层,极大地减轻了应用开发者的心智负担,这部分能力刚好也是Kubernetes生态一直以来缺失的。基于Istio对于Kubernetes生态的完美补充,随着Kubernetes的大规模普及,Istio 数据面新模式 —Ambient MeshIstio也实现了对用户心智以及市场的快速抢占。

虽然以Sidecar模式部署Istio数据面似乎是一个理所应当,让人无法拒绝的选择,但是需要强调的是,Istio完整功能的实现并不与Sidecar模式强绑定,我们还有各种各样其他的选择。另1外,随着对于Istio使用程度不断加深,落地规模不断扩大,可以发现以Sidecar模式部署Istio数据面诸多挑战:

**1. 侵入性:**Istio基本实现了对应用代码的零侵入,但是由于Sidecar的注入需要更改Pod Spec并且对应用流量进行重定向,因此应用接入网格时需要重启Pod,而应用容器与Sidecar容器的启动顺序不确定造成的冲突也可能导致应用中断;

2. 生命周期绑定: Sidecar本质上是基础设施,它和应用的生命周期往往不一致,因此升级Sidecar时也需要对应用Pod进行重启,同样可能导致应用中断,而对于Job类应用,Sidecar的存在则会导致Pod无法被及时清理;

**3. 资源利用率低:**Sidecar为单个应用Pod独占,应用的流量存在波峰波谷,而一般情况下Sidecar的内存占用与集群规模(Service数目,Pod数目)强相关,因此需要按照极端情况预留资源,导致集群整体的资源利用率低。同时由于需要为每个Pod注 入Sidecar,随着集群规模的不断扩大,Sidecar占用的资源总量也会线性上涨。

针对Sidecar部署模式的缺陷,Google和Solo.io联合推出了一种新的Sidecar-less部署模式 --- Ambient Mesh。

架构介绍

Ambient Mesh的控制面与原先Sidecar模式的Istio相比基本没有变化,数据面的组件构成以及各个组件的作用如下:

**1. istio-cni:**必装组件,以DaemonSet的形式部署。其实istio-cni并不是Ambient Mesh的新增组件,在原先的Sidecar模式中就已经存在,当时主要用于替代istio-init这 个Init Container配置流量拦截规则,同时规避istio-init引发的安全问题。Ambient Mesh对它进行了扩展,以必装组件的形式部署,负责配置流量转发规则,劫持本节点中已加入Ambient Mesh的Pods的应用流量,转发至本节点的ztunnel;

**2. ztunnel:**必装组件,以DaemonSet的形式部署。ztunnel对所在节点Pods的流量进行代理,主要负责L4流量的处理、L4的遥测以及服务间mTLS(双向认证)的管理。最初ztunnel基于Envoy实现,但是考虑到对ztunnel功能的有意约束以及对安全性、资源占用率的要求,社区已经用rust从零构建该组件;

**3. waypoint:**按需配置,以Deployment的形式部署。waypoint负责处理HTTP,故障注入等L7功能。以负载或者Namespace粒度进行部署,在Kubernetes中,一个Service Account或者一个Namespace对应生成一个waypoint的Deployment,用于处理发往对应负载的七层流量,同时waypoint实例数可以根据流量动态伸缩。

下面以Ambient Mesh数据面实际的处理过程来展示上述各个组件在其中扮演的具体角色: