1

我创建了一个CRD这样的:

import v1 "k8s.io/api/core/v1"

type ApplicationSpec struct {
    Name string `json:"name"`

    PodSpec v1.PodSpec `json:"podSpec"`

    ...
}

请注意,我PodSpec在 CRD 中重用了核心 apigroup

为了避免用户应用无效的 yaml 文件,我决定在我的 CRD 控制器中添加验证逻辑,对于像这样的简单字段Name,使用正则表达式很容易检查它的正确性,而对于像这样的复杂和原生类型PodSpec,因为 k8s 已经有验证逻辑,我觉得正确的方法是在我的控制器中重用它,但我该怎么做呢?

4

2 回答 2

2

您可以直接重用上游ValidatePodSpec

您需要先导入几个包:

import (
    "k8s.io/kubernetes/pkg/apis/core/validation"
    "k8s.io/apimachinery/pkg/util/validation/field"
)

然后ValidatePodSpec在你的控制器方法中使用:

errs := validation.ValidatePodSpec(instance.podSpec, field.NewPath("podSpec"))
于 2020-04-09T14:06:41.303 回答
0

还希望将这样的功能作为库提供。有一条关于go get用于k8s.io/kubernetes上游的评论。 https://github.com/kubernetes/kubernetes/issues/80316#issuecomment-512991205 PodTemplateSpec 使用错误配置导致的问题可以在这里找到https://github.com/googleforgames/agones/issues/1298 即:我们成功创建了一个 CRD,但是后来它变得不健康,因为无法创建 pod。

于 2020-04-10T13:33:41.387 回答