年终盘点服务网格:实用当先,生态为本

999 阅读10分钟

作者 | 宋净超

本文是 “2021 年度技术盘点” 系列文章之一,主要介绍服务网格在2021年的重要进展。

“2021年终技术盘点”是掘金推出的重磅企划,涵盖Serverless、Service Mesh、大前端、数据库、人工智能、低代码、边缘计算等众多技术领域。看过去,向未来,回顾IT技术在2021年的发展情况,盘点IT技术的重大事件,展望IT技术的未来趋势。同时,我们将开启第15期技术主题征文活动,一起来聊聊你眼中的2022年技术趋势吧!

前言

随着服务网格架构理念的深入人心,它的适用场景也慢慢为众人所了解,社区中也不乏争论,甚至是质疑的声音。笔者以在云原生和服务网格社区中多年的观察,将从亲历者的角度总结服务网格在 2021 年的进展。因为当前在国内 Istio 几乎是服务网格的代名词,本文也将主要从 Istio 的技术和生态层面来解读服务网格在 2021 年的发展。

服务网格:云原生的核心技术之一

作为 CNCF 定义的云原生关键技术之一,服务网格发展至今已经有五个年头了,其发展经历了以下几个时期:

  • 探索阶段:2017 年-2018 年
  • 早期采用者阶段:2019 年-2020 年
  • 大规模落地及生态发展阶段:2021 年至今

如果根据“跨越鸿沟”理论,服务网格已经跨越了“鸿沟”,处于“早期大众”和“晚期大众”阶段之间。根据《Istio 大咖说》观众中的反馈来看,用户已不再盲从于新技术,开始辩证的考虑是否真的需要引入服务网格

云原生的发展方兴未艾,虽然不断有新的技术和产品出现,但作为整个云原生技术栈的一部分,服务网格在过去一年里不断夯实了它作为“云原生网络基础设施”的定位。下图展示了云原生技术栈模型,其中每一层有一些代表性的技术来定义标准。作为新时代的中间件,服务网格与其他云原生技术交相辉映,如 Dapr(分布式应用程序运行时)定义云原生中间件的能力模型,OAM 定义云原生应用程序模型等,而服务网格定义的是云原生七层网络模型。

图:云原生技术栈

社区焦点

过去一年中,社区的焦点主要集中在以下几个方面:

  • 性能优化:服务网格在大规模应用场景下的性能问题;
  • 协议扩展:让服务网格支持任意七层网络协议;
  • 部署模式:Proxyless vs Node 模式 vs Sidecar 模式;
  • 引入 eBPF:将服务网格的部分能力下沉到内核层;

性能优化

Istio 设计之初的目标就是通过“原协议转发”的方式服务于服务间流量,让服务网格尽可能对应用程序“透明”,从而使用了 IPtables 劫持流量,根据社区提供的测试结果,对于在 16 个连接上具有 1000 RPS 的网格,Istio 1.2 仅增加了 3 毫秒的基准延迟。但是,因为 IPtables conntrack 模块所固有的问题,随着网格规模的扩大,Istio 的性能问题开始显现。关于 Istio sidecar 的资源占用及网络延迟的性能优化,社区给出了以下解决方案:

  • Sidecar 配置:通过手动或在控制平面增加一个 Operator 的方式来配置服务的依赖项,可以减少向 Sidecar 中下发的服务配置数量,从而降低数据平面的资源占用;为了更加自动和智能地配置 Sidecar,开源项目 SlimeAeraki 都给出了各自的配置懒加载方案;
  • 引入 eBPF:eBPF 可以作为优化服务网格性能的一种可行性方案,有基于 Cilium 的初创公司甚至激进的提出使用 eBPF/Cilium 完全替换 Sidecar 代理的策略,但事实上 Envoy 代理/xDS 协议已经成为服务网格实现的实际代理,且很好的支持七层协议。eBPF 可用来改善网络性能,但复杂的协议协商、解析和用户扩展在用户侧依然很难实现。

协议扩展

如何扩展 Istio 一直以来就是一个老大难的问题。Istio 的可扩展包含两方面:

  • 协议层面:让 Istio 支持所有七层协议
  • 生态层面:让 Istio 可以运行更多的插件

Istio 使用的是 Envoy 作为数据平面,扩展 Istio 本质上就是对 Envoy 功能的扩展。Istio 官方目前给出的方案是使用 WebAssembly,并在 Istio 1.12 引入 Wasm 插件配置 API 用于扩展 Istio 生态,Istio 的扩展机制使用 Proxy-Wasm 应用二进制接口(ABI)规范,提供了一套代理无关的流媒体 API 和实用功能,可以用任何有合适 SDK 的语言来实现。截至目前,Proxy-Wasm 的 SDK 有 AssemblyScript(类似 TypeScript)、C++、Rust、Zig 和 Go(使用 TinyGo WebAssembly 系统接口)。

