乐趣区

关于高可用:网关流控利器结合-AHAS-实现-IngressNginx-流量控制

作者:涂鸦

微服务的稳定性始终是开发者十分关注的话题。随着业务从单体架构向分布式架构演进以及部署形式的变动,服务之间的依赖关系变得越来越简单,业务零碎也面临着微小的高可用挑战。利用高可用服务 AHAS (Application High Availability Service) 是经阿里巴巴外部多年高可用体系积淀下来的云产品,以流量与容错为切入点,从流量管制、不稳固调用隔离、熔断降级、热点流量防护、零碎自适应爱护、集群流控等多个维度来帮忙保障服务和网关的稳定性,同时提供秒级的流量监控剖析性能。AHAS 不仅在阿里外部淘宝、天猫等电商畛域有着宽泛的利用,在互联网金融、在线教育、游戏、直播行业和其余大型政央企行业也有着大量的实际。

流量漏斗防护原

在分布式系统架构中,每个申请都会通过很多层解决,比方从入口网关再到 Web Server 再到服务之间的调用,再到服务拜访缓存或 DB 等存储。在高可用流量防护体系中,咱们通常遵循流量漏斗准则进行高可用流量防护。在流量链路的每一层,咱们都须要进行针对性的流量防护与容错伎俩,来保障服务的稳定性;同时,咱们要尽可能地将流量防护进行前置,比方将一部分 HTTP 申请的流量管制前置到网关层,提前将一部分流量进行管制,这样能够防止多余的流量打到后端,对后端造成压力同时也造成资源的节约。

Ingress/Nginx 网关流量管制

Nginx 为目前比拟风行的高性能开源服务器,Ingress 则为理论的 Kubernetes 集群流量入口。AHAS Sentinel 为 Ingress/Nginx 网关提供原生的入口流量控制能力,将流量防护进行前置,提前对多余的流量进行拦挡,保障后端服务的稳定性。近期公布的新版 AHAS Nginx 流量防护插件基于 Sentinel C++ 原生版本实现,与旧版本 sidecar 版本相比进行了大量的性能优化,在上万 QPS 的场景也能够保障准确流量管制,同时不会对网关自身的性能带来很大影响。

AHAS Nginx/Ingress 防护具备以下外围能力及劣势:

  • 低应用老本:仅需简略配置即可疾速将 Nginx/Ingress 网关接入 AHAS 流量防护,并在控制台进行可视化的监控、规定与返回行为配置
  • 控制台动静配置流控规定,实时失效,无需 reload Nginx
  • 精准的入口总流量管制:AHAS Nginx/Ingress 防护反对上万 QPS 量级精准的入口总流量管制,反对自定义流控粒度(如某一组 Host, URL 维度,甚至能够细化到参数、IP 维度)
  • 配套的可观测能力,实时理解网关流量与防护规定失效状况

上面咱们就来用一个示例来介绍一下,如何疾速将 Kubernetes 集群中的 Ingress 网关接入 AHAS 来玩转流控能力,保障服务稳定性。

疾速玩转 AHAS Ingress 流量防护

首先,咱们假如咱们已有一个创立好的阿里云容器服务的 ACK 集群(如果集群中没有 Ingress,能够在 ACK 组件治理中手动装置),咱们只须要在 kube-system 命名空间的 nginx-configuration 配置项 (ConfigMap) 中增加以下两个字段:

use-sentinel: true
sentinel-params: --app=ahas-ingress-demo

即可实现 Nginx/Ingress 流量防护的接入。此时咱们关上 AHAS 控制台,就能够看到名为 ahas-ingress-demo 的 Ingress 网关了。

胜利接入 AHAS 流量防护后,咱们要做的就是先定义好一个申请分组。点开申请分组治理的 Tab 页,咱们新建一个名为 test1 的申请分组。咱们将 Host 配置为准确匹配类型,值为 127.0.0.1;将 Path 配置为前缀匹配类型,值为 /test/。具体的配置如下图所示:

此时咱们能够预感,所有申请 Host 为 127.0.0.1 并且申请门路以 /test/ 结尾的申请都会归类到名为 test1 的分组中去。此时咱们拜访一个匹配该申请分组的 URL,如 ​​http://127.0.0.1/test/demo​​,在 AHAS 控制台 - 接口详情监控页面能够看到 test1 这个分组的访问量监控。

接下来,咱们要对名为 test1 的申请分组进行流量管制,咱们既能够在接口详情的 Tab 页,也能够在规定治理的 Tab 页中新增一条流控规定:

即实现了对 test1 申请分组的流控配置。这条流控规定的意思是,在一秒以内,该分组内申请次数超过 10 的申请将会被拦挡,阈值失效维度为单机维度。默认状况下,申请被拦挡后会返回 429 Too Many Requests 状态码,咱们也能够通过 ConfigMap 或间接在控制台配置流控触发后的返回逻辑。

如果此时咱们应用压测工具发动 QPS 大于 10 的流量,具体的成果会如下图所示(接口详情监控):

若咱们心愿针对某个申请分组的集群拜访总量进行准确管制,能够配置集群流控规定,配置总阈值即可,而无需关怀网关实例数与负载平衡状况。

综上,咱们对 Ingress/Nginx 网关进行流控管制,须要先要定义好一个的申请分组,而后再针对这个分组配置相应的流控规定即可,残缺的流程能够参考以下流程图:

以上就是在阿里云容器服务 ACK 集群上的 Ingress 流控实际的一个例子,如果是自建的 Ingress 或者 Nginx,也能够参考以下两篇文章疾速接入:

  • ​​https://help.aliyun.com/document_detail/178827.html​​
  • ​​https://help.aliyun.com/document_detail/209640.html​​

点击​​ 此处 ​​,返回 AHAS 官网查看更多!

退出移动版