定义需要以下字段之一或不需要字段的 Kubernetes 自定义资源

问题描述

我尝试定义一个新的自定义资源,要求它具有 (1) 字段 A、(2) 字段 B 或 (3) 空正文之一。

例如:{A: 1},{B: 1},{} 可以,但 {A:1,B:2} 不行。

这是我的自定义资源的 OpenApi 架构形式的定义:

foo:
  type: object
  properties:
    a:
     type: int
    b:
     type: int
  oneOf:
    - required: ["a"]
    - required: ["b"]
    # no sure how to include the empty body

我应该如何在 oneOf 约束中包含空体?

解决方法

OpenAPI 3.1

您可以使用 'null'(带引号)。

oneOf:
  - type: 'null'

或具有 null 类型属性的对象。

oneOf:
  - NullObjectExample:
    type: object
    properties:
      prop1:
        type: 'null'

OpenAPI 3.0

没有 null 类型,但您可以使用 nullable 字符串。您可能需要添加一个 description 声明它应该始终为空。

oneOf:
  - type: string
    nullable: true

或者,一个具有可为空字符串属性的对象。

oneOf:
  - NullObjectExample:
    type: object
    properties:
      prop1:
        type: string
        nullable: true

为什么没有空对象

除了没有明确意图之外,这还可能存在安全漏洞。有关说明,请参阅 this page。简而言之:

如果您没有明确定义架构并且将 JSON 负载的属性留空,那么您实际上允许攻击者传入任何数据。这意味着您正在向各种攻击开放您的后端,例如 SQL 注入。