目前 WebAssembly 扩展应用还比较少,很多企业选择自定义 CRD,基于 Istio 构建服务网格管理平面。另外,让 Istio 支持异构环境,适用于一切工作负载,如虚拟机、容器,这个对于终端用户来说也有很强的需求,因为这可以让用户很方便的从传统负载迁移应用到服务网格中。最后是多集群、多网格的混合云流量管理,这个属于比较高阶的需求了。

部署模式

在服务网格概念兴起之初就有 Per-node 和 Sidecar 模式之争,他们的代表分别是 Linkerd 和 Istio。后来 eBPF 提出将服务网格下沉的内核,从而演化出了更多的服务网格部署模式,如下图所示。

图:服务网格的部署模式

下表中详细对比了这四种部署方式,它们各有优劣,具体选择哪种根据实际情况而定。

表:服务网格的部署模式

模式内存开销安全性故障域运维
Sidecar 代理因为为每个 pod 都注入一个代理,所以开销最大。由于 sidecar 必须与工作负载一起部署,工作负载有可能绕过 sidecar。Pod 级别隔离,如果有代理出现故障,只影响到 Pod 中的工作负载。可以单独升级某个工作负载的 sidecar 而不影响其他工作负载。
节点共享代理每个节点上只有一个代理,为该节点上的所有工作负载所共享,开销小。对加密内容和私钥的管理存在安全隐患。节点级别隔离,如果共享代理升级时出现版本冲突、配置冲突或扩展不兼容等问题,则可能会影响该节点上的所有工作负载。不需要考虑注入 Sidecar 的问题。
Service Account/节点共享代理服务账户/身份下的所有工作负载都使用共享代理,开销小。工作负载和代理之间的连接的认证及安全性无法保障。节点和服务账号之间级别隔离,故障同“节点共享代理”。同“节点共享代理”。
带有微代理的共享远程代理因为为每个 pod 都注入一个微代理,开销比较大。微代理专门处理 mTLS,不负责 L7 路由,可以保障安全性。当需要应用7层策略时,工作负载实例的流量会被重定向到L7代理上,若不需要,则可以直接绕过。该L7代理可以采用共享节点代理、每个服务账户代理,或者远程代理的方式运行。同“Sidecar 代理”。

生态发展

2021 年,Istio 社区也是精彩纷呈,举办了系列的活动,还发布了系列教程:

此外还有众多与 Istio 服务网格相关的项目开源,如下表所示。

项目名称开源时间类别描述主导公司Star 数量与 Istio 的关系
Envoy2016年 9 月网络代理云原生高性能边缘/中间服务代理Lyft18700默认的数据平面
Istio2017 年 5 月服务网格连接、保护、控制和观察服务。Google29100控制平面
Linkerd22017 年 12 月服务网格适用于 Kubernetes 的轻量级服务网格。Buoyant7900服务网格的另一种实现
Emissary Gateway2018 年 2 月网关用于微服务的 Kubernetes 原生 API 网关,基于 Envoy 构建Ambassador3600
APISIX2019 年 6 月网关云原生 API 网关API78100可作为 Istio 的数据平面运行也可以单独作为网关
MOSN2019 年 12 月代理云原生边缘网关及代理蚂蚁3500可作为 Istio 数据平面
Slime2021 年 1月扩展基于 Istio 的智能服务网格管理器网易236为 Istio 增加一个管理平面
Tetrate Istio Distro2021 年 2 月工具Istio 集成和命令行管理工具Tetrate95第一个 Istio 开源发行版和多版本管理工具
Aeraki2021 年 3 月扩展管理 Istio 的任何七层负载腾讯330扩展多协议支持
Layotto2021 年 6 月运行时云原生应用运行时蚂蚁393可以作为 Istio 的数据平面
Hango Gateway2021 年 8 月网关基于 Envoy 和 Istio 构建的 API 网关网易253可与 Istio 集成

注:数据统计截止到 2022 年 1 月 6 日。

总结

回望 2021 年,我们可以看出用户对服务网格的追求更趋实用,作为云原生网络的基础设施,其地位得到进一步夯实,更重要的是服务网格生态渐起。展望 2022 年,我们有理由相信,更多的服务网格实践优秀案例出现,在生态和标准化上更进一步。

参考

作者介绍

宋净超,Tetrate 布道师,ServiceMesher 及云原生社区创始人,CNCF 大使,云原生倡导者。个人博客 jimmysong.io。

相关阅读:

年终盘点Serverless:工业、学术、社区遍地开花,国内厂商迅速卡位

年终盘点Kubernetes生态:大版本“内卷”,安全性值得重视

年终盘点大前端:前端进入深水区,面向开发者的低代码持续升温