本文内容整理自 5 月 25 日 在 Kubernetes & Cloud Native Meetup 上海站发表的主题演讲,主要介绍了 Service Mesh 最新的产品动态,分析其发展趋势和未来走向;结合蚂蚁金服的上云实践,阐述在云原生背景下 Service Mesh 的核心价值,以及对云原生落地的关键作用。
内容主要有三个部分:
Service Mesh 产品动态:介绍最近半年 Service Mesh 的产品动态,包括开源项目和云厂商推出的云上服务;
Service Mesh 发展趋势:根据最近的产品动态,总结 Service Mesh 的发展趋势,推断未来的走向;
Service Mesh 与云原生:结合云原生,更好的理解 Service Mesh 的价值和作用。
Service Mesh 产品动态
Istio 1.1 发布
Istio 是目前 Service Mesh 社区最引人注目的开源项目,在今年的 3 月份 发布了期待已久的 Istio 1.1 版本,我们来看看 Istio 最近几个版本的发布情况:
2018 年 6 月 1 日,Istio 发布了 0.8 版本,这是 Istio 历史上第一个 LTS 版本,也是 Istio 历史上变动最大的一个版本;
2018 年 7 月 31 日,Istio 发布了 1.0 版本,号称 “Product Ready”;
然后就是漫长的等待,Istio 1.0 系列以每个月一个小版本的方式一路发布了 1.0.1 到 1.0.6,然后才开始 1.1.0 snapshot 1 到 6,再 1.1.0-rc 1 到 6,终于在 2019 年 3 月 20 日 发布了 1.1 版本,号称 “Enterprise Ready”。
从 Istio 1.0 到 Istio 1.1,中间的时间跨度高达 9 个月!我们来看看经过这漫长的开发时间才发布的 Istio 1.1 版本带来了哪些新的东西:
图中标红的部分,涉及到 Istio 的架构调整,下面将详细介绍 Istio 1.1 版本中带来的架构变化。
Istio 1.1 架构变化
下图是 Istio 1.0 和 Istio 1.1 的架构图对比:
Istio 1.1 的第一个架构变化来自 Galley:在 Istio 1.1 的架构图中增加了 Galley 组件。但是实际上在 Istio 1.0 版本中 Gallay 组件就已经存在,只是当时 Galley 的功能非常简单,只是做配置更新之后的验证(Validation),在 Istio 1.0 的架构图中都没有出现。而在 Istio 1.1 版本之后,Galley 的定位发生了巨大的变化:Galley 开始分担 Pilot/Mixer 的职责。
在 Istio 1.1 版本之前的设计中,Istio 的三大组件 Pilot/Mixer/Citadel 都需要访问 Kubernetes 的 API Server,以获取服务注册信息和配置信息,包括 Kubernetes 原生资源如 service/deployment/pod 等,还有 Istio 的自定义资源(数量多达 50 多个的 CRD) 。这个设计导致 Istio 的各个组件都不得不和 Kubernetes 的 API Server 产生强绑定,不仅仅代码大量冗余,而且在测试中也因为需要和 Kubernetes 的 API Server 交互导致 Pilot/Mixer 模块测试困难。
为了解决这个问题,在 Istio 1.1 之后,访问 Kubernetes 的 API Server 的工作将逐渐交给 Galley 组件,而其他组件如 Pilot/Mixer 就会和 Kubernetes 解耦。
这个工作还在进行中,目前 Istio 的 CRD 已经修改为由 Galley 读取,而 K8s 的原生资源(Service / Deployment / Pod 等),暂时还是由 Pilot 读取。
为了方便在各个组件中同步数据,Istio 引入了 MCP(Mesh Configuration Protocol)协议。在 Istio 1.1 版本中,Pilot 通过 MCP 协议从 Galley 同步数据。MCP 是受 xDS v2 协议(准确说是 aDS)的启发而制定的新协议,用于在 Istio 各模块之间同步数据。
Istio 1.1 的第二个架构变化来自于 Mixer,在 Istio 1.1 版本中,推荐使用 Out-of-Process Adapter,即进程外适配器。Istio 预计下一个版本将弃用 In-Proxy Adapter,目前所有的 Adapter 都将改为 Out-of-Process adapter。
什么是 In-Proxy Adapter?下图是 Mixer 的架构图,在 Istio 的设计中,Mixer 是一个独立进程,Proxy 通过远程调用来和 Mixer 交互。而 Mixer 的实现了 Adapter 模式,定义了 Adapter API,然后内建了数量非常多的各种 Adapter。这些 Adatper 的代码存放在 Mixer 代码中,运行时也在 Mixer 的进程内,因此称为 In-Process Adapter。
In-Process Adapter 的问题在于所有的 Adapter 的实现都和 Mixer 直接绑定,包括代码和运行时。因此当 Adapter 需要更新时就需要更新整个 Mixer,任意一个 Adapter 的实现出现问题也会影响整个 Mixer,而且数量众多的 Adapter 也带来了数量众多的 CRD。为此,Istio 1.1 版本中通过引入 Out-of-Process Adapter 来解决这个问题。
Out-of-Process Adapter 以独立进程的方式运行在 Mixer 进程之外,因此 Out-of-Process Adapter 的开发/部署和配置都可以独立于 Mixer,从而将 Mixer 从 Adaper 的实现细节中解脱出来。
但是,Out-of-Process Adapter 的引入,会导致新的性能问题:原来 Mixer 和 In-Process Adapter 之间是方法调用,现在改成 Out-of-Process Adapter 之后就变成远程调用了。而 Mixer 一直以来都是 Istio 架构设计中最大的争议,之前 Proxy 和 Mixer 之间的远程调用,已经造成非常大的性能瓶颈,而引入 Out-of-Process Adapter 之后远程调用会从一次会变成多次(每个配置生效的 Out-of-Process Adapter 就意味着一次远程调用),这会让性能雪上加霜。
总结 Out-of-Process Adapter 的引入:架构更加的优雅,性能更加的糟糕。
在 Istio 1.1 为了架构而不顾性能的同时,Istio 内部也有其他的声音传出,如正在规划中的 Mixer v2。这个规划最重要的决策就是放弃 Mixer 独立进程的想法,改为将 Mixer 的功能合并到 Envoy 中,从而避免 Envoy 和 Mixer 之间远程调用的开销。关于 Mixer 的性能问题和 Mixer 合并的思路,蚂蚁金服在去年六月份开始 SOFAMesh 项目时就有清晰的认识和计划,时隔一年,终于欣喜的看到 Istio 开始正视 Mixer 的架构设计问题并回到正确的方向上。
目前 Mixer v2 的规划还处于 Review 状态,实现方式尚未有明确决定。如果要合并 Mixer,考虑到目前 Mixer 是基于 Golang 编写,而 Envoy 是基于 C++,这意味着需要用 C++ 重写所有的 Adapter,工作量巨大,恐怕不是短期之内能够完成的。当然也有另外一个新颖(或者说脑洞大开)的思路:引入 Web Assembly(WASM)。目前 Envoy 在进行支持 Web Assembly 的尝试,如果成功,则通过 Web Assembly 的方式来支持 Mixer Adapter 不失为一个好选择。
其他社区产品动态
最近,CNCF 在筹建 Universal Data Plane API (UDPA/通用数据平面 API)工作组,以制定数据平面的标准 API,为 L4/L7 数据平面配置提供事实上的标准。Universal Data Plane API 的创意来自 Envoy,实现为 xDS API。而目前 xDS v2 API 已经是数据平面 API 的事实标准,这次的 UDPA 会以 xDS v2 API 为基础。工作组的初始成员来自包括 Envoy 和 gRPC 项目的代表,蚂蚁金服也在积极参与 UDPA 工作组,目前还处于非常早期的筹备阶段。
Linkerd2 在 2019 年 4 月 17 日 发布了最新的稳定版本 Linkerd 2.3 版本。Linkerd2 是目前开源产品中唯一正面对抗 Istio 的存在,不过在国内知名度不高,使用者也很少。比较有意思的是,开发 Linkerd2 的初创公司 Buoyant 最近的 B 轮融资来自 Google 的投资部门。
云厂商的产品动态
随着 Service Mesh 技术的发展,和各方对 Service Mesh 前景的看好,各大主流云提供商都开始在 Service Mesh 技术上发力。
首先看 AWS,在 2019 年 4 月,AWS 宣布 App Mesh GA。App Mesh 是 AWS 推出的 AWS 原生服务网格,与 AWS 完全集成,包括:
网络(AWS cloud map)
计算(Amazon EC2 和 AWS Fargate)
编排工具(AWS EKS,Amazon ECS 和 EC2 上客户管理的 k8s)
App Mesh 的数据平面采用 Envoy,产品非常有创意的同时支持 VM 和容器,支持多种产品形态,如上图所示。(AWS App Mesh 的更多详细内容,请浏览文章用 AWS App Mesh 重新定义应用通讯 [5])
Google 的打法则是围绕 Istio 。首先是在 2018 年底推出了 Istio on GKE,即"一键集成 Istio",并提供遥测、日志、负载均衡、路由和 mTLS 安全能力。接着 Google 又推出 Google Cloud Service Mesh,这是 Istio 的完全托管版本,不仅仅提供 Istio 开源版本的完整特性,还集成了 Google Cloud 上的重要产品 Stackdriver 。
近期,Google 推出 Traffic Director 的 beta 测试版本,Traffic Director 是完全托管的服务网格流量控制平面,支持全局负载均衡,适用于虚拟机和容器,提供混合云和多云支持、集中式健康检查和流量控制,还有一个非常特别的特性:支持基于流量的自动伸缩。
(Google Traffic Director 的详细介绍,请查看文章 Google Traffic Director 详细介绍 [6])
微软则推出了 Service Fabric Mesh。Azure Service Fabric 是 Microsoft 的微服务框架,设计用于公共云,内部部署以及混合和多云架构。而 Service Fabric Mesh 是 Azure 完全托管的产品,在 2018 年 8 月 推出预览版。
上周(5 月 21 号)最新消息,微软在 KubeConf 上推出 Service Mesh Interface。SMI 是在 Kubernetes 上运行服务网格的规范,定义了由各种供应商实现的通用标准,使得最终用户的标准化和服务网格供应商的创新可以两全其美,SMI 预期将为 Service Mesh 带来了灵活性和互通性。
SMI 是一个开放项目,由微软、Linkerd、HashiCorp、Solo、Kinvolk 和 Weaveworks 联合启动;并得到了 Aspen Mesh、Canonical、Docker、Pivotal、Rancher、Red Hat 和 VMware 的支持。
评论