此任务说明如何使用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清理说明以关闭该应用程序。