关于网关:多层网关已成过去网关多合一成潮流网关改造正当时

52次阅读

共计 6284 个字符,预计需要花费 16 分钟才能阅读完成。

01 前言

K8s 通过 Ingress / Gateway API 将网关标准化,逐渐将平安网关、流量网关、微服务网关内聚,解决从单体到微服务到云原生多层网关的复杂度,合久必分,分久必合,多层网关已成过来,网关多合一成潮流,成为 K8s 开发者和微服务开发者独特关怀的话题。

02 Higress 1.0 正式公布,即官网举荐生产可用

Higress 是阿里云开源的下一代网关,从 2022 年 11 月在云栖大会上发表开源,走过大半年工夫,公布了 GA 版本 1.0.0,即官网举荐生产可用。回顾 Higress 的倒退历程,经验了三个阶段:

Higress 的技术选型和首次业务落地(2020.05~2020.11)

Higress 的创立源于阿里外部的“本地生存战斗”,核心技术指标是实现阿里巴巴业务域与蚂蚁业务域之间 RPC 间接调用,但因阿里巴巴与蚂蚁业务域网络是隔离的,即网络是不通的,很天然想到利用网关来解决此问题。利用网关来解决阿里巴巴与蚂蚁跨业务域 RPC 互通问题,首先要对网关做技术选型。选型期,除了关注技术计划是否完满反对 HTTP/gRPC 协定、反对丰盛路由策略以及是否业内支流技术,还关注是否反对热更新。

热更新是咱们的外围关注点。

Tengine/Nginx 的配置更新须要 reload,reload 须要重启 worker 过程,重启时会引起流量抖动,对长连贯影响尤为显著。在网关的集群规模十分大时,更是不能随便的做 reload,这时就会引发一个矛盾点:业务向网关提交配置后,心愿能疾速验证,但受限于 reload 机制和稳定性要求,无奈满足业务疾速验证与疾速试错的诉求。

如何解决这点呢?

一是采纳两层网关,即流量网关 + 业务网关;二是实现网关原生反对配置热更新。除了比照不同计划的优劣势,咱们也调研了 Envoy 作为网关在业界的趋势,论断是目前 Envoy 作为 K8s 中的 Ingress Provider 增长最快的事实(Ingress Provider 指 K8s Ingress 标准具体实现,因 K8s Ingress 本身只是标准定义,是 K8s 下内部流量进入集群外部的网关标准定义),咱们最终抉择了 Envoy 来实现两层网关,并完满撑持双 11 大促每秒数十万的申请流量。

Higress 的重要演进和服务更多业务场景(2020.12~2021.10)

随着在阿里巴巴和蚂蚁的胜利落地,越来越多的业务场景找到了咱们。

这个过程中,Higress 实现了东西向、南北向全域流量的调度散发,东西向上不仅反对跨业务域的蚂蚁 RPC 互通,也扩大到了混合云的云上云下 RPC 互通场景,笼罩钉钉文档、阿里视频云、达摩院的店小蜜、智慧数字人等。

2021 年,阿里巴巴开启了中间件三位一体战斗,指标是用云产品撑持团体业务。咱们开始将孵化成熟的 Higress 技术积淀为云产品,即目前阿里云上提供的 MSE 云原生网关,一方面面向宽广的私有云用户提供托管的网关服务,另一方面也对内服务团体。

Higress 对外开源,通过社区力量减速倒退(2021.11~ 至今)

随着 Higress 成为云产品服务于更多内部用户,咱们逐渐发现用户对 Higress 提出了更高的要求,其中反馈较多的大的需要点是插件扩大、Waf 防护、多注册核心、Nginx Ingress 注解兼容以及 HTTP 转 Dubbo 协定,当然也有很多小的需要点在此就不一一列出,因而该阶段咱们重点发力在上述用户反馈的高频需要。

开源曾经成为软件倒退的必然趋势与疾速门路,因为社区的力量是十分弱小的。

因而咱们将这套通过外部实际积淀下来的网关计划 Higress 正式对外开源,以 Kubernetes Ingress 网关为契机带来了流量网关与微服务网关交融的可能性,联合阿里外部实际积淀 Higress 实现了流量网关 + 微服务网关 + 平安网关三合一的高集成能力,同时深度集成了 Dubbo、Nacos、Sentinel 等,可能帮忙用户极大的升高网关的部署及运维老本,而且能力不打折。

03 为什么 Higress 能代替多层网关,成为下一代网关

Higress 是标准化、高集成、易扩大、热更新的云原生网关。无缝集成容器和微服务生态,是云原生时代的默认选项。

高集成,连贯微服务生态

