为了避免混淆,我们先对一些关键定义做一些厘清:传统网关:未作容器化改造,未启用K8s,通过流量网关与业务网关两层网关来构建,流量网关提供全局性的、与后端业务无关的策略配置,例如Tengine就是典型的流量网关;业务网关提供独立业务域级别的、与后端业务紧耦合策略配置,随着应用架构模式从单体演进到现在的分布式微服务,业务网关也有了新的叫法微服务网关。K8s网关:即云原生网关,也被称为下一代网关,Ingress成为K8s生态的网关标准,促使流量网关和业务网关,合二为一。基于Ingress规范的实现主要分为基于Nginx和基于Envoy两大阵营,基于Nginx的NginxIngressController是目前大多数K8s集群的选择,基于Envoy的实现作为后起之秀,大有赶超之势。MSE云原生网关:是基于Envoy,做了深度优化的云上服务。 本文将从性能和成本、可靠性、安全性3方面,对两大开源实现进行比对,希望对正在做K8s网关选型的企业有所借鉴。性能和成本 MSE云原生网关的吞吐性能几乎是NginxIngressController的一倍,尤其是传输小文本时性能优势会更明显,如下图所示,网关CPU使用率达到30时的吞吐对比: 网关规格:16核32G4节点 ECS型号:ecs。c7。8xlarge 当CPU负载升高时,吞吐差距会更加明显,下图是CPU使用率达到70时的情况: 高负载下NginxIngressController吞吐下降原因是出现了pod重启,详情见下一节可靠性中的分析。 随着网络安全愈加受重视,现在互联网上已经普遍使用HTTPS进行传输加密,在网关侧,用于实现HTTPS的TLS非对称加密算法是占用CPU资源的大头。针对此场景,MSE云原生网关使用了CPUSIMD技术实现了TLS加解密算法的硬件加速: 从上图压测数据可以看出使用TLS硬件加速后,相比普通HTTPS请求TLS握手时延降低一倍,极限QPS提升80以上。 基于以上数据,使用MSE云原生网关,只需一半的资源,就能达到NginxIngressController的吞吐,在做过硬件加速优化的HTTPS场景下,吞吐还能进一步提升。可靠性 前文提到高负载下,NginxIngressController会出现pod重启导致吞吐下降,导致pod重启的原因主要有2点:存活健康检查(livenessProbe)在高负载时容易超时失败,社区在0。34版本通过减少冗余检测进行了一定的优化,但问题仍然存在。在开启了prometheus采集监控指标的情况下,高负载时会出现OOM,导致容器被kill,详细原因见相关issue:https:github。comkubernetesingressnginxpull8397 这两个问题,本质上皆是由于NginxIngressController的部署架构不合理导致。其控制面(Go实现的Controller)和数据面(Nginx)进程混跑在一个容器内,高负载下,数据面进程和控制面进程出现了CPU抢占。其中控制面进程负责了健康检查和监控指标采集,因为没有足够的CPU导致请求积压引起OOM以及健康检查超时。 这种情况是极危险的,会在高负载下引发网关的雪崩效应,对业务造成严重影响。MSE云原生网关使用了数据面和控制面隔离的架构,在架构上具备可靠性优势: 从上图可以看到,MSE云原生网关并不部署在用户的K8s集群中,而是纯托管的模式,这种模式在可靠性上还有更多优势:不会与业务容器混跑在一个ECS节点上网关的多个实例不会混跑在一个ECS节点上提供网关可用性的SLA保障 如果使用NginxIngressController要实现高可靠部署,一般需要独占ECS节点,同时还需要部署多个ECS节点,来避免单点故障,这种情况下资源成本会直线上升。此外,NginxIngressController因为部署在用户集群中,也无法提供网关可用性的SLA保障。安全性 NginxIngressController的不同版本都还存在着一些CVE漏洞隐患,具体影响版本见下表: 从NginxIngressController迁移到MSE云原生网关后,将一次性修复所有CVE漏洞隐患;并且,MSE云原生网关提供了平滑升级方案,一旦出现新的安全漏洞,可以快速对网关版本进行升级,同时确保升级过程对业务影响最小化。 此外,MSE云原生网关内置了阿里云Web应用防火墙(WAF),相比传统WAF用户请求链路更短、RT更低,且相比NginxIngressController可以做到细粒度路由级防护,使用成本是目前阿里云Web应用防火墙架构的23。 MSE云原生网关 阿里云容器服务应用市场已经上架MSE云原生网关,可用于替代默认安装的网关组件NginxIngressController。 MSE云原生网关在阿里集团内部作为网关中间件已经大规模使用,其强劲的性能和可靠的稳定性已被多年双十一流量所验证。 在K8s容器服务场景下,对比默认安装的NginxIngressController,主要有以下优势:更强劲的性能,更合理的架构,可以将网关资源成本降低至少50更好的可靠性和SLA保障,纯托管免运维,背靠阿里云技术团队提供支持更优的安全性保障,一次性解决现存CVE安全漏洞隐患,且内置WAF防护功能 同时在路由策略、灰度治理、可观测等方面提供了更丰富的功能,并且支持使用多种语言开发自定义的扩展插件,详细对比请参考:https:help。aliyun。comdocumentdetail424833。html平滑迁移方案 部署MSE云原生网关并不直接影响原有网关流量,通过DNS权重配置可以实现业务流量的平滑迁移,对后端业务完全无感知,核心的流量迁移过程如下图所示: 完整步骤如下:步骤一:在容器服务的应用市场中找到mseingresscontroller,并安装到目标ACK集群步骤二:在K8s中配置MseIngressConfig(配置指引),自动创建指定规格的MSE云原生网关步骤三:从Ingress的address字段中获取MSE云原生网关的IP,本地绑定host,将业务域名解析到该IP,完成业务测试步骤四:修改业务域名的DNS权重配置,添加云原生网关IP,并逐步调高权重,进行流量灰度步骤五:完成灰度后,将业务域名原先的IP从DNS配置中移除,实现全部流量切到云原生网关 作者:张添翼(澄潭) 原文链接:http:click。aliyun。comm1000345146 本文为阿里云原创内容,未经允许不得转载。