Kubernetes client-go库是否包含用于验证json/yaml文件的函数?

slhcrj9b  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(2)|浏览(141)

我想知道Kubernetes的client-go库是否包含一个函数来验证一个json/yaml文件。理想情况下,它会捕捉错误,比如名称不符合DNS-1123或者指定了无效字段。如果返回一个错误列表,而不是在遇到第一个错误后返回函数,这也是理想的。
我尝试过的一个想法是执行一个exec来调用kubectl --validate --dry-run,但这并不能完全验证一个清单(这意味着在这里传递是可能的,但在实际应用文件时失败了)。它也会在第一个错误处停止。另外,如果你有一个清单列表要检查,它会很快变得昂贵。
我看到的另一个选项是Kubernetes GitHub Issue 193,但这不是真正合适的函数,也不执行我正在寻找的检查。

kfgdxczn

kfgdxczn1#

Kubernetes的Client-go库不包含YAML/JSON配置文件的验证函数。
但是看一下这个utiliy,您可以使用它在客户端进行验证,也可以使用它的代码作为验证实现的示例。

qoefvg9y

qoefvg9y2#

You can take k8s.io/kubernetes/pkg/apis/apps/validation and k8s.io/kubernetes/pkg/apis/core/validation using this script:
如果 没有 设置 , 则 会 设置 管道 失败 的 版本 。然后 回 显 " 必须 指定 版本 ! " 退出 1| sed - n 的|* * * * * * * * * * * * | k8s.io/\1|在 " ${MODS [@]} " 中 为 MOD 指定 了 一 个 参数 ( p ' ) ) ;执行 V = $( 转到 mod 下载 - json " ${MOD}@kubernetes - ${版本} "| sed - n 的|. * " 版本 " :"\(.\)".*| \1| p ' ) 执行 修改 编辑 " - 替换 = ${MOD} = ${MOD}@${V} " 完成 , 执行 获取 " k8s.io/kubernetes@v ${VERSION} "
然后 , 您 可以 编写 这样 的 测试 来 验证 带有 服务 和 部署 的 清单 :
import ( "github.com/stretchr/testify/assert" appsV1 "k8s.io/api/apps/v1" coreV1 "k8s.io/api/core/v1" "k8s.io/client-go/kubernetes/scheme" kubernetesApps "k8s.io/kubernetes/pkg/apis/apps" kubernetesAppsV1 "k8s.io/kubernetes/pkg/apis/apps/v1" kubernetesAppsValidation "k8s.io/kubernetes/pkg/apis/apps/validation" kubernetesCore "k8s.io/kubernetes/pkg/apis/core" kubernetesCoreV1 "k8s.io/kubernetes/pkg/apis/core/v1" kubernetesCoreValidation "k8s.io/kubernetes/pkg/apis/core/validation" "strings" "testing" "text/template" ) const RedisTemplate = --- apiVersion: v1 kind: Service metadata: name: redis spec: type: ClusterIP internalTrafficPolicy: Cluster sessionAffinity: None ports: - name: redis-port protocol: TCP port: 6379 targetPort: 6379 --- apiVersion: apps/v1 kind: Deployment metadata: name: redis .... func Test_RedisManifest(t *testing.T) { for _, m := range strings.Split(RedisTemplate, "---") { if len(strings.Trim(m, "\n")) == 0 { continue } obj, _, err := scheme.Codecs.UniversalDeserializer().Decode([]byte(m), nil, nil) assert.NoError(t, err) assert.NotEmptyf(t, obj.GetObjectKind().GroupVersionKind().Kind, "parsed k8s object kind is empty") if service, ok := obj.(*coreV1.Service); ok { kubernetesService := &kubernetesCore.Service{} conversionErr := kubernetesCoreV1.Convert_v1_Service_To_core_Service(service, kubernetesService, nil) assert.NoError(t, conversionErr) kubernetesService.ObjectMeta.Namespace = "default" validationErrs := kubernetesCoreValidation.ValidateService(kubernetesService) assert.Empty(t, validationErrs) } if deployment, ok := obj.(*appsV1.Deployment); ok { kubernetesDeployment := &kubernetesApps.Deployment{} conversionErr := kubernetesAppsV1.Convert_v1_Deployment_To_apps_Deployment(deployment, kubernetesDeployment, nil) assert.NoError(t, conversionErr) kubernetesDeployment.ObjectMeta.Namespace = "default" validationErrs := kubernetesAppsValidation.ValidateDeployment(kubernetesDeployment, kubernetesCoreValidation.PodValidationOptions{}) assert.Empty(t, validationErrs) } } }
我 认为 这种 方法 有 以下 缺点 :

  1. Direct import of k8s.io/kubernetes is not recommended by K8s team.
  2. Direct import of k8s.io/kubernetes can create a troubles in the future.
    1.验证 函数 ValidateService 和 ValidateDeployment 要求 namespace 、 internalTrafficPolicy 、 sessionAffinity 等 可选 字段 必须 有 值 。 可能 还有 其他 函数 可以 用 默认 值 填充 可选 字段 , 但 我 目前 还 没有 找到 。
    谢谢

相关问题