在 Istio 中使用 MOSN:另一个数据平面
用于边缘或服务网格的云原生代理
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 的第三方数据平面集成可以通过以下三个步骤实现:
- 实现 xDS 协议,对齐数据面相关服务治理能力;
- 使用 Istio 的脚本并设置相关
SIDECAR
等参数构建proxyv2
镜像; - 通过 istioctl 工具并设置 proxy 相关配置指定具体的数据面;
MOSN 架构
MOSN 是一个分层的体系结构,其系统分为 NET/IO、Protocol、Stream、Proxy 四层,如下图所示:
- NET/IO 作为网络层,监测连接和数据包的到来,同时作为 listener filter 和 network filter 的挂载点;
- Protocol 作为多协议引擎层,对数据包进行检测,并使用对应协议做 decode/encode 处理;
- Stream 对 decode 的数据包做二次封装为 stream,作为 stream filter 的挂载点;
- Proxy 作为 MOSN 的转发框架,对封装的 stream 做 proxy 处理;
为什么要使用 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 进程的插件,做一些其他管理,旁路等的功能模块扩展;
- 具备中国密码合规的传输层国密算法支持;
MOSN 的不足
- 由于 MOSN 是用 GoLang 编写的,因此它的性能不如 Istio 的默认代理(默认代理使用的是 C++ 语言),但是在服务网格场景中该性能是可以接受的并且可以使用;
- 与 Istio 默认代理相比,不完全支持某些功能,例如 WASM、HTTP3、Lua 等。但是,这些功能在 MOSN 的 roadmap 计划之中,我们的目标是和 Istio 完全兼容;
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
,包含:
install/kubernetesi
:包含 Kubernetes 相关的 YAML 安装文件;examples/
:包含示例应用程序;bin/
:包含 istioctl 的客户端文件;
切换到 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 编程的服务更轻、更小、更快;
- 可编程,如支持 WASM;
- 更多场景 mesh 化方案支持,缓存/消息/区块链 mesh 化等;
MOSN 是一个开源项目,社区中的任何人都可以使用,参与和改进。我们希望您能加入我们!可以通过这里介绍的几种方式了解 MOSN 正在做的事情并参与其中。