istio 0.8 服務限流配置

此任務說明如何使用Istio動態限制服務的流量。git

在你開始以前

  • 按照安裝指南中的快速入門說明在Kubernetes羣集中設置Istio 。github

  • 部署Bookinfo示例應用程序。express

  • 初始化應用程序版本路由以將reviews來自測試用戶「jason」的服務請求定向到版本v2,並未來自任何其餘用戶的請求定向到v3。api

$ istioctl create -f @samples/bookinfo/routing/route-rule-all-v1.yaml@

複製瀏覽器

將如下YAML代碼段保存爲route-rule-reviews-jason-v2-v3.yamlcookie

apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - match: - headers: cookie: regex: "^(.*?;)?(user=jason)(;.*)?$" route: - destination: host: reviews subset: v2 - route: - destination: host: reviews subset: v3

複製app

而後運行如下命令:ide

$ istioctl replace -f route-rule-reviews-jason-v2-v3.yaml

複製測試

若是您在先前的任務中設置了衝突規則,請使用istioctl replace而不是istioctl createui

速率限制

Istio使您能夠限制對服務的流量。

考慮ratings像RottenSigedes®這樣的外部付費服務,並提供1qps免費配額。使用Istio咱們能夠確保1qps不會被破壞。

  1. 將瀏覽器指向Bookinfo productpage(http:// $ GATEWAY_URL / productpage)。

    若是您以「jason」用戶身份登陸,則應在每次審覈時看到黑色評級星標,表示該ratings服務的「v2」版本正在調用該reviews服務。

    若是您以任何其餘用戶(或註銷)身份登陸,則應在每次審覈時看到紅色評級星標,表示該ratings服務的「v3」版本正在調用該reviews服務。

  2. 配置memquotaquotaruleQuotaSpecQuotaSpecBinding,使速率限制。

     

    $ istioctl create -f samples/bookinfo/routing/mixer-rule-ratings-ratelimit.yaml

    複製
  3. 確認memquota已建立:

     

    $ kubectl -n istio-system get memquota handler -o yaml

    apiVersion: config.istio.io/v1alpha2 kind: memquota metadata: name: handler namespace: istio-system spec: quotas: - name: requestcount.quota.istio-system maxAmount: 5000 validDuration: 1s overrides: - dimensions: destination: ratings source: reviews sourceVersion: v3 maxAmount: 1 validDuration: 5s - dimensions: destination: ratings maxAmount: 5 validDuration: 10s

    複製

memquota定義了3種不一樣的速率限制方案。若是沒有覆蓋匹配,則默認值爲5000每一個請求1s。還定義了兩個覆蓋。第一個是1請求,5s若是destinationratings,源是reviews,則sourceVersionv3。第二個是5請求,10s若是destination是的話ratings。拾取第一個匹配覆蓋(從上到下閱讀)。

  1. 確認quota已建立:

     

    $ kubectl -n istio-system get quotas requestcount -o yaml

    apiVersion: config.istio.io/v1alpha2 kind: quota metadata: name: requestcount namespace: istio-system spec: dimensions: source: source.labels["app"] | source.service | "unknown" sourceVersion: source.labels["version"] | "unknown" destination: destination.labels["app"] | destination.service | "unknown" destinationVersion: destination.labels["version"] | "unknown"

    複製

    quota模板定義4 dimensions被用來經過memquota設置關於請求匹配某些屬性來改寫。destination將在設置於第一非空值destination.labels["app"]destination.service"unknown"。有關表達式的更多信息能夠在這裏找到。

  2. 確認rule已建立:

     

    $ kubectl -n istio-system get rules quota -o yaml

    apiVersion: config.istio.io/v1alpha2 kind: rule metadata: name: quota namespace: istio-system spec: actions: - handler: handler.memquota instances: - requestcount.quota

    複製

    rule告訴混合器調用handler.memquota處理程序(上面建立),並經過它使用該實例構造的對象requestcount.quota(上述的組合也建立)。這有效地將維度從quota模板映射到memquota處理程序。

  3. 確認QuotaSpec已建立:

     

    $ kubectl -n istio-system get QuotaSpec request-count -o yaml

    apiVersion: config.istio.io/v1alpha2 kind: QuotaSpec metadata: name: request-count namespace: istio-system spec: rules: - quotas: - charge: "1" quota: requestcount

    複製

    QuotaSpec定義了quota咱們在上面建立的請求計數1

  4. 確認QuotaSpecBinding已建立:

     

    $ kubectl -n istio-system get QuotaSpecBinding request-count -o yaml

    kind: QuotaSpecBinding metadata: name: request-count namespace: istio-system spec: quotaSpecs: - name: request-count namespace: istio-system services: - name: ratings namespace: default - name: reviews namespace: default - name: details namespace: default - name: productpage namespace: default

    複製

    QuotaSpecBindingQuotaSpec咱們上面建立的綁定綁定到咱們想要應用它的服務。請注意,咱們必須爲每一個服務定義命名空間,由於它不在此QuotaSpecBinding資源部署到的同一命名空間中。

  5. productpage在瀏覽器中刷新。

    若是您已註銷,則評論-v3服務的速率限制爲每5秒1個請求。若是你不斷刷新頁面,星星應該每5秒加載一次。

    若是您以「jason」用戶身份登陸,則review-v2服務的速率限制爲每10秒5個請求。若是你不斷刷新頁面,星星應該每10秒加載5次。

    對於全部其餘服務,將應用默認的5000qps速率限制。

條件利率限制

在前面的示例中,咱們對ratings服務應用了速率限制,而不考慮非維度屬性。可使用配額規則中的匹配條件有條件地基於任意屬性應用速率限制。

例如,請考慮如下配置:

apiVersion: config.istio.io/v1alpha2 kind: rule metadata: name: quota namespace: istio-system spec: match: source.namespace != destination.namespace actions: - handler: handler.memquota instances: - requestcount.quota

複製

此配置將配額規則應用於源和目標命名空間不一樣的請求。

瞭解速率限制

在前面的示例中,咱們瞭解了Mixer如何將速率限制應用於符合特定條件的請求。

每一個命名的配額實例都requestcount表明一組計數器。該集由全部配額維度的笛卡爾積定義。若是最後一個expiration持續時間內的請求數超過maxAmount,則Mixer RESOURCE_EXHAUSTED會向代理返回一條消息。代理又將狀態返回HTTP 429給調用者。

所述memquota適配器使用子第二分辨率的滑動窗來執行速率限制。

maxAmount適配器配置設置與配額實例相關聯的全部計數器的缺省限制。若是配額覆蓋與請求不匹配,則應用此默認限制。Memquota選擇與請求匹配的第一個覆蓋。覆蓋不須要指定全部配額維度。在該示例中,0.2qps經過僅匹配四個配額維度中的三個來選擇覆蓋。

若是您但願對給定的命名空間強制執行上述策略而不是整個Istio網格,則可使用給定的命名空間替換全部出現的istio-system。

清理

相關文章
相關標籤/搜索