此任務說明如何使用Istio動態限制服務的流量。git
部署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.yaml
:cookie
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 create
。ui
Istio使您能夠限制對服務的流量。
考慮ratings
像RottenSigedes®這樣的外部付費服務,並提供1qps
免費配額。使用Istio咱們能夠確保1qps
不會被破壞。
將瀏覽器指向Bookinfo productpage
(http:// $ GATEWAY_URL / productpage)。
若是您以「jason」用戶身份登陸,則應在每次審覈時看到黑色評級星標,表示該ratings
服務的「v2」版本正在調用該reviews
服務。
若是您以任何其餘用戶(或註銷)身份登陸,則應在每次審覈時看到紅色評級星標,表示該ratings
服務的「v3」版本正在調用該reviews
服務。
配置memquota
,quota
,rule
,QuotaSpec
,QuotaSpecBinding
,使速率限制。
$ istioctl create -f samples/bookinfo/routing/mixer-rule-ratings-ratelimit.yaml
確認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
若是destination
是ratings
,源是reviews
,則sourceVersion
是v3
。第二個是5
請求,10s
若是destination
是的話ratings
。拾取第一個匹配覆蓋(從上到下閱讀)。
確認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"
。有關表達式的更多信息能夠在這裏找到。
確認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
處理程序。
確認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
。
確認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
這QuotaSpecBinding
將QuotaSpec
咱們上面建立的綁定綁定到咱們想要應用它的服務。請注意,咱們必須爲每一個服務定義命名空間,由於它不在此QuotaSpecBinding
資源部署到的同一命名空間中。
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。
刪除速率限制配置:
$ istioctl delete -f samples/bookinfo/routing/mixer-rule-ratings-ratelimit.yaml
刪除應用程序路由規則:
$ istioctl delete -f samples/bookinfo/routing/route-rule-all-v1.yaml
若是您不打算探索任何後續任務,請參閱Bookinfo清理說明以關閉該應用程序。