此任务说明如何使用Istio动态限制服务的流量。
在你开始之前
-
部署Bookinfo示例应用程序。
-
初始化应用程序版本路由以将
reviews
来自测试用户“jason”的服务请求定向到版本v2,并将来自任何其他用户的请求定向到v3。
$ istioctl create -f @samples/bookinfo/routing/route-rule-all-v1.yaml@
复制
将以下YAML代码段保存为route-rule-reviews-jason-v2-v3.yaml
:
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
复制
然后运行以下命令:
$ istioctl replace -f route-rule-reviews-jason-v2-v3.yaml
复制
如果您在先前的任务中设置了冲突规则,请使用
istioctl replace
而不是istioctl create
。
速率限制
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
模板定义4dimensions
被用来通过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清理说明以关闭该应用程序。