验证具有嵌入式core.v1.PodSpec的CRD

时间:2019-05-08 15:36:37

标签: go kubernetes openapi

我正在开发带有CRD的控制器。 CRD包含我们的自定义内容以及嵌入式core.v1.PodSpec。 (v1.13.1)

我在CRD中定义了一个验证部分,该部分可以验证和实施对我们自定义字段的约束,但是我不知道如何为嵌入式PodSpec做到这一点。 PodSpec太大且选项太多,无法手动将其添加到CRD的validate部分:

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: mystuff.example.com
spec:
  group: mystuff.example.com
  versions:
    - name: v1alpha1
      served: true
      storage: true
  names:
    kind: MyStuff
    plural: mystuffs
    singular: mystuff
    shortNames:
    - ms
  scope: Namespaced
  additionalPrinterColumns:
  - JSONPath: .status.phase
    name: Status
    type: string
  - JSONPath: .metadata.resourceVersion
    name: Version
    type: string
  validation:
    openAPIV3Schema:
      properties:
        spec:
          required:
            - myVar1
            - myVar2
            - podSpec
          properties:
            myVar1:
              type: boolean
            myVar2:
              type: boolean
            # Here I need to validate a valid core.v1.PodSpec
            podSpec:
              type: core.v1.PodSpec

其他人如何处理这个问题?

我还需要验证用户可以提交工作负载的任何机制,即直接使用kube apiserver或使用kubectl。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

通常,CRD不允许放置对其他对象的引用。对此进行了讨论:https://github.com/kubernetes/kubernetes/issues/54579。决定不添加引用。

此注释中描述了解决方法:https://github.com/kubernetes/kubernetes/issues/54579#issuecomment-370372942 我没有使用过,但您可以尝试。

答案 1 :(得分:0)

执行CRD验证的方法有多种。如您所知,通过.validation进行静态验证是一种方法。另一种方法是通过ValidatingAdmissionWebhook执行动态。这允许您实现和部署服务器,Kubernetes API服务器将在资源准入之前调用该服务器。