在大促等情境下,瞬間洪峰流量會使系統超出最大負載,調用大量堆積,導致整個調用鏈路卡死。ASM提供了本地限流功能,支援對網關進行流量限制,達到保護系統的目的。本文介紹如何為入口網關配置本地限流。
前提條件
已建立ASM執行個體,且ASM執行個體要符合以下要求:
ASM商業版(專業版或旗艦版):版本需為1.11.5.30及以上。關於升級ASM執行個體的具體操作,請參見升級ASM執行個體。
ASM標準版:僅支援Istio原生方式配置本地限流功能,且版本需為1.9及以上。不同Istio版本需參考相應版本文檔,關於最新的Istio版本配置本地限流功能的具體操作,請參見Enabling Rate Limits using Envoy。
已添加叢集到ASM執行個體。具體操作,請參見添加叢集到ASM執行個體。
已部署入口網關。具體操作,請參見建立入口網關。
已建立bookinfo和nginx服務。本文將bookinfo部署在default命名空間,將nginx部署在foo命名空間。建立bookinfo的具體操作,請參見在ASM執行個體關聯的叢集中部署應用。
已建立網關規則和虛擬服務。具體操作,請參見管理網關規則和管理虛擬服務。
已安裝流量加壓工具。具體操作,請參見hey。
適用對象
ASM本地限流功能適用於ASM網關和應用服務(注入了Sidecar)。
情境樣本說明
本文以Bookinfo和Nginx為例介紹網關和服務限流的具體使用情境。Nginx將單獨部署在foo命名空間,用於驗證限流的開啟範圍。
情境一:對單個虛擬服務路由配置限流規則
對bf2.example.com:80
這個網域名稱和連接埠組合下的productpage-route-name1路由配置限流規則。productpage-route-name1是前提條件中建立的虛擬服務bookinfo中的一條路由項,匹配了請求的/productpage
、/static
、/login
、/logout
等路徑並將匹配的請求轉寄到productpage服務。配置限流規則後,發往上述路徑的請求都將受到流量速率的限制。
建立本地限流規則。
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇 ,然後單擊建立。
在建立頁面,按需進行以下配置,然後單擊確定。
關於配置項的詳情,請參見ASMLocalRateLimiter CRD說明。
配置地區
配置項
說明
限流基本資料
命名空間
本地限流配置的命名空間,需要配置為限流生效的工作負載的所在命名空間。本樣本必須選擇istio-system,因為所有ASM網關都部署在istio-system命名空間。
名稱
本地限流配置的自訂名稱。本樣本填寫ingressgateway。
生效工作負載類型
限流生效的工作負載類型,支援應用服務生效和網關生效。本樣本選擇網關生效。
關聯工作負載
在生效工作負載類型為網關生效的情況下,可以通過選擇網關規則的方式關聯工作負載,本地限流配置將與選中的網關規則關聯相同的網關工作負載。本樣本選擇bookinfo-gateway。
限流規則列表
網關網域名稱
選擇網關規則中聲明的網域名稱,限流規則將在指定的連接埠和網域名稱組合下生效。本樣本選擇bf2.example.com。
網關連接埠
選擇網關規則中聲明的連接埠,限流規則將在指定的連接埠和網域名稱組合下生效。本樣本選擇80。
匹配虛擬服務路由項
選擇與網關規則關聯的虛擬服務中聲明的路由項。限流規則將在指定的虛擬服務路由項之下生效。本樣本選擇productpage-route-name1。
限流配置
指定本地限流令牌桶演算法的檢測時間視窗長度與時間視窗內允許的請求數量。在時間視窗內發送的請求數量超過該允許的數量則會對請求進行限流。本樣本配置如下:
限流檢測時間視窗填寫1秒。
時間視窗內允許請求數量填寫10。
以上配置表示發往此服務的工作負載的請求不得在1秒內連續發送10個以上。
進階選項
單擊展開進階選項,可以指定限流發生時的部分進階行為。您可按需對進階選項進行配置。本樣本自訂限流響應體填寫
{"ret_code": xxx,"message": "Your request be limited"}
。以上配置對應的本地限流配置YAML如下。
如果您沒有配置進階選項,限流時將返回預設響應資訊。
如果您配置了進階選項,限流時將返回自訂響應資訊。
在hey工具中執行以下命令,持續產生壓力流量。
hey -host bf2.example.com -c 10 -n 100000 http://<ASM網關IP>/productpage
hey -host bf2.example.com -c 10 -n 100000 http://<ASM網關IP>/nginx
執行以下命令,訪問網關的/productpage路徑。
curl -H 'host: bf2.example.com' http://<ASM網關IP>/productpage -v
預期輸出:
< HTTP/1.1 429 Too Many Requests < Content-Length: 18 < Content-Type: text/plain < Date: Thu, 13 Jan 2022 03:03:09 GMT < Server: istio-envoy < local_rate_limited
可以看到訪問bookinfo服務受到限流。
執行以下命令,訪問網關的/nginx路徑。
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -v
返回結果中沒有429,說明訪問未限流。
情境二:對網關上網域名稱和連接埠的組合限流規則
對bf2.example.com:80
這個網域名稱和連接埠組合設定限流配置,使該網域名稱和連接埠組合下的所有路徑都受到流量限制。
配置限流規則。
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇 ,然後單擊建立。
在建立頁面,按需進行以下配置,然後單擊確定。
關於配置項的詳情,請參見ASMLocalRateLimiter CRD說明。
配置地區
配置項
說明
限流基本資料
命名空間
本地限流配置的命名空間,需要配置為限流生效的工作負載的所在命名空間。本樣本必須選擇istio-system,因為所有ASM網關都部署在istio-system命名空間。
名稱
本地限流配置的自訂名稱。本樣本填寫ingressgateway。
生效工作負載類型
限流生效的工作負載類型,支援應用服務生效和網關生效。本樣本選擇網關生效。
關聯工作負載
在生效工作負載類型為網關生效的情況下,可以通過選擇網關規則的方式關聯工作負載,本地限流配置將與選中的網關規則關聯相同的網關工作負載。本樣本選擇bookinfo-gateway。
限流規則列表
網關網域名稱
選擇網關規則中聲明的網域名稱,限流規則將在指定的連接埠和網域名稱組合下生效。本樣本選擇bf2.example.com。
網關連接埠
選擇網關規則中聲明的連接埠,限流規則將在指定的連接埠和網域名稱組合下生效。本樣本選擇80。
匹配虛擬服務路由項
選擇與網關規則關聯的虛擬服務中聲明的路由項。限流規則將在指定的虛擬服務路由項之下生效。本樣本不進行選擇,表示在網域名稱和連接埠下的所有路由項上都生效限流規則。
限流配置
指定本地限流令牌桶演算法的檢測時間視窗長度與時間視窗內允許的請求數量。在時間視窗內發送的請求數量超過該允許的數量則會對請求進行限流。本樣本配置如下:
限流檢測時間視窗填寫1秒。
時間視窗內允許請求數量填寫10。
以上配置表示發往此服務的工作負載的請求不得在1秒內連續發送10個以上。
以上配置對應的本地限流配置YAML如下。
在hey工具中執行以下命令,持續產生壓力流量。
hey -host bf2.example.com -c 10 -n 100000 http://${ASM_GATEWAY_IP}/nginx
執行以下命令,訪問網關的/nginx路徑。
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -v
可以看到,返回
HTTP/1.1 429 Too Many Requests
,說明訪問網關上的/nginx路徑受到限流。
情境三:在單個虛擬服務路由上,針對包含特定要求標頭的請求配置限流規則
對bf2.example.com:80
這個網域名稱和連接埠組合下的nginx-route-name1路由配置限流規則,同時指定限流規則只生效在帶有ratelimit: "true"
要求標頭的請求上,該路由上的其他請求不受限流規則影響。nginx-route-name1是前提條件中建立的虛擬服務bookinfo中的一條路由項,匹配了請求的/nginx
路徑並將匹配的請求轉寄到nginx服務。
配置限流規則。
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇 ,然後單擊建立。
在建立頁面,按需進行以下配置,然後單擊確定。
關於配置項的詳情,請參見ASMLocalRateLimiter CRD說明。
配置地區
配置項
說明
限流基本資料
命名空間
本地限流配置的命名空間,需要配置為限流生效的工作負載的所在命名空間。本樣本必須選擇istio-system,因為所有ASM網關都部署在istio-system命名空間。
名稱
本地限流配置的自訂名稱。本樣本填寫ingressgateway。
生效工作負載類型
限流生效的工作負載類型,支援應用服務生效和網關生效。本樣本選擇網關生效。
關聯工作負載
在生效工作負載類型為網關生效的情況下,可以通過選擇網關規則的方式關聯工作負載,本地限流配置將與選中的網關規則關聯相同的網關工作負載。本樣本選擇bookinfo-gateway。
限流規則列表
網關網域名稱
選擇網關規則中聲明的網域名稱,限流規則將在指定的連接埠和網域名稱組合下生效。本樣本選擇bf2.example.com。
網關連接埠
選擇網關規則中聲明的連接埠,限流規則將在指定的連接埠和網域名稱組合下生效。本樣本選擇80。
匹配虛擬服務路由項
選擇與網關規則關聯的虛擬服務中聲明的路由項。限流規則將在指定的虛擬服務路由項之下生效。本樣本選擇路由項nginx-route-name1。
匹配請求屬性
填寫生效限流配置的具體請求匹配規則。本樣本配置如下:
匹配屬性選擇具體要求標頭。
要求標頭名稱填寫ratelimit。
匹配方法選擇精確匹配。
匹配內容填寫true。
限流配置
指定本地限流令牌桶演算法的檢測時間視窗長度與時間視窗內允許的請求數量。在時間視窗內發送的請求數量超過該允許的數量則會對請求進行限流。本樣本配置如下:
限流檢測時間視窗填寫1秒。
時間視窗內允許請求數量填寫10。
以上配置表示發往此服務的工作負載的請求不得在1秒內連續發送10個以上。
以上配置對應的本地限流配置YAML如下。
在hey工具中執行以下命令,持續產生壓力流量,請求都攜帶
ratelimit: true
的要求標頭以觸發限流。hey -host bf2.example.com -H 'ratelimit: true' -c 10 -n 10000 http://${ASM_GATEWAY_IP}/nginx
執行以下命令,訪問網關的
/nginx
路徑。curl -H 'host: bf2.example.com' -H 'ratelimit: true' http://${ASM_GATEWAY_IP}/nginx -v
可以看到返回
HTTP/1.1 429 Too Many Requests
,說明訪問網關/nginx
路徑、並攜帶ratelimit: true
要求標頭的請求受到了限流。執行以下命令,訪問網關的
/nginx
路徑,但請求不攜帶ratelimit: true
要求標頭。curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -v
可以看到返回結果中沒有429,說明未攜帶
ratelimit: true
要求標頭的請求未受限流影響。
相關操作
刪除限流配置,恢複訪問
刪除限流規則。
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇 。
在限流防護頁面的操作列,單擊目標限流規則對應的刪除,在確認對話方塊,單擊確定。
執行以下命令,訪問網關的
/nginx
路徑。curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -v
返回結果中沒有429,說明訪問未限流。