2017-06-01 188 views
1

如何將Kubernetes YAML文件反序列化爲Go結構?我接過來一看進入kubectl代碼,但不知何故,我得到一個錯誤,每YAML文件:如何反序列化Kubernetes YAML文件

no kind "Deployment" is registered for version "apps/v1beta1" 

這是一個MWE:

package main 

import (
    "fmt" 

    "k8s.io/client-go/pkg/api" 
) 

var service = ` 
apiVersion: apps/v1beta1 
kind: Deployment 
metadata: 
    name: my-nginx 
spec: 
    replicas: 2 
    template: 
    metadata: 
     labels: 
     run: my-nginx 
    spec: 
     containers: 
     - name: my-nginx 
     image: nginx 
     ports: 
     - containerPort: 80 
` 

func main() { 
    decode := api.Codecs.UniversalDecoder().Decode 
    //decode := api.Codecs.UniversalDeserializer().Decode 

    obj, _, err := decode([]byte(service), nil, nil) 
    if err != nil { 
     panic(err) 
    } 

    fmt.Printf("%#v\n", obj) 
} 

我使用的客戶端版本2.0.0。該glide.yaml看起來是這樣的:

package: test/stackoverflow 
import: 
- package: k8s.io/client-go 
    version: ^2.0.0 

這些都是kubectl引用:

不幸的是,docs都非常混亂給我,所以我有不知道如何解決這個問題。

編輯:

這個問題也與其他資源類型的存在:

  • no kind "Service" is registered for version "v1"
+0

想給Go試試嗎? https://hackernoon.com/using-go-dep-as-a-project-maintainer-641d1f3006d7 –

+0

這與依賴管理無關。 – svenwltr

+0

是的,我知道(因此我的回答如下),但試圖鼓勵人們轉向更具前景的替代方案;) –

回答

2

需要導入_ "k8s.io/client-go/pkg/apis/extensions/install"否則架構爲空,也見docs

完整的工作的例子是:

$ go get -u github.com/golang/dep/cmd/dep 
$ dep init 
$ go run main.go 

用下面main.go

package main 

import (
    "fmt" 

    "k8s.io/client-go/pkg/api" 
    _ "k8s.io/client-go/pkg/api/install" 
    _ "k8s.io/client-go/pkg/apis/extensions/install" 
) 

var deployment = ` 
apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
name: my-nginx 
spec: 
replicas: 2 
template: 
    metadata: 
    labels: 
     run: my-nginx 
    spec: 
    containers: 
    - name: my-nginx 
     image: nginx 
     ports: 
     - containerPort: 80 
` 

func main() { 
    // decode := api.Codecs.UniversalDecoder().Decode 
    decode := api.Codecs.UniversalDeserializer().Decode 

    obj, _, err := decode([]byte(deployment), nil, nil) 
    if err != nil { 
     fmt.Printf("%#v", err) 
    } 

    fmt.Printf("%#v\n", obj) 
} 

請注意,我還進口_ "k8s.io/client-go/pkg/api/install"給你,讓你可以在v1使用的對象,如豆莢或服務。

編輯:我的同事Stefan Schimanski誰提出了初步解決方案的榮譽。

+0

哇。這是非常神奇的;-)另一方面,這是可以理解的,如果你想要一個可擴展的系統。我猜文檔是可以改進的。謝謝! – svenwltr

+0

真的非常接近魔術,在斯蒂芬來救援之前,我有一段時間在我身邊徘徊了一會兒。該文件需要大量改進,同意! –

+0

嗨@MichaelHausenblas,我試圖做這個工作(解析一個k8s yaml使用Go結構),但不能使它與dep(或vndr)一起工作。複製你完全相同的例子,並運行「dep init」會得到:沒有版本的k8s.io/apimachinery遇到約束: \t master:無法更新簽出版本::命令失敗:[git checkout 1168e538ea3ccf444854d1fdd5681d2d876680a7]:退出狀態128 \t(下一條評論) –