全部產品
Search
文件中心

Alibaba Cloud Service Mesh:為入口網關配置本地限流

更新時間:Oct 16, 2024

在大促等情境下,瞬間洪峰流量會使系統超出最大負載,調用大量堆積,導致整個調用鏈路卡死。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執行個體關聯的叢集中部署應用

    展開查看如何建立nginx服務

    1. 使用以下內容,建立nginx.yaml。

      apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
      kind: Deployment
      metadata:
        name: nginx
      spec:
        selector:
          matchLabels:
            app: nginx
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
              sidecarset-injected: "true"
          spec:
            containers:
            - name: nginx
              image: nginx:1.14.2
              ports:
              - containerPort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: nginx
      spec:
        ports:
          - name: http
            port: 80
            protocol: TCP
            targetPort: 80
        selector:
          app: nginx
        type: ClusterIP
    2. 執行以下命令,在foo命名空間部署Nginx。

      kubectl apply -f nginx.yaml -n foo 
  • 已建立網關規則和虛擬服務。具體操作,請參見管理網關規則管理虛擬服務

    展開查看Gateway YAML

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: bookinfo-gateway
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
      - hosts:
        - bf2.example.com
        port:
          name: http
          number: 80
          protocol: http

    展開查看VirtualService YAML

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: bookinfo
      namespace: default
    spec:
      gateways:
      - bookinfo-gateway
      hosts:
      - bf2.example.com
      http:
      - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        name: productpage-route-name1
        route:
        - destination:
            host: productpage
            port:
              number: 9080
      - match:
        - uri:
            prefix: /nginx
        name: nginx-route-name1
        rewrite:
          uri: /
        route:
        - destination:
            host: nginx.foo.svc.cluster.local
            port:
              number: 80
  • 已安裝流量加壓工具。具體操作,請參見hey

適用對象

ASM本地限流功能適用於ASM網關和應用服務(注入了Sidecar)。

情境樣本說明

本文以Bookinfo和Nginx為例介紹網關和服務限流的具體使用情境。Nginx將單獨部署在foo命名空間,用於驗證限流的開啟範圍。情境樣本

情境一:對單個虛擬服務路由配置限流規則

bf2.example.com:80這個網域名稱和連接埠組合下的productpage-route-name1路由配置限流規則。productpage-route-name1是前提條件中建立的虛擬服務bookinfo中的一條路由項,匹配了請求的/productpage/static/login/logout等路徑並將匹配的請求轉寄到productpage服務。配置限流規則後,發往上述路徑的請求都將受到流量速率的限制。

  1. 建立本地限流規則。

    1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

    2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇流量管理中心 > 限流防護,然後單擊建立

    3. 建立頁面,按需進行以下配置,然後單擊確定

      關於配置項的詳情,請參見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"}

      image.png

      以上配置對應的本地限流配置YAML如下。

      • 如果您沒有配置進階選項,限流時將返回預設響應資訊。

        展開查看未配置進階選項的本地限流YAML

        apiVersion: istio.alibabacloud.com/v1beta1
        kind: ASMLocalRateLimiter
        metadata:
          name: ingressgateway
          namespace: istio-system
        spec:
          configs:
            - limit:
                fill_interval:
                  seconds: 1
                quota: 10
              match:
                vhost:
                  name: bf2.example.com
                  port: 80
                  route:
                    name_match: productpage-route-name1
          isGateway: true
          workloadSelector:
            labels:
              istio: ingressgateway
      • 如果您配置了進階選項,限流時將返回自訂響應資訊。

        展開查看配置進階選項的本地限流YAML

        apiVersion: istio.alibabacloud.com/v1beta1
        kind: ASMLocalRateLimiter
        metadata:
          name: ingressgateway
          namespace: istio-system
        spec:
          configs:
            - limit:
                custom_response_body: '{"ret_code": xxx, "message": "Your request be limited" }'
                fill_interval:
                  seconds: 1
                quota: 10
              match:
                vhost:
                  name: bf2.example.com
                  port: 80
                  route:
                    name_match: productpage-route-name1
          isGateway: true
          workloadSelector:
            labels:
              istio: ingressgateway
  2. 在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
  3. 執行以下命令,訪問網關的/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服務受到限流。

  4. 執行以下命令,訪問網關的/nginx路徑。

    curl -H 'host: bf2.example.com'  http://${ASM_GATEWAY_IP}/nginx  -v

    返回結果中沒有429,說明訪問未限流。

情境二:對網關上網域名稱和連接埠的組合限流規則

bf2.example.com:80這個網域名稱和連接埠組合設定限流配置,使該網域名稱和連接埠組合下的所有路徑都受到流量限制。

  1. 配置限流規則。

    1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

    2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇流量管理中心 > 限流防護,然後單擊建立

    3. 建立頁面,按需進行以下配置,然後單擊確定

      關於配置項的詳情,請參見ASMLocalRateLimiter CRD說明

      配置地區

      配置項

      說明

      限流基本資料

      命名空間

      本地限流配置的命名空間,需要配置為限流生效的工作負載的所在命名空間。本樣本必須選擇istio-system,因為所有ASM網關都部署在istio-system命名空間。

      名稱

      本地限流配置的自訂名稱。本樣本填寫ingressgateway

      生效工作負載類型

      限流生效的工作負載類型,支援應用服務生效網關生效。本樣本選擇網關生效

      關聯工作負載

      在生效工作負載類型為網關生效的情況下,可以通過選擇網關規則的方式關聯工作負載,本地限流配置將與選中的網關規則關聯相同的網關工作負載。本樣本選擇bookinfo-gateway

      限流規則列表

      網關網域名稱

      選擇網關規則中聲明的網域名稱,限流規則將在指定的連接埠和網域名稱組合下生效。本樣本選擇bf2.example.com

      網關連接埠

      選擇網關規則中聲明的連接埠,限流規則將在指定的連接埠和網域名稱組合下生效。本樣本選擇80

      匹配虛擬服務路由項

      選擇與網關規則關聯的虛擬服務中聲明的路由項。限流規則將在指定的虛擬服務路由項之下生效。本樣本不進行選擇,表示在網域名稱和連接埠下的所有路由項上都生效限流規則。

      限流配置

      指定本地限流令牌桶演算法的檢測時間視窗長度與時間視窗內允許的請求數量。在時間視窗內發送的請求數量超過該允許的數量則會對請求進行限流。本樣本配置如下:

      • 限流檢測時間視窗填寫1秒

      • 時間視窗內允許請求數量填寫10

      以上配置表示發往此服務的工作負載的請求不得在1秒內連續發送10個以上。

      image.png

      以上配置對應的本地限流配置YAML如下。

      展開查看本地限流YAML

      apiVersion: istio.alibabacloud.com/v1beta1
      kind: ASMLocalRateLimiter
      metadata:
        name: ingressgateway
        namespace: istio-system
      spec:
        configs:
          - limit:
              fill_interval:
                seconds: 1
              quota: 10
            match:
              vhost:
                name: bf2.example.com
                port: 80
                route: {}
        isGateway: true
        workloadSelector:
          labels:
            istio: ingressgateway
  2. 在hey工具中執行以下命令,持續產生壓力流量。

    hey -host bf2.example.com -c 10 -n 100000 http://${ASM_GATEWAY_IP}/nginx
  3. 執行以下命令,訪問網關的/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服務。

  1. 配置限流規則。

    1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

    2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇流量管理中心 > 限流防護,然後單擊建立

    3. 建立頁面,按需進行以下配置,然後單擊確定

      關於配置項的詳情,請參見ASMLocalRateLimiter CRD說明

      配置地區

      配置項

      說明

      限流基本資料

      命名空間

      本地限流配置的命名空間,需要配置為限流生效的工作負載的所在命名空間。本樣本必須選擇istio-system,因為所有ASM網關都部署在istio-system命名空間。

      名稱

      本地限流配置的自訂名稱。本樣本填寫ingressgateway

      生效工作負載類型

      限流生效的工作負載類型,支援應用服務生效網關生效。本樣本選擇網關生效

      關聯工作負載

      在生效工作負載類型為網關生效的情況下,可以通過選擇網關規則的方式關聯工作負載,本地限流配置將與選中的網關規則關聯相同的網關工作負載。本樣本選擇bookinfo-gateway

      限流規則列表

      網關網域名稱

      選擇網關規則中聲明的網域名稱,限流規則將在指定的連接埠和網域名稱組合下生效。本樣本選擇bf2.example.com

      網關連接埠

      選擇網關規則中聲明的連接埠,限流規則將在指定的連接埠和網域名稱組合下生效。本樣本選擇80

      匹配虛擬服務路由項

      選擇與網關規則關聯的虛擬服務中聲明的路由項。限流規則將在指定的虛擬服務路由項之下生效。本樣本選擇路由項nginx-route-name1

      匹配請求屬性

      填寫生效限流配置的具體請求匹配規則。本樣本配置如下:

      • 匹配屬性選擇具體要求標頭

      • 要求標頭名稱填寫ratelimit

      • 匹配方法選擇精確匹配

      • 匹配內容填寫true

      限流配置

      指定本地限流令牌桶演算法的檢測時間視窗長度與時間視窗內允許的請求數量。在時間視窗內發送的請求數量超過該允許的數量則會對請求進行限流。本樣本配置如下:

      • 限流檢測時間視窗填寫1秒

      • 時間視窗內允許請求數量填寫10

      以上配置表示發往此服務的工作負載的請求不得在1秒內連續發送10個以上。

      image.png

      以上配置對應的本地限流配置YAML如下。

      展開查看本地限流YAML

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMLocalRateLimiter
      metadata:
        name: ingressgateway
        namespace: istio-system
      spec:
        configs:
          - limit:
              fill_interval:
                seconds: 1
              quota: 10
            match:
              vhost:
                name: bf2.example.com
                port: 80
                route:
                  header_match:
                    - exact_match: 'true'
                      invert_match: false
                      name: ratelimit
                  name_match: nginx-route-name1
        isGateway: true
        workloadSelector:
          labels:
            istio: ingressgateway
  2. 在hey工具中執行以下命令,持續產生壓力流量,請求都攜帶ratelimit: true的要求標頭以觸發限流。

    hey -host bf2.example.com -H 'ratelimit: true' -c 10 -n 10000 http://${ASM_GATEWAY_IP}/nginx
  3. 執行以下命令,訪問網關的/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要求標頭的請求受到了限流。

  4. 執行以下命令,訪問網關的/nginx路徑,但請求不攜帶ratelimit: true要求標頭。

    curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -v

    可以看到返回結果中沒有429,說明未攜帶ratelimit: true要求標頭的請求未受限流影響。

相關操作

刪除限流配置,恢複訪問

  1. 刪除限流規則。

    1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

    2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇流量管理中心 > 限流防護

    3. 限流防護頁面的操作列,單擊目標限流規則對應的刪除,在確認對話方塊,單擊確定

  2. 執行以下命令,訪問網關的/nginx路徑。

    curl -H 'host: bf2.example.com'  http://${ASM_GATEWAY_IP}/nginx -v

    返回結果中沒有429,說明訪問未限流。

相關文檔