Envoy 提供了 EDS/DNS/STATIC 等多种类型的 Cluster,Higress 基于此具备了对接多种服务发现的能力,能够实现:

  1. 通过 Nacos 发现服务(EDS)
  2. 通过 Zookeeper 发现服务(EDS)
  3. 通过 K8s Service 发现服务(EDS)
  4. 通过 DNS 域名发现服务(DNS)
  5. 通过配置动态 IP 发现服务(STATIC)

通过 Higress 控制台能够很不便地进行相应的服务发现配置:

随着云原生技术的倒退,不少企业开始从传统架构向云原生架构演进,但这过程中传统架构部署的服务无奈被 K8s 的 Ingress 发现并路由成为一个阻塞点,导致业务架构无奈平滑地向云原生平滑演进。Higress 依靠于 Nacos 等注册核心的能力,无论服务是否部署在 K8s 集群内,都能够发现服务并进行申请路由。如上图所示,业务在迁徙过程中,能够通过 Higress 将 5% 的灰度流量导入部署在 K8s 上新架构的服务中,进行灰度测试验证,逐渐切流,从而实现业务架构安稳降级。

对于灰度能力,Higress 实现了和 OpenKruise Rollout 进行联动,能够实现服务灰度公布。整个 Rollout 过程,能够实现主动整合 Deployment、Service、Ingress 一起工作,并向用户屏蔽底层资源变动。用户无需手动编辑多个 K8s 资源,即可轻松应用金丝雀公布,A/B Test 等灰度机制。

易扩大,晋升网关的业务使命

将插件的生命周期划分为三个阶段:

  1. 插件开发阶段
  2. 散发集成阶段
  3. 运行失效阶段

Envoy 提供的 Wasm 插件机制,解决了插件运行失效阶段的问题,基于 ECDS 配置更新机制,插件代码和配置产生变更均不会导致连贯断开,并且插件运行在平安沙箱中,即便代码逻辑呈现空指针等异样,也不会导致网关产生 Crash。

在插件开发阶段,Higress 基于 Proxy Wasm 生态提供了更容易上手的 C++ 和 Go 语言的 Wasm 插件 sdk,在 sdk 中封装了插件路由和域名级失效的机制,开发者只需关怀插件配置解析和运行逻辑即可,在散发集成阶段,Higress 定义了 Wasm 插件的 OCI 镜像标准,将插件的 README 文档,配置字段束缚信息,以及 Wasm 文件等一起打包在一个 OCI 镜像中,能够通过反对 OCI 格局的镜像仓库进行存储和拉取。并且能够通过 Higress 控制台疾速启用插件:

Wasm 插件的 OCI 镜像标准:https://higress.io/zh-cn/docs/user/wasm-image-spec

Higress 的插件机制和传统的基于 OpenResty Lua 扩大的插件机制最实质的区别,也是往往最容易被开发者疏忽的是插件散发集成的环节。传统的 Lua 插件扩大机制,插件本身的版本生命周期是跟着网关的版本走,插件版本更新,以及本人开发插件都须要重新部署网关。而 Higress 依靠于 OCI 镜像进行网关插件的版本治理和散发,实现了插件版本生命周期和网关版本的解耦,用户只需调整一行插件 OCI 镜像地址,即可实现插件的热更新,整个过程网关连贯不会产生断开,流量齐全无损。

基于此,在网关上的业务插件逻辑能够很不便地实现热更新。Higress 也基于此能力提供了很多业务认证和平安相干的官网插件,开箱即用。

标准化,升高革新综合老本

因为 Envoy 是面向配置管理服务器设计的配置零碎,对程序敌对,对手写配置并不敌对。因而像 Istio 设计了 VirtualService/DestinationRule/AuthorizationPolicy 等等 CRD 形象,来解决 Envoy 配置简单的问题,Istio 的 CRD 自身是解决 ServiceMesh 下简单的服务治理场景而设计,而对于网关路由场景,更多用户须要的是 Ingress 这样更简略的 API 规范。

Higress 联合阿里外部实际以及阿里云产品积淀,积攒了基于 Ingress API 的丰盛的路由策略扩大能力,同时还兼容大部分 Nginx Ingress 能力,并且能够通过 Higress 提供的控制台来创立路由,开箱即用:

Higress 控制台目前对接的底层模型是 Ingress API,如果你对 Gateway API 有理解,会发现 Higress 管制台上的路由模型,也齐全能够用 Gateway API 进行形容:

apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: foo
spec:
  parentRefs:
  - name: foo-example
  hostnames:
  - "foo.example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /foo
      headers:
      - type: Prefix
        name: x-higress-header
        value: hi
      queryParams:
      - type: Exact
        name: higressQuery
        value: hi
      method: POST
    backendRefs:
    - name: foo-service
      port: 5678

Gateway API 规范目前还处在 beta 阶段,尚未齐全定稿,生产应用咱们更多还是倡议用户应用 Ingress API,防止后续 Gateway API 规范改变带来 Breaking Change。Higress 对 Gateway API 的反对正在开发中,能够看到基于下面的模型,借助 Higress 控制台能够帮忙用户屏蔽底层 API 路由规范的代际差别,实现路由从 Ingress API 平滑迁徙到 Gateway API,根治对技术标准追赶的焦虑。

K8s 带来了云原生的路由规范 Ingress/Gateway API,如同 POSIX 定义 Unix 可移植操作系统规范,历时 35 年经久不衰,云原生的路由规范的生命周期肯定会远超过 K8s 自身。

热更新,晋升接入层稳定性

Higress 基于 Envoy 引擎,为适应古代利用和微服务架构的需要,对传统流量网关(本文以 Nginx 为例)的不足之处进行改良,实现了真正的配置热更新,并让流量网关和微服务网关的交融成为可能。

Nginx 的配置变更 reload,会导致 downstream 和 upstream 连贯都断开触发重连,在高并发场景下,downstream 并发重连将导致 Nginx 的 CPU 飙升,最重大的还是 upstream 的并发重连,很可能打垮后端业务程序的线程池,造成雪崩。

而 Envoy 依靠于准确的配置变更治理,做到了真正的热更新。在 Envoy 中 downstream 对应 listener 配置,交由 LDS 实现配置发现;upstream 对应 cluster 配置,交由 CDS 实现配置发现。listener 配置更新重建,只会导致 downstream 连贯断开,不会影响 upstream 的连贯;downstream 和 upstream 的配置能够独立变更,互不影响。再进一步,listener 下的证书 (cert),过滤器插件(filter),路由(router) 均能够实现配置独立变更,这样不论是证书 / 插件 / 路由配置变更都不再会引起 downstream 连贯断开。

04 Higress 生产实践最佳参考

可观测

Higress 提供了自带的 prometheus 和 grafana 能够开箱即用,同时也反对对接用户自建的监控零碎,具体请参考:《基于 Prometheus 实现 Higress 流量观测》:https://higress.io/zh-cn/docs/user/prometheus

装置部署

能够应用 Helm 一键实现 Higress 的生产装置部署

helm repo add higress.io https://higress.io/helm-charts
helm install higress -n higress-system higress.io/higress --create-namespace --render-subchart-notes --set higress-console.domain=console.higress.io

通过减少 helm 参数 –set global.local=true 能够在本地 PC 环境基于 k3s/kind 等工具,进行全功能测试和试用:

helm install higress -n higress-system higress.io/higress --create-namespace --render-subchart-notes --set global.local=true --set higress-console.o11y.enabled=false  --set higress-console.domain=console.higress.io --set higress-console.admin.password.value=admin

详情能够参考:

《Higress Quickstart》:

https://higress.io/zh-cn/docs/user/quickstart

《Higress 装置部署》:

https://higress.io/zh-cn/docs/ops/deploy-by-helm

微服务生态集成

不管 Dubbo/SpringCloud 服务是否部署在 K8s 集群内,Higress 都能够实现对接。因而在 K8s 场景下,用户能够将 Nginx Ingress 这类流量网关和 Spring Cloud Gateway 这类微服务网关合并,对立替换为 Higress。

《Higress 对接 Dubbo 服务》:

https://cn.dubbo.apache.org/zh-cn/overview/what/ecosystem/gat…

《Higress 对接 SpringCloud 服务》:

https://higress.io/zh-cn/docs/user/spring-cloud

性能压测数据

Higress 和 Nginx 比照,在 HTTP1 上会略逊一筹,但在现代化协定如 gRPC/HTTP2 上则比 Nginx 好很多。

《gRPC 吞吐是 Nginx 的 4 倍》:https://gist.github.com/johnlanni/aac7480c17b0fde05fa64a20fc93b165

而如果你应用的是 K8s Nginx Ingress,因为其 Lua 代码性能较差,即便在 HTTP1 场景下,Higress 性能也更好,具体数据能够参考:

《K8s 网关选型初判》:https://xie.infoq.cn/article/0a2c9ac4ed139bc28f881d7c3

企业用户落地

Higress 自从 4 月份公布 1.0.0 RC 版本以来,在社区有大量用户进行装置和测试,帮忙 Higress 变得更成熟,并且适应了更多零碎和装置环境。同时有多家企业实现了 Higress 技术的落地。

开源软件的倒退离不开社区用户的实际,用户的参加和奉献是推动开源我的项目胜利的关键因素。在这里,咱们欢送更多的社区用户退出 Higress 实际落地的行列!欢送到 Higress GitHub issue 注销信息,社区将邀请您退出 Higress 落地反对群,咱们会为落地用户提供领导和帮忙。

Higress GitHub issue:https://github.com/alibaba/higress/issues/1

作者:Higress 团队

原文链接

本文为阿里云原创内容,未经容许不得转载。

正文完
 0