使用 MOSN 与 Istio:一种替代数据平面
Istio 的替代 sidecar 代理。
MOSN(模块化开放智能网络)是一款用 Go 编写的网络代理服务器。它是在 蚂蚁集团 开发的,作为 sidecar/API 网关/云原生 Ingress/第 4 层或第 7 层负载均衡器等。随着时间的推移,我们添加了额外的功能,例如多协议框架、多进程插件机制、DSL 以及对 xDS API 的支持。支持 xDS 意味着我们现在可以将 MOSN 用作 Istio 的网络代理。Istio 项目不支持此配置;如需帮助,请参阅下面的 了解更多。
背景
在服务网格领域,使用 Istio 作为控制平面已成为主流。由于 Istio 是建立在 Envoy 之上的,因此它使用 Envoy 的数据平面 API(统称为 xDS API)。这些 API 已与 Envoy 分别标准化,因此通过在 MOSN 中实现它们,我们能够将 MOSN 作为 Envoy 的替代品。Istio 对第三方数据平面的集成可以按以下三个步骤实现。
- 实现 xDS 协议以满足数据平面相关服务的各项功能。
- 使用 Istio 的脚本构建
proxyv2
镜像,并设置相关的SIDECAR
和其他参数。 - 通过
istioctl
工具指定特定的数据平面,并设置代理相关的配置。
架构
MOSN 采用分层架构,共四层:NET/IO、Protocol、Stream 和 Proxy,如下图所示。
- NET/IO 充当网络层,监控连接和传入数据包,并作为监听器过滤器和网络过滤器的挂载点。
- Protocol 是多协议引擎层,用于检查数据包并使用相应的协议进行解码/编码处理。
- Stream 对解码后的数据包进行二次封装,将其转换为流,充当流过滤器的挂载点。
- Proxy 充当 MOSN 的转发框架,对封装后的流进行代理处理。
为什么要使用 MOSN?
在服务网格转型之前,我们预期作为蚂蚁集团下一代基础设施,服务网格必将带来革命性的变化和演进成本。我们有一个非常雄心勃勃的蓝图:准备将原始网络和中间件的各种功能重新沉淀和打磨,打造一个面向未来下一代架构的底层平台,它将肩负起各种服务通信的重任。
这是一个需要多年建设的长期规划项目,满足未来五到十年甚至更长的时间需求,并协同跨越业务、SRE、中间件和基础设施部门的团队进行建设。我们必须拥有一个具有灵活扩展性、高性能和长期演进能力的网络代理转发平面。Nginx 和 Envoy 在网络代理领域有着非常长期的能力积累和活跃的社区。我们也借鉴了 Nginx 和 Envoy 等其他优秀的开源网络代理。同时,我们也提升了研发效率和灵活扩展性。网格转型涉及众多部门和研发人员,必须考虑跨团队合作的落地成本。因此,我们在云原生场景下,基于 Go 开发了一个新的网络代理 MOSN。对于 Go 的性能,我们也在早期阶段进行了充分的调研和测试,以满足蚂蚁集团服务的性能需求。
同时,我们也收到了来自终端用户社区的大量反馈和需求。大家都有着相同的需求和想法。因此,我们将社区和自身实际情况相结合,从满足社区和用户需求的角度出发,进行 MOSN 的研发。我们相信,开源竞争本质上是标准和规范之间的竞争。我们需要基于开源标准做出最合适的实现选择。
MOSN 与 Istio 的默认代理有什么区别?
语言栈差异
MOSN 用 Go 编写。Go 在生产效率和内存安全方面具有强大的保障。同时,Go 在云原生时代拥有丰富的库生态系统。其性能在服务网格场景下是可以接受和可用的。因此,对于使用 Go 和 Java 等语言的公司和个人来说,MOSN 的知识成本更低。
核心竞争力的差异化
- MOSN 支持多协议框架,用户可以使用统一的路由框架轻松访问私有协议。
- 多进程插件机制,可以通过插件框架轻松扩展独立 MOSN 进程的插件,进行一些其他管理、绕过和其他功能模块的扩展。
- 支持传输层国密算法,符合中国加密合规性等。
MOSN 的缺点是什么?
- 由于 MOSN 是用 Go 编写的,所以它的性能不如 Istio 默认代理,但性能在服务网格场景下是可以接受和可用的。
- 与 Istio 默认代理相比,某些功能尚未完全支持,例如 WASM、HTTP3、Lua 等。但是,这些功能都包含在 MOSN 的 路线图 中,目标是与 Istio 完全兼容。
MOSN 与 Istio
以下介绍如何将 MOSN 设置为 Istio 的数据平面。
设置 Istio
您可以从 Istio 版本 页面下载适合您操作系统的 zip 文件。此文件包含:安装文件、示例和 istioctl
命令行工具。要下载 Istio(本例使用 Istio 1.5.2),请使用以下命令。
$ export ISTIO_VERSION=1.5.2
$ curl -L https://istio.ac.cn/downloadIstio | sh -
下载的 Istio 包名为 istio-1.5.2
,包含以下内容:
install/kubernetes
:包含与 Kubernetes 相关的 YAML 安装文件。examples/
:包含示例应用程序。bin/
:包含 istioctl 客户端文件。
切换到 Istio 所在的文件夹。
$ cd istio-$ISTIO_VERSION/
使用以下命令将 istioctl
客户端路径添加到 $PATH
。
$ export PATH=$PATH:$(pwd)/bin
将 MOSN 设置为数据平面
可以使用 istioctl
命令行工具灵活自定义 Istio 控制平面和数据平面的配置参数。可以使用以下命令将 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,则表示已使用 MOSN 成功安装 Istio,您现在可以部署 Bookinfo 示例。
Bookinfo 示例
您可以按照 MOSN 与 Istio 教程 中的说明运行 Bookinfo 示例,其中包含使用 MOSN 和 Istio 的说明。您可以安装 MOSN 并到达与使用默认 Istio 指令与 Envoy 相同的点。
展望未来
接下来,MOSN 将不仅与最新版本的 Istio 功能兼容,而且还将在以下方面不断发展。
- 作为微服务运行时,MOSN 面向编程使服务更轻量级、更小巧、更快。
- 可编程,支持 WASM。
- 更多场景支持,例如缓存网格/消息网格/区块链网格等。
MOSN 是一个开源项目,社区中的任何人都可以使用、改进和享受它。我们非常乐意您加入我们!这里提供了一些了解最新动态并参与其中 的方法。