云原生API网关 - 开源项目Hango网关设计与实践

解读开源Hango网关的云原生设计与实践,本文先从云原生溯源,解读云原生API网关选型特点;再进一步解读网易数帆开源Hango云原生API网关设计及大规模落地实践。

云原生溯源

什么是云原生

CNCF(云原生计算基金会)对云原生的定义是:云原生是一种架构模式,有利于各组织在公有云、私有云和混合云等动态环境中,构建和运行可弹性扩展的应用。代表技术包括,容器、微服务、不可变基础设施和声明式API。

从云原生的定义可以看出,云原生具备快速集成,拥有良好的扩展性及高可用性。得益于Kubernetes的发展,云原生技术蓬勃发展,已然迈入新时代。

API网关的意义

随着容器技术以及微服务理念的发展,更多的产品组织着重于暴露开放API,用于客户端进行交互。API网关充当API代理的功能,网关接收请求,将请求进行统一路由转发至后端服务。网关作为抽象层,为整个微服务系统或集群提供统一接入层。

除了代理功能外,API网关为微服务集群提供统一的安全、响应转换、熔断、降级和监控等多维度功能,确保流量安全可靠。

随着云原生理念引领微服务进行演进,应用迭代频率以及交付速度会加快,API网关的出现可以使得业务开发更加专注于自身业务逻辑的设计,提升研发敏捷性。在云原生的架构下,API网关也在向云原生演进,Hango网关便是云原生设计下催生的优秀网关产品。

云原生API网关特点

进入云原生时代,行业用户除了关注传统API网关提供的请求代理,流量治理等常规功能外,更多的开始关注云原生兼容性,支撑场景的多样以及更优异的性能。

相较于传统API网关,在云原生模式下笔者认为API网关应该具备的一些思考:

  • 服务发现方式:与传统网关服务发现需要手动指定upstream,云原生网关在服务发现上需要动态感知业务变化。

  • 更高的性能追求:随着Kubernetes以及容器将云原生带入新时代以及微服务理念的发展,API网关的卓越性能可以减少整个链路的RT。

  • 云原生架构兼容/整合:网关的部署架构是否能够和云原生架构进行兼容,能否和容器以及服务网格进行无缝对接。

  • 动态配置能力:传统的反向代理无法实现动态配置加载能力,云原生模式下的代理配置更新变化较频繁,动态配置下发能力显得尤为关键。

  • 部署形态及架构:网关部署架构能否满足弹性扩展,是否支持从业务混部到独立部署的平滑迁移。

  • 监控/链路追踪:云原生架构中,良好的监控和链路追踪能力可以便于运维人员进行服务观测以及问题定位。

Hango API 网关设计

随着集团内业务大规模进行容器化改造,业务对网关的诉求也愈发强烈。我们团队着手于建设新一代高性能API网关Hango(项目地址:https://github.com/hango-io/hango-gateway),目的是替换集团内部较多的采用Java的异步网关、Zull,同时满足业务逐渐上云的南北向流量治理需求。

在选型方面,我们选择Envoy作为云原生网关实践的关键基础组件,具备丰富的特性,包括:

  • 原生功能丰富:相较于Nginx,HAProxy等流量代理所需的基本功能,Envoy本身基于C++实现了相当多的高级治理功能,包括负载均衡、熔断、限流、故障注入等。更为丰富的功能使得Envoy 天生具备多场景。

  • 丰富的可观察性:Envoy具备灵活的日志配置、丰富的指标数据以及开箱即用的多种Tracing能力。

  • 灵活的扩展性:Envoy提供了L4/L7 Filter机制,可以让开发者在不侵入Envoy主干的前提下对Envoy进行扩展与增强。同时,xDS协议的提出,使得Envoy几乎所有的配置都可以动态下发、加载、生效,而无需重新加载进程。

同时,Envoy在行业内的发展趋势也非常迅猛,2020年云原生报告显示,Envoy 在行业内使用量上升明显,去年排名第四的Envoy,超过F5和HAProxy 从15%的份额增长到29%。

架构设计

基于以上典型特性,秉承云原生的理念,通过大量内部积累实践经验,我们开源了Hango API 网关。Hango 中文名“函谷”,是一个高性能,可扩展,功能丰富的云原生API网关。

Hango网关基于Envoy及Istio构建。数据面基于Envoy扩展,增强插件链;控制面基于Istio进行扩展。具体架构如下:

云原生API网关 - 开源项目Hango网关设计与实践_第1张图片

控制面组件包括Hango Portal, Hango API Plane, Slime以及Istiod。Hango API Plane生成Gateway、DestinationRule、VirtualService等CRD以及EnvoyPlugin等Slime CRD;通过Slime进行扩展,将Slime CRD动态转化为EnvoyFilter,对数据面envoy进行扩展。

下图展示Hango网关插件链的数据流,通过创建EnvoyPlugin CR,Slime动态监听聚合生成对应的EnvoyFilter,完成对Envoy filter chain的动态扩展。

云原生API网关 - 开源项目Hango网关设计与实践_第2张图片

高性能

和传统API网关相比,在云原生模式下,业务开发更加敏捷,业务拆分更加细致。这样会使得业务每一跳之间的时延更加敏感。网关承接整个微服务集群的流量代理,良好的性能是业务是否选择网关的必备条件。

Hango API网关采用Envoy作为核心数据面,众多核心功能通过原生C++实现,相较于Nginx、HAProxy等通过扩展脚本实现主要功能的方式,性能优势更为明显。

同时,在实际落地过程,我们也对网关做了一定的性能优化,包括:

  • 配置过滤:通过对集群svc以及DestinationRule 资源的配置过滤,减少envoy cluster 数量。

  • 插件配置:提供全局插件开关以及路由维度的插件开关,减少非必要插件逻辑对性能的开销。

通过优化,基于20个cluster,500条route配置规模,我们对Hango进行了梯度测试,在容器网络下,500条route配置规模,Hango RPS可以达到9.5w。

云原生API网关 - 开源项目Hango网关设计与实践_第3张图片

多场景

Hano API网关具备支撑微服务网关、七层负载均衡、Kubernetes Ingress等多场景能力。作为业务上云的南北流量入口,Hango网关具备以下特性:

  • 灵活路由配置:支持不限于请求Path,Header、Method、Query等进行灵活路由配置。

  • 多注册方式:支持Kubernetes注册中心动态感知业务集群变化,满足业务平滑扩缩容场景;支持传统逻辑部署,使得业务可以平滑迁移。

  • 多场景治理:支持多维度限流、熔断、降级、重试等多场景流量治理。

  • 多协议支持:支持HTTP、gRPC、Websocket等多协议接入。

  • 多维度安全:支持多维度黑白名单、外部认证等多种认证方式。

同时,作为通用网关,Hango同样可以被用于L7 负载均衡器,Kubernetes 边缘网关等通用场景。

可扩展

功能扩展

Hango网关开源Rider 模块,用于功能扩展。用户可以通过简单的教程进行可插拔插件的形式的动态扩展网关功能。

Rider作为Hango API网关开源的module,提供插件开发的SDK,使得用户可以通过Lua扩展的方式编写自定义插件,通过简单的配置即可以动态扩展envoy L7 filters,使得Lua 插件可以像其他Native Http filter一样在运行时进行配置。

云原生API网关 - 开源项目Hango网关设计与实践_第4张图片

可以参考Hango Github 网页Rider自定义插件教程 ,这里提供一个简单的开箱即用的UA黑白名单插件,读者可以进行自定义插件学习。

弹性伸缩

Hango网关支持容器化部署,提供基于Kubernetes的部署架构。建立在数据面和控制面隔离的基础上,数据面节点基于无状态的envoy进行部署。基于xDS协议的动态下发设计,数据面可以进行动态横向扩展,在业务大促或流量增长时进行平滑伸缩。

容错性

Hango网关可以实现业务配置隔离,增加业务容错性,对于重点业务可以单独区分网关集群进行部署,提升整个网关产品可用性。

Hango网关设计之初便可以完成对业务配置的隔离,基于Istio的模型,在Hango网关最初在规模实践就考虑到了增强Istio的能力,通过对DestinationRule 相关CR增加对应的Gateway label。通过label匹配的方式控制cluster资源的下发,起到配置隔离作用。

Istio社区也在版本演进过程中(>Istio1.7),提出了一种解决思路,cluster的获取可以依赖VirtualService(VS)中的host配置,通过VS资源route host与DestinationRule资源进行映射 ,生成对应的cluster, 下发至指定的Proxy。这样可以确保不同网关之间的cluster配置隔离,减少不同配置相互影响,提升服务稳定性;同时,大大减少线上cluster的数量,进一步提升proxy性能。

如下所示,通过配置隔离,a-hango 网关集群仅能收到app1的cluster。通过此可以实现线上配置隔离,提升产品稳定性,同时进一步提升网关性能。

云原生API网关 - 开源项目Hango网关设计与实践_第5张图片

易操作

Hango网关提供从控制界面以及API的方式提升用户操作体验。

控制平面

提供简单的控制面,用户可以通过可视化操作进行服务和路由的生命周期管理。具体可以参考:Hango网关控制面操作流程

云原生API网关 - 开源项目Hango网关设计与实践_第6张图片

OpenAPI

为了便于企业用户接口Hango, Hango提供了标准的Restful API,便于企业用户完成对已有网关产品向Hango的平滑迁移。

Hango API 网关规模落地

在网易集团内部,基于Hango网关构建的轻舟网关已经大规模落地实践,承担网易集团每日百亿级流量。本文主要从平滑纳管、灰度发布以及可观测实践三个角度介绍Hango网关在网易集团内部的落地实践。

平滑纳管

基于Hango网关规模落地中,我们对容器服务,裸金属服务等实现了平滑纳管以及平滑迁移,为业务上云提供了便利接入,打消了业务上云无法平滑的顾虑。

在网易集团内部,针对不同的业务划分不同的网关集群,从业务上进行配置隔离,提升网关可靠性。

云原生API网关 - 开源项目Hango网关设计与实践_第7张图片

灰度发布

在实践过程中,灰度主要涉及两方面,一方面是业务容器化改造过程中的灰度迁移,另一方面便是网关产品自身的灰度策略。

业务容器灰度

业务在容器化改造过程中,存在多版本上线场景,需要根据不同版本进行灰度发布。Hango网关提供根据业务不同版本进行灰度的过程,通过对服务打label的形式,在路由的过程中,选择不同的label进行灰度权重配置。

云原生API网关 - 开源项目Hango网关设计与实践_第8张图片

网关灰度

作为微服务集群的入口,网关的稳定运行关系着整个集群流量的稳定及可靠。在实地落地过程中,建立一整套网关自身灰度体系非常有必要,Hango网关在网易集团内部落地过程采用四层LB进行灰度体系构建,通过对Hango数据面打label的形式,控制网关自身灰度。

云原生API网关 - 开源项目Hango网关设计与实践_第9张图片

可观测

基于Envoy良好的观测性,Hango网关在网易集团内部进行规模落地过程中,结合服务网格场景,提供丰富的观测能力,整体架构如下:

云原生API网关 - 开源项目Hango网关设计与实践_第10张图片

  • 日志

    Envoy中事件的详细记录,Hango网关基于Envoy进行数据面扩展,提供了灵活易配置的AccessLog,支持自定义格式,自定义过滤规则以及输出。

    基于filebeat以及elastic的能力,构建一体化日志审计平台。

  • 监控

    基于Envoy cluster mertic等信息,利用Promethues构建网关/服务等多维度指标体系。同时,针对网关容器化部署模式,基于Kubernetes 容器对应的 metrics构建容器维度的指标监控,涵盖CPU/内存/带宽等多维度监控。

  • 链路追踪

    基于Envoy开箱即用的多种tracing接入,拓展力强,目前已完成线上SkyWalking等tracing的接入。

    写在最后

    Hango作为一名开源领域的新生儿,我们会秉承拥抱云原生的理念,继续跟进Istio/Envoy的演进,发挥更大的领域价值。下一阶段,我们会在多语言扩展,LB融合等多场景进行发力,也期待更多关注云原生、API网关的同学能够加入Hango开源社区建设。

    诚挚的欢迎大家关注Hango Gateway:

    https://github.com/hango-io/hango-gateway

    参考文档

    云原生(Cloud Native)的定义

    https://jimmysong.io/kubernetes-handbook/cloud-native/cloud-native-definition.html

    云原生关乎文化,而不是容器

    https://cloudnative.to/blog/cloud-native-culture-not-container/

    Hango 开源解读:云原生网关实践,为何要选择 Envoy ?

    https://mp.weixin.qq.com/s/J8ROB79yi4xlmTpQOR2sOA

    作者简介

    韩佳浩,开源项目 Hango 核心开发者,网易数帆资深研发工程师,主导 Hango 网关开源研发及设计,负责网易数帆轻舟 API 网关在网易内部大规模落地及产品化建设。具有三年网关相关研发及大规模实践经验。

    分享预告

    9月9日20:00,Hango 项目核心开发者,网易数帆技术专家王佰平将在 InfoQ 公开课分享《如何基于开源Envoy,构建高性能云原生微服务网关》,从网易数帆开源 API 网关项目 Hango 实践出发,介绍如何基于开源 Envoy 构建高性能、易扩展、可观察的云原生微服务网关。敬请点击“阅读原文”报名预约观看!

你可能感兴趣的:(网关,大数据,编程语言,人工智能,java)