istio 0.8 服务限流配置

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

此任务说明如何使用Istio动态限制服务的流量。

在你开始之前

  • 按照安装指南中的快速入门说明在Kubernetes群集中设置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不会被破坏。

  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。

清理

  • 删除速率限制配置:

     

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

    复制
  • 删除应用程序路由规则:

     

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

    复制
  • 如果您不打算探索任何后续任务,请参阅Bookinfo清理说明以关闭该应用程序。

 

转载于:https://my.oschina.net/xiaominmin/blog/1858577

你可能感兴趣的:(istio 0.8 服务限流配置)