我正在尝试使用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强制执行请求大小限制的另一种方法?
答案 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,如果您认为这是必须的功能,请重新打开
希望这会有所帮助。