istio设置请求大小限制-查找失败:“ request.size”

时间:2020-01-07 16:22:48

标签: istio

我正在尝试使用istio通过请求大小限制流量。鉴于虚拟服务不提供此服务,我想通过混合器策略来提供该服务。

我设置了以下内容

---
apiVersion: "config.istio.io/v1alpha2"
kind: handler
metadata:
  name: denylargerequest
spec:
  compiledAdapter: denier
  params:
    status:
      code: 9
      message: Request Too Large
---
apiVersion: "config.istio.io/v1alpha2"
kind: instance
metadata:
  name: denylargerequest
spec:
  compiledTemplate: checknothing
---
apiVersion: "config.istio.io/v1alpha2"
kind: rule
metadata:
  name: denylargerequest
spec:
  match: destination.labels["app"] == "httpbin" && request.size > 100
  actions:
    - handler: denylargerequest
      instances: [ denylargerequest ]

请求没有被拒绝,我从istio-mixer看到以下错误

2020-01-07T15:42:40.564240Z warn    input set condition evaluation error: id='2', error='lookup failed: 'request.size''

如果删除匹配的request.size部分,则会得到预期的行为,该行为是400 http状态,并带有有关请求大小的消息。当然,我会在所有不需要的请求上得到它。但是,随着上述错误,很清楚的是request.size属性是问题所在。

我在istio的文档中都没有看到搅拌机规则可以使用哪些属性。

我正在运行istio 1.3.0。

关于混合规则的任何建议吗?还是通过istio强制执行请求大小限制的另一种方法?

1 个答案:

答案 0 :(得分:0)

问题中提到的规则匹配:

match: destination.labels["app"] == "httpbin" && request.size > 100

由于属性类型不匹配而无法正常工作。

根据istio文档:

Match是基于属性的谓词。当Mixer收到请求时 它计算匹配表达式并执行所有关联的 actions,如果匹配结果为true。

一些匹配示例:

  • 空匹配的结果为true
  • true,布尔文字;会始终执行具有此匹配项的规则
  • match(destination.service.host, "ratings.*")选择任何以名称以“ ratings”开头的服务为目标的请求。
  • attr1 == "20" && attr2 == "30"逻辑AND,OR和NOT也可用

这意味着request.size > 100具有不受支持的整数值。


但是,可以借助通用表达语言CEL)。

您可以使用policy.istio.io/lang批注(将其设置为CEL)在istio中启用CEL。

然后通过使用Type Values中的List of Standard Definitions,我们可以使用函数将值解析为不同的类型。

只是建议。


另一种方法是像本github问题中那样使用envoyfilter过滤器。

根据另一个与Envoy的每个连接缓冲区限制有关的github问题:

当前解决方案是使用envoyfilter,如果您认为这是必须的功能,请重新打开

希望这会有所帮助。