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。

清理

相关文章
相关标签/搜索