kubernetes 当使用messageExpression时,CEL成本预算超出,

5kgi1eie  于 6个月前  发布在  Kubernetes
关注(0)|答案(8)|浏览(68)

发生了什么?
我有一个CRD,其顶层规范模式中包含以下属性:

config:
  type: object
  x-kubernetes-validations:
    - messageExpression: '''invalid attempts: '' + string(self.attempts)'
      rule: self.attempts >= 0
  properties:
    attempts:
      type: integer
      maximum: 2147483647
      minimum: -2147483648

API服务器以以下错误拒绝CRD:

* spec.validation.openAPIV3Schema.properties[spec].properties[config].x-kubernetes-validations[0].messageExpression: Forbidden: estimated messageExpression cost exceeds budget by factor of more than 100x (try simplifying the rule, or adding maxItems, maxProperties, and maxLength where arrays, maps, and strings are declared)
* spec.validation.openAPIV3Schema.properties[spec].properties[config].x-kubernetes-validations[0].messageExpression: Forbidden: contributed to estimated rule cost total exceeding cost limit for entire OpenAPIv3 schema
* spec.validation.openAPIV3Schema: Forbidden: x-kubernetes-validations estimated rule cost total for entire OpenAPIv3 schema exceeds budget by factor of more than 100x (try simplifying the rule, or adding maxItems, maxProperties, and maxLength where arrays, maps, and strings are declared)

整个CRD包含一个CEL规则,仅在使用messageExpression进行验证时才会出现问题。

你觉得会发生什么?

我希望string(intValue)不会导致验证规则的成本预算超支。

我们如何尽可能精确地重现它?

使用与示例中显示的类似的模式。

我们需要了解其他信息吗?

  • 无响应*

Kubernetes版本

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"27", GitVersion:"v1.27.1", GitCommit:"4c9411232e10168d7b050c49a1b59f6df9d7ea4b", GitTreeState:"clean", BuildDate:"2023-04-14T13:21:19Z", GoVersion:"go1.20.3", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v5.0.1
Server Version: version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.2", GitCommit:"4b8e819355d791d96b7e9d9efe4cbafae2311c88", GitTreeState:"clean", BuildDate:"2024-02-14T22:24:00Z", GoVersion:"go1.21.7", Compiler:"gc", Platform:"linux/amd64"}
WARNING: version difference between client (1.27) and server (1.29) exceeds the supported minor version skew of +/-1

云提供商

Kind集群

OS版本

# On Linux:
$ cat /etc/os-release
# paste output here
$ uname -a
# paste output here

# On Windows:
C:\> wmic os get Caption, Version, BuildNumber, OSArchitecture
# paste output here

安装工具

容器运行时(CRI)和版本(如适用)

相关插件(CNI,CSI等)和版本(如适用)

wnavrhmk

wnavrhmk2#

@cici37 这是预期的吗?

kr98yfug

kr98yfug3#

/cc @jpbetz@jiahuif@cici37
/triage accepted
zlwx9yxi

zlwx9yxi4#

你能设置尝试次数的最大值,以便成本估算器不会做出最宽松的猜测吗?
例如:

config:
  type: object
  x-kubernetes-validations:
    - messageExpression: '''invalid attempts: '' + string(self.attempts)'
      rule: self.attempts >= 0
  properties:
    attempts:
      type: integer
      maximum: 100

即使如此,我认为在最大长度下,成本也应该不会超过单个整数格式化。

1rhkuytd

1rhkuytd5#

@jiahuif 鉴于这是一个int32类型,我们根据int32的范围设置最小值/最大值,因此 maximum: 2147483647 已经为此字段设置好了。
要求更新模式约束以使用 messageExpression,这需要 string(intVal),使得它变得非常不可用。

lg40wkob

lg40wkob6#

是的,我可以确认这个问题。如果没有最大值,整数可能会导致任何字符串转换超出成本。

wmvff8tz

wmvff8tz8#

是的,我可以确认这个问题。如果没有最大值,整数可能会导致任何字符串转换超出成本。
我甚至在 maximum: 2147483647 指定的情况下也看到了这个。

相关问题