发生了什么?
我有一个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
8条答案
按热度按时间r6vfmomb1#
/sig api-machinery
wnavrhmk2#
@cici37 这是预期的吗?
kr98yfug3#
zlwx9yxi4#
你能设置尝试次数的最大值,以便成本估算器不会做出最宽松的猜测吗?
例如:
即使如此,我认为在最大长度下,成本也应该不会超过单个整数格式化。
1rhkuytd5#
@jiahuif 鉴于这是一个int32类型,我们根据int32的范围设置最小值/最大值,因此
maximum: 2147483647
已经为此字段设置好了。要求更新模式约束以使用
messageExpression
,这需要string(intVal)
,使得它变得非常不可用。lg40wkob6#
是的,我可以确认这个问题。如果没有最大值,整数可能会导致任何字符串转换超出成本。
rqdpfwrv7#
/assign
wmvff8tz8#
是的,我可以确认这个问题。如果没有最大值,整数可能会导致任何字符串转换超出成本。
我甚至在
maximum: 2147483647
指定的情况下也看到了这个。