猿问

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

我有一个 YAML 文件,其中定义了各种类型的多个库伯内特资源(根据 YAML 规范分隔):---


apiVersion: apiextensions.k8s.io/v1

kind: CustomResourceDefinition

metadata:

  # ...

spec:

  # ...

---

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

  # ...

rules:

  # ...

---

# etc

现在,我想将此列表解析为实例切片,以便我可以应用一些筛选和转换,并最终使用client.Object


myClient.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.Object


results := make([]client.Object, 0)


scheme := runtime.NewScheme()

clientgoscheme.AddToScheme(scheme)

apiextensionsv1beta1.AddToScheme(scheme)

apiextensionsv1.AddToScheme(scheme)


decode := serializer.NewCodecFactory(scheme).UniversalDeserializer().Decode

data, 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

当然,我对其他解析器实现完全开放,但我没有发现任何能让我走得更远的东西。但这似乎一定是库伯内特斯世界中一个已解决的问题......那么我该怎么做呢?


慕田峪4524236
浏览 130回答 1
1回答

一只斗牛犬

我终于能够让它工作了!操作方法如下: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()
随时随地看视频慕课网APP

相关分类

Go
我要回答