如何实现K8s CRD中四个可选字段的互斥性?
CRD字段互斥性与可选性实现方案
你之前的配置仅针对optionOne做了简单排除,未覆盖所有互斥场景,因此无法生效。要实现四个字段可选(可全不填)且互斥(最多填一个),需借助OpenAPI v3的oneOf规则,结合required和not覆盖所有合法场景:
正确的CRD字段验证配置
spec: validation: openAPIV3Schema: type: object properties: optionOne: type: string optionTwo: type: string optionThree: type: string optionFour: type: string oneOf: # 仅填写optionOne - required: ["optionOne"] allOf: - not: { required: ["optionTwo"] } - not: { required: ["optionThree"] } - not: { required: ["optionFour"] } # 仅填写optionTwo - required: ["optionTwo"] allOf: - not: { required: ["optionOne"] } - not: { required: ["optionThree"] } - not: { required: ["optionFour"] } # 仅填写optionThree - required: ["optionThree"] allOf: - not: { required: ["optionOne"] } - not: { required: ["optionTwo"] } - not: { required: ["optionFour"] } # 仅填写optionFour - required: ["optionFour"] allOf: - not: { required: ["optionOne"] } - not: { required: ["optionTwo"] } - not: { required: ["optionThree"] } # 四个字段全不填 - not: anyOf: - required: ["optionOne"] - required: ["optionTwo"] - required: ["optionThree"] - required: ["optionFour"]
配置说明
oneOf规则确保对象只能匹配其中一个分支,从根源上实现互斥逻辑;- 前四个分支分别对应"仅填写单个字段"的场景:用
required指定当前字段必填,同时通过not排除其他三个字段的存在; - 最后一个分支允许四个字段全不填,满足可选性要求。
如果你的CRD还有其他业务必填字段,只需将这些字段添加到properties中即可,上述互斥规则不会受影响。
内容的提问来源于stack exchange,提问作者Mykhailo Shyshov
相关产品推荐
相关产品推荐

