网关流控利器:结合 AHAS 实现 Ingress/Nginx 流量控制
作者:涂鴉
微服務(wù)的穩(wěn)定性一直是開發(fā)者非常關(guān)注的話題。隨著業(yè)務(wù)從單體架構(gòu)向分布式架構(gòu)演進以及部署方式的變化,服務(wù)之間的依賴關(guān)系變得越來越復(fù)雜,業(yè)務(wù)系統(tǒng)也面臨著巨大的高可用挑戰(zhàn)。應(yīng)用高可用服務(wù) AHAS (Application High Availability Service) 是經(jīng)阿里巴巴內(nèi)部多年高可用體系沉淀下來的云產(chǎn)品,以流量與容錯為切入點,從流量控制、不穩(wěn)定調(diào)用隔離、熔斷降級、熱點流量防護、系統(tǒng)自適應(yīng)保護、集群流控等多個維度來幫助保障服務(wù)和網(wǎng)關(guān)的穩(wěn)定性,同時提供秒級的流量監(jiān)控分析功能。AHAS 不僅在阿里內(nèi)部淘寶、天貓等電商領(lǐng)域有著廣泛的應(yīng)用,在互聯(lián)網(wǎng)金融、在線教育、游戲、直播行業(yè)和其他大型政央企行業(yè)也有著大量的實踐。
流量漏斗防護原
在分布式系統(tǒng)架構(gòu)中,每個請求都會經(jīng)過很多層處理,比如從入口網(wǎng)關(guān)再到 Web Server 再到服務(wù)之間的調(diào)用,再到服務(wù)訪問緩存或 DB 等存儲。在高可用流量防護體系中,我們通常遵循流量漏斗原則進行高可用流量防護。在流量鏈路的每一層,我們都需要進行針對性的流量防護與容錯手段,來保障服務(wù)的穩(wěn)定性;同時,我們要盡可能地將流量防護進行前置,比如將一部分 HTTP 請求的流量控制前置到網(wǎng)關(guān)層,提前將一部分流量進行控制,這樣可以避免多余的流量打到后端,對后端造成壓力同時也造成資源的浪費。
Ingress/Nginx 網(wǎng)關(guān)流量控制
Nginx 為目前比較流行的高性能開源服務(wù)器,Ingress 則為實際的 Kubernetes 集群流量入口。AHAS Sentinel 為 Ingress/Nginx 網(wǎng)關(guān)提供原生的入口流量控制能力,將流量防護進行前置,提前對多余的流量進行攔截,保障后端服務(wù)的穩(wěn)定性。近期發(fā)布的新版 AHAS Nginx 流量防護插件基于 Sentinel C++ 原生版本實現(xiàn),與舊版本 sidecar 版本相比進行了大量的性能優(yōu)化,在上萬 QPS 的場景也可以保證精確流量控制,同時不會對網(wǎng)關(guān)本身的性能帶來很大影響。
AHAS Nginx/Ingress 防護具有以下核心能力及優(yōu)勢:
-
低使用成本:僅需簡單配置即可快速將 Nginx/Ingress 網(wǎng)關(guān)接入 AHAS 流量防護,并在控制臺進行可視化的監(jiān)控、規(guī)則與返回行為配置
-
控制臺動態(tài)配置流控規(guī)則,實時生效,無需 reload Nginx
-
精準的入口總流量控制:AHAS Nginx/Ingress 防護支持上萬 QPS 量級精準的入口總流量控制,支持自定義流控粒度(如某一組 Host, URL 維度,甚至可以細化到參數(shù)、IP 維度)
-
配套的可觀測能力,實時了解網(wǎng)關(guān)流量與防護規(guī)則生效情況
下面我們就來用一個示例來介紹一下,如何快速將 Kubernetes 集群中的 Ingress 網(wǎng)關(guān)接入 AHAS 來玩轉(zhuǎn)流控能力,保障服務(wù)穩(wěn)定性。
快速玩轉(zhuǎn) AHAS Ingress 流量防護
首先,我們假設(shè)我們已有一個創(chuàng)建好的阿里云容器服務(wù)的 ACK 集群(如果集群中沒有 Ingress,可以在 ACK 組件管理中手動安裝),我們只需要在 kube-system 命名空間的 nginx-configuration 配置項 (ConfigMap) 中添加以下兩個字段:
use-sentinel: true sentinel-params: --app=ahas-ingress-demo即可完成 Nginx/Ingress 流量防護的接入。此時我們打開 AHAS 控制臺,就可以看到名為 ahas-ingress-demo 的 Ingress 網(wǎng)關(guān)了。
成功接入 AHAS 流量防護后,我們要做的就是先定義好一個請求分組。點開請求分組管理的 Tab 頁,我們新建一個名為 test1 的請求分組。我們將 Host 配置為精確匹配類型,值為 127.0.0.1;將 Path 配置為前綴匹配類型,值為?/test/?。具體的配置如下圖所示:
此時我們可以預(yù)見,所有請求 Host 為 127.0.0.1 并且請求路徑以?/test/?開頭的請求都會歸類到名為 test1 的分組中去。此時我們訪問一個匹配該請求分組的 URL,如???http://127.0.0.1/test/demo??,在 AHAS 控制臺-接口詳情監(jiān)控頁面可以看到 test1 這個分組的訪問量監(jiān)控。
接下來,我們要對名為 test1 的請求分組進行流量控制,我們既可以在接口詳情的 Tab 頁,也可以在規(guī)則管理的 Tab 頁中新增一條流控規(guī)則:
即完成了對 test1 請求分組的流控配置。這條流控規(guī)則的意思是,在一秒以內(nèi),該分組內(nèi)請求次數(shù)超過 10 的請求將會被攔截,閾值生效維度為單機維度。默認情況下,請求被攔截后會返回 429 Too Many Requests 狀態(tài)碼,我們也可以通過 ConfigMap 或直接在控制臺配置流控觸發(fā)后的返回邏輯。
如果此時我們使用壓測工具發(fā)起 QPS 大于 10 的流量,具體的效果會如下圖所示(接口詳情監(jiān)控):
若我們希望針對某個請求分組的集群訪問總量進行精確控制,可以配置集群流控規(guī)則,配置總閾值即可,而無需關(guān)心網(wǎng)關(guān)實例數(shù)與負載均衡情況。
綜上,我們對 Ingress/Nginx 網(wǎng)關(guān)進行流控控制,需要先要定義好一個的請求分組,然后再針對這個分組配置相應(yīng)的流控規(guī)則即可,完整的流程可以參考以下流程圖:
以上就是在阿里云容器服務(wù) ACK 集群上的 Ingress 流控實踐的一個例子,如果是自建的 Ingress 或者 Nginx,也可以參考以下兩篇文章快速接入:
-
??https://help.aliyun.com/document_detail/178827.html??
-
??https://help.aliyun.com/document_detail/209640.html??
點擊??此處??,前往 AHAS 官網(wǎng)查看更多!
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的网关流控利器:结合 AHAS 实现 Ingress/Nginx 流量控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 混合云应用双活容灾实践
- 下一篇: 如何定位并修复 HttpCore5 中的