如何将Kubernetes YAML文件反序列化为Go结构?我看了一下kubectl代码,但不知何故我收到了每个YAML文件的错误:
kubectl
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如下所示:
2.0.0
glide.yaml
package: test/stackoverflow import: - package: k8s.io/client-go version: ^2.0.0
这些是对以下内容的引用kubectl:
不幸的是,文档使我非常困惑,所以我不知道如何解决这个问题。
编辑:
其他资源类型也存在此问题:
no kind "Service" is registered for version "v1"
您需要导入,_ "k8s.io/client- go/pkg/apis/extensions/install"否则架构为空,另请参阅docs。
_ "k8s.io/client- go/pkg/apis/extensions/install"
完整的工作示例是:
$ go get -u github.com/golang/dep/cmd/dep $ dep init $ go run main.go
具有以下内容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诸如Pod或Services之类的对象。
_ "k8s.io/client- go/pkg/api/install"
v1
编辑:对我的同事斯特凡·斯基曼斯基(Stefan Schimanski)提出了最初的解决方案表示感谢。