在 Istio 中使用 MOSN:另一个数据平面

Istio 的另一个 Sidecar 代理。

Jul 29, 2020 | By 王发康 - mosn.io

MOSN(Modular Open Smart Network)是用 GoLang 编写的网络代理服务器。它是 蚂蚁集团 为 Sidecar、API Gateway、云原生 Ingress、Layer 4 或 Layer 7 负载均衡器等场景构建的。随着时间的推移,我们添加了额外的功能,例如多协议框架,多进程插件机制,DSL 和对 xDS API 的支持。支持 xDS 意味着我们现在可以将 MOSN 用作 Istio 的数据平面。Istio 项目不支持此配置。如需帮助,请参阅下面的了解更多

背景

在 Service Mesh 领域,使用 Istio 作为控制平面已成为主流。由于 Istio 的数据面默认是基于 Envoy 构建的,因此它使用了 Envoy 的数据平面 API(统称为 xDS API)。这些 API 已与 Envoy 分开并进行了标准化,因此,通过在 MOSN 中实现它们,我们就可以使用 MOSN 替代 Envoy。Istio 的第三方数据平面集成可以通过以下三个步骤实现:

MOSN 架构

MOSN 是一个分层的体系结构,其系统分为 NET/IO、Protocol、Stream、Proxy 四层,如下图所示:

MOSN 架构图
MOSN 架构图

为什么要使用 MOSN ?

蚂蚁集团在进行 Mesh 改造前,已经预料到作为下一代蚂蚁集团的基础架构,Mesh 化势必带来革命性的变革以及演进成本,我们有非常宏大的蓝图:准备将原有的网络和中间件方面的各种能力重新沉淀和打磨,打造成为未来新一代架构的底层平台,承载各种服务通讯的职责。

这是一个需要多年时间打造,满足未来五年乃至十年需求的长期规划项目,合作共建团队跨业务、SRE、中间件、基础架构等部门。我们必须有一个具备灵活扩展、高性能、满足长期演进的网络代理转发平面。Nginx、Envoy 在网络代理领域有非常长期的能力积累和活跃的社区,我们也同时借鉴了 Nginx、Envoy 等其他优秀的开源网络代理,同时在研发效率、灵活扩展等方面进行了加强,同时整个 Mesh 改造涉及到非常多的部门和研发人员,必须考虑到跨团队合作的落地成本,所以我们基于 GoLang 自研了云原生场景下的新型网络代理 MOSN。对于 GoLang 的性能,我们前期也做了充分的调研和测试,满足蚂蚁集团业务对性能的要求。

同时我们从社区用户方面收到了很多的反馈和需求,大家有同样的需求以及思考,所以我们结合社区与自身的实际情况,从满足社区以及用户角度出发进行了 MOSN 的研发工作,我们认为开源的竞争主要是标准与规范的竞争,我们需要基于开源标准做最适合自身的实现选择。

MOSN 和 Istio 默认的 Proxy 的不同点是什么?

语言栈的不同

MOSN 使用 GoLang 语言编写,GoLang 语言在生产效率,内存安全上有比较强的保障,同时 GoLang 在云原生时代有广泛的库生态系统,性能在 Mesh 场景下我们评估以及实践是可以接受的。另外 MOSN 对于使用 GoLang、Java 等语言的公司和个人的心智成本更低。

核心能力的差异化

MOSN 的不足

MOSN 结合 Istio

下面介绍如何将 MOSN 设置为 Istio 的数据平面。

安装 Istio

您可以在 Istio release 页面下载与您操作系统匹配的压缩文件,该文件中包含:安装文件、示例和 istioctl 命令行工具。使用如下命令来下载 Istio(本文示例使用的是 Istio 1.5.2):

$ export ISTIO_VERSION=1.5.2 && curl -L https://istio.io/downloadIstio | sh -

下载的 Istio 包名为 istio-1.5.2,包含:

切换到 Istio 包所在目录:

$ cd istio-$ISTIO_VERSION/

使用如下命令将 istioctl 客户端路径加入 $PATH 中:

$ export PATH=$PATH:$(pwd)/bin

截止目前,我们已经可以通过 istioctl 命令行工具来灵活的自定义 Istio 控制平面和数据平面配置参数。

设置 MOSN 作为 Istio 的 Sidecar

通过 istioctl 命令的参数指定 MOSN 作为 Istio 中的数据面:

$ istioctl manifest apply  --set .values.global.proxy.image="mosnio/proxyv2:1.5.2-mosn"   --set meshConfig.defaultConfig.binaryPath="/usr/local/bin/mosn"

检查 Istio 相关 pod 服务是否部署成功:

$ kubectl get svc -n istio-system

如果服务状态 STATUS 为 Running,则表示 Istio 已经成功安装,后面就可以部署 Bookinfo 示例了。

Bookinfo 示例

可以通过 MOSN with Istio 的教程来进行 Bookinfo 示例的演示操作,另外在该教程中您也可以找到更多关于使用 MOSN 和 Istio 的说明。

展望

接下来,MOSN 不仅会持续兼容适配新版本的 Istio 的功能,而且还将在以下几个方面进行发展:

MOSN 是一个开源项目,社区中的任何人都可以使用,参与和改进。我们希望您能加入我们!可以通过这里介绍的几种方式了解 MOSN 正在做的事情并参与其中。

了解更多