为了账号安全,请及时绑定邮箱和手机立即绑定

将 YAML 清单解析为 Kubernetes []client。对象

将 YAML 清单解析为 Kubernetes []client。对象

Go
慕田峪4524236 2022-10-04 16:11:46
我有一个 YAML 文件,其中定义了各种类型的多个库伯内特资源(根据 YAML 规范分隔):---apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata:  # ...spec:  # ...---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:  # ...rules:  # ...---# etc现在,我想将此列表解析为实例切片,以便我可以应用一些筛选和转换,并最终使用client.ObjectmyClient.Patch( # myClient is a client.Client instance  ctx,  object,       # object needs to be a client.Object  client.Apply,  client.ForceOwnership,  client.FieldOwner("my.operator.acme.inc"),)但是,我无法弄清楚如何从YAML文档转到.以下内容使我几乎到达那里:[]client.Objectresults := make([]client.Object, 0)scheme := runtime.NewScheme()clientgoscheme.AddToScheme(scheme)apiextensionsv1beta1.AddToScheme(scheme)apiextensionsv1.AddToScheme(scheme)decode := serializer.NewCodecFactory(scheme).UniversalDeserializer().Decodedata, err := ioutil.ReadAll(reader)if err != nil {    return nil, err}for _, doc := range strings.Split(string(data), "---") {    object, gvk, err := decode([]byte(doc), nil, nil)    if err != nil {        return nil, err    }    // object is now a runtime.Object, and gvk is a schema.GroupVersionKind    // taken together, they have all the information I need to expose a    // client.Object (I think) but I have no idea how to actually construct a    // type that implements that interface    result = append(result, ?????)}return result, nil当然,我对其他解析器实现完全开放,但我没有发现任何能让我走得更远的东西。但这似乎一定是库伯内特斯世界中一个已解决的问题......那么我该怎么做呢?
查看完整描述

1 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

我终于能够让它工作了!操作方法如下:


import (

    "k8s.io/client-go/kubernetes/scheme"

    "sigs.k8s.io/controller-runtime/pkg/client"


    apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"

    apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"

)


func deserialize(data []byte) (*client.Object, error) {

    apiextensionsv1.AddToScheme(scheme.Scheme)

    apiextensionsv1beta1.AddToScheme(scheme.Scheme)

    decoder := scheme.Codecs.UniversalDeserializer()


    runtimeObject, groupVersionKind, err := decoder.Decode(data, nil, nil)

    if err != nil {

        return nil, err

    }


    return runtime

}

有几件事看起来很关键(但我不确定我的理解在这里是100%正确的):

  • 而声明的返回类型是 ,该元组返回的第一项实际上是 a,并且可以毫无问题地强制转换。decoder.Decode(runtime.Object, *scheme.GroupVersionKind, error)client.Object

  • 通过在添加组之前使用作为基线,我可以免费注册所有“标准”资源。scheme.Schemeapiextensions.k8s.io

  • 如果我使用 ,我会得到有关 的错误,并且返回的实例显示版本。不知道为什么会发生这种情况,或者为什么当我使用时它没有发生。scheme.Codecs.UniversalDecoder() no kind "CustomResourceDefinition" is registered for the internal version of group "apiextensions.k8s.io" in scheme "pkg/runtime/scheme.go:100"groupVersionKind__internalUniversalDeserializer()


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信