亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 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 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號