下一代网关:MSE云原生网关如何降低网关资源成本
——耿蕾蕾(如葑)
阿里云智能研发工程师
一、云原生网关的诞生背景
传统网关分为流量网关和业务网关。流量网关指提供全局性的、与后端业务无关的策略配置,比如 Nginx 就是流量网关。业务网关是指提供独立于业务域级的、与后端业务紧耦合的策略配置。随着分布式微服务的演进,业务网关又衍生出了新的分类——微服务网关,比如典型的 Spring Cloud Gateway。
在容器技术与 k8s 主导的云原生时代,下一代的网关模式是否仍然会遵循当前的分类方式?
下一代网关的产品画像具有以下几个特点:
第一,云原生。在 K8s 的浪潮下,云原生已经成为了主流的软件开发形态。因此下一代的网关产品最核心的特征就是要符合云原生,即:要支持 K8s Ingress、Gateway API 以及架构开源,防止厂商锁定。
第二,高集成。能够为用户提供一站式的安全认证、流量调度以及服务治理、可观测的能力,降低用户的使用成本。
第三,高扩展。指允许用户使用插件化的方式动态扩展网关的能力,降低用户自定义的扩展门槛。
第四,高性能。应该采用软硬结合的方式进一步提高网关的性能,降低用户的资源成本。
第五,高可用。在业务侧要提供丰富的熔断、限流、降级的能力,同时对于网关自身要提升服务的可在线率,持续为用户提供服务。
传统的网关非常典型的用法是:用户的南北向流量先进入流量网关,流量网关做完安全防护以及全局调度后,会将流量进一步分发到微服务网关,微服务网关进一步做东西向的流量调度以及更细粒度的服务治理。
随着 K8S 的普及,我们认为下一代的云原生网关应该不存在流量网关与微服务网关的明显区别,两者会走向融合的状态。外部的流量通过网关即可提供东西向和南北向的流量调度,以及安全防护与服务治理痊愈的能力。
以上即下一代网关的形态,我们称之为“云原生网关”。MSE 与云原生网关的产品定位是将传统的流量网关与微服务网关做了二合一,同时通过硬件加速、内核调优等手段,在性能不打折的情况下,用户的资源部署成本能够直降50%。
上图可见,从 2019 年的报告里可以看到,在 Ingress Providers 进行技术选型的时候,排名第一位是 Nginx, 第二名是 HAProxy, 第三名 Envoy。其中 Envoy 增速对快,直至2020年,排名跃至第二位。
K8s 里的 Ingress 仅仅是一种资源声明,并没有具体的实现。而 Ingress Providers 就是它的具体实现,这些实现由各个厂商自己对 K8s 标准的Ingress 做支持。
云原生网关的技术架构仍然使用开源的 Istio+Envoy, 符合对下一代网关产品的定义,即使用开源的技术架构以防止厂商的锁定。采用这种技术架构的云原生网关有以下几个优势:
① 网关直连业务 Pod IP,不经过传统的 Cluster IP , RT 更低。
② 支持 HTTPS 硬件卸载加速,QPS 提升80%。
③ 支持 Wasm 插件市场,插件可以支持热更新、热加载,满足用户多语言自定义插件的诉求。
④ 自研 Muti-Ingress Controller 组件,支持多集群 Inggress 复用同网关实例。即云原生网关可以关联多个 K8s 集群,同时为多个 K8s 集群去提供Ingress 的路由能力。
⑤ 原生兼容的 K8s Ingress 的标准规范,并且支持 Nginx Ingree 核心功能注解的无缝转换。
上图可见,云原生网关的 Envoy 提供了很多扩展槽,比如认证 filter 、限流 filter 、预置 filter 以及自定义 filter ,这些槽分别可动态热插拔不同的可扩展插件。此外,专门为插件市场预留了 customer filter 层,可以支持 Wasm 插件,后续也会支持 Router 插件。
云原生网关最初诞生在阿里集团内部,经过了两年时间的发展,我们认为这种新的网关形态比较符合当下云原生浪潮下大家对下一代网关的期许与产品定位,因此将它推到云上实现了商业化。
商业化之前,云原生网关已经在蚂蚁互通、钉钉云上云下互通以及优酷落地了。落地业务场景也很丰富,比如在蚂蚁的落地场景是东西向流量,使用Dubbo 3.0 的 RPC 调用;在钉钉的落地是云上云下互通,钉钉的核心数据资产在私有云,另一部分提供公共服务的业务在公有云,使用云原生网关帮助钉钉实现了云上云下互通;在优酷的落地是南北向流量,用云原生网关整合了优酷很多不同类型的网关,统一使用原生网关实现了架构的统一,并利用云原生网关的热更新能力保证配置几乎实时更新。
二、 云原生网关的产品优势
1.性能更强劲
云原生网关的 Envoy 已经支持 TLS 硬件加速,利用了 CPU 的 SIMD 机制通过 AVX-512 指令并行处理来提升 RSA/ECDSA 的性能。同时在单核的 1C2G 压测 HTTPS 的性能,可以提升约86%。 TLS 握手 RT 从 313.84 毫秒降低到 145.81 毫秒,下降幅度约一倍。结合内部 Tengine 网关的一些运维经验,对 OS 的内核参数以及 Envoy 调优, QPS 性能提升约40%。
2.功能更丰富
云原生网关的功能为上图几大块。
① 基础路由能力,比如基于 Host 、Path、 Header 做路由,比如路由的 rewrite 以及跨域能力。
② 服务治理能力。最典型的特性是它将流量网关与微服务网关做了二合一,服务治理能力有了非常大的提升。比如其中的服务发现支持 K8s 、Eureka、 DNS 以及固定 IP ,服务费灰度支持金丝雀、 A/B Test 、蓝绿以及自定义流量比例分发。
③ 安全认证,比如支持 HTTPS、 JWT 认证、 OIDC 认证、IDaaS认证、 IP 黑白名单、自定义鉴权认证以及 Waf ,后续还会支持 OPA 这个传统能力。
④ 高性能:使用了软硬件结合的方式,做了 HTTPS 硬件加速、 OS 内核调优以及 Envoy 的优化,后续还会实现基于 Gzip 的硬件加速。
⑤ 高扩展:支持了 Wasm 插件市场,并利用 Wasm 多语言能编写的能力,使用户能够使用多语言编写网关插件。同时插件是热更新的,对主程序本身的稳定性没有影响。
⑥ 高可用:结合了集团两年的大促经验,分别做了比如文件 Cache、推空防护以及过载保护。
⑦ 监控与报警:提供全栈的比如访问日志、Tracing、 Metrics 以及报警全功能的监控与报警能力。
⑧ 高集成:服务发现可以无缝对接阿里云的容器服务 ACK , Waf 对接了阿里云的外部应用防火墙,访问日志支持阿里云的日志服务 SLS 与应用实时监控服务 ARMS,Tracing 支持阿里云的链路追踪系统, Metrics 与报警支持阿里云的应用实时监控服务 ARMS,全局限流支持阿里云的应用高可用服务 AHAS 。
综上,MSE 云原生网关集成了很多企业级稳定的功能,用户可以放心使用。
3.稳定更可靠
网关作为流量入口的第一道防线,它的稳定性至关重要。稳定性主要从三个状态考量,分别是研发时、运行时和变更时。
研发时:网关侧如何做功能迭代,并在过程中保证网关的稳定性和代码的可靠性。主要通过 CI/CD 自动化的方式来保证稳,研发人员提交 code review 就会触发一系列 CI/CD 自动化检测,包括内存异常检测、多线程竞争检测、静态代码分析检测、单元域集成测试以及混沌测试等。
运行时:网关在运行时出现问题的概率非常高,而网关作为对稳定性有极高追求的软件产品,如何保证运行时的安全?MES 提供了过载保护,当 CPU 水位达到警戒水平时会发出报警。并结合弹性实现了自动伸缩功能,比如做了本地文件缓存、推空保护机制,多可用区容灾以及异常自动重启。针对运行时可能出现的问题,日常也会做故障与容灾演练、压力测试以及大盘监控与报警。
变更时:提供了配置合法性的校验以及配置变更的 Drain 机制、优雅升级以及监控报警。同时也提供灰度与回滚机制、大盘监控报警来进一步保证变更时的稳定性。
云原生网关自内部 2020 年 5 月上线依赖,已经在支付宝、钉钉、飞猪、口碑等阿里各业务系统中稳定使用。两年以来,网关的可用率为100%,无任何故障,并且通过了 2020 和 2021 双 11 海量请求的考验,大促日可轻松承载每秒数十万笔的请求,日请求量达到百亿级别。
4.无缝支持 Nginx Ingress注解转换
对于入口流量,最常用的方式是使用 K8s Ingress。云原生网关本身在兼容 K8s 标准的 Ingress 基础之上,也支持 Nginx Ingress 注解的无缝转换,即可以在 K8s 集群里编写使用了 Nginx annotation 扩展的 Ingress,云原生网关可以自动监听 Ingress 资源,同时将其中的 Nginx anotation 注解自动转换为云原生网关的能力并生效。此功能已正式上线,默认集成了容器服务的 ACK ,支持 ACK 集群内服务的一键导入和自动同步。
云原生网关自研了 Multi-Ingress Controller 组件,可以支持多个 ACK 集群复用同网关实例。这也意味着云原生网关不再仅仅局限于传统的 一个K8s 集群对应一个Ingress 网关的应用场景,而是可以支持多个 K8s 集群对应到同一个云原生网关实例的场景。
此外,云原生网关原生兼容 K8s Ingress 规范,而且能够对 Nginx Ingress的核心功能注解支持无缝转换。
5.支持 Waf 本地防护
Waf 即应用防火墙,它是公有云上对于安全防护很普遍的诉求。
传统 Waf 的防护请求链路如图上方所示:比如请求 www.example.com ,浏览器会先访问 DNS 获取到 IP ,再发起请求。通常情况下请求会先经过外部防火墙的安全防护,再转到后端的业务网关。业务网关做了流量分发后转给用户的应用。
而云原生网关内置了 WAF filter ,可以直接对接阿里云的外部应用防火墙。使用云原生网关后,用户的请求链路能够减少一跳,从 DNS 获取到 IP ,浏览器通过 IP 访问的时候会访问到 MSE 云原生网关,请求到达云原生网关后,使用内置的WAF filter 做安全防护的拦截,再将请求直接分发给用户的 App 。
相比传统的 Waf 防护,云原生网关用户的请求链路更短,全链路请求 RT 更低;用户的防护控制粒度也更细,不仅可以做到实例级别的防护,还可以做到更细粒度的路由级防护;用户的防护成本更低,可以按需控制路由级的防护。
6.支持插件市场
云原生网关使用了一套 Istiod+Envoy 的开源架构, Envoy 社区目前也在支持 wasm 插件。云原生网关将插件做成产品功能提供给用户,因此云原生网关会有插件市场,用户登录到云原生网关的控制台,即可在插件市场里选择需要使用的插件并安装。安装后,云原生网关的控制台会将插件下发到 Envoy 侧并在 customer filter 层生效,使得流量进来后可以很自然地经过此插件。
通过提供插件市场,网关的二次扩展功能均通过插件提供给用户按需使用。且插件采用热更新机制,在沙盒环境中运行,对网关自身的稳定性无影响。借助于 Webassembly 特性,用户可以使用多语言编写插件,降低用户扩展网关的门槛。此外,网关的 Wasm 插件与开源的 Envoy 100% 兼容,不存在锁定问题,即用户开发原生网关的插件,也可以应用于开源的 Envoy。后续的插件市场也会提供对 Lua 插件的支持。
7.支持 HTTP 转 Dubbo
Dubbo 作为 RPC 服务对外提供服务,而 RPC 不适合直接暴露在公网上提供南北向流量的用户请求。通常情况下,公网上的流量都会走 HTTP 或 HTTPS,接收到公网流量后,由第一层的网关做协议转换,转为 Dubbo ,再由网关将 Dubbo 的请求分发给后端的 Dubbo provider。
云原生网关也对上述典型场景提供了支持。在 Envoy 侧插入了 Dubbo 的 Transcoder filter ,由它完成 HTTP 请求到 Dubbo 请求的协议转换。第一阶段,转换功能会支持 HTTP 转 Dubbo 2.7.X 版本,并支持从 Nacos 订阅 Dubbo 注册信息。后续将支持从 Zookeeper 订阅 Dubbo 注册信息,以及支持 HTTP 转 Dubbo 3.0。
三、云原生网关的适用场景
云原生网关的适用场景分为南北向和东西向。
南北向:云原生网关可以做到全渠道接入,对接多种的用架构。它的原始请求可以来自于移动应用,可以来自于外部应用、合作伙伴以及一些内部系统。它可以支持后端服务发现的类型也有多种:
① 传统微服务场景,服务注册到 Nacos 并直接对外暴露 API 。
② 微服务通过 K8s Service 对外暴露 API 。
③ 传统 ECS 中的应用,通过固定 IP 或 DNS 对外暴露 API。
东西向:可以支持混合云、多数据中心、多业务域的互通。可以支持跨业务域的访问以及一些私有云和公有云之间互通的场景。