Kubernetes CRD数组对象必填name字段验证不生效问题排查
嘿,我来帮你排查这个CRD验证失效的问题!这种必填字段不生效的情况,大概率是配置细节或者应用环节出了问题,你可以按下面的步骤逐一排查:
检查
required字段的语法正确性
你贴的配置里required: - name的内容明显是写错了,这应该是最核心的问题。正确的写法是直接把字段名name作为数组元素,而且required要和properties同级嵌套在items的object定义下。修正后的配置应该是这样:vc: type: array items: type: object properties: name: type: string address: type: string required: - name一定要确保这里没有拼写错误,比如字段名写错、缩进不对(YAML对缩进敏感)。
确认CRD已正确应用到集群
很多时候我们修改了本地配置,但忘记重新apply到集群,或者apply时的语法错误导致配置没生效。你可以用这个命令导出集群中当前的CRD定义:kubectl get crd <你的CRD名称> -o yaml然后检查
spec.validation.openAPIV3Schema下对应的vc字段配置,是不是和你本地的修正后配置一致。如果不一致,重新apply修正后的CRD文件,注意看kubectl返回的信息,有没有报错。检查Kubernetes版本的验证支持情况
Kubernetes对OpenAPI v3验证规则的支持是逐步完善的,1.20及以后的版本对必填字段这类基础规则的支持更稳定。如果你的集群版本低于1.20,可能存在兼容性问题,建议升级到稳定版本,或者查阅对应版本的官方文档确认CRD验证的支持范围。用正确的方式测试自定义资源
测试的时候别加--validate=false参数,这个会直接跳过Kubernetes的验证逻辑。直接用标准命令创建/更新资源:kubectl apply -f <你的自定义资源YAML文件>如果验证规则生效,当vc数组里的结构体缺少name字段时,应该会返回类似
error: error validating "<file>": error validating data: ValidationError(...): missing required field "name" in ...的错误提示。排查是否有其他验证规则干扰
检查你的CRD里有没有设置x-kubernetes-preserve-unknown-fields: true,如果这个字段错误地设置在vc的items层级,可能会影响验证逻辑的执行。另外,如果你的CRD里有自定义的x-kubernetes-validations规则,也要确认这些规则没有和必填字段的验证冲突。本地先验证Schema语法
可以用OpenAPI Schema的验证工具先在本地检查你的配置语法是否合规,比如用Python的openapi-spec-validator库,避免因为Schema本身的语法错误,导致Kubernetes无法正确解析验证规则。
内容的提问来源于stack exchange,提问作者sacboy

