如何反序列化Kubernetes YAML文件 [英] How to deserialize Kubernetes YAML file
问题描述
如何将Kubernetes YAML文件反序列化为Go结构?我查看了 kubectl
代码,但不知何故,每个YAML文件都会出错:
no kindDeployment已注册版本apps / v1beta1
这是一个MWE:
package main
import(
fmt
k8s.io/client-go/pkg/api
)
var service =`
apiVersion:apps / v1beta1
kind :部署
元数据:
名称:my-nginx
规格:
副本:2
模板:
元数据:
标签:
run:my-nginx
spec:
containers:
- name:my-nginx
image:nginx
ports:
- containerPort:80
func main(){
decode:= api.Codecs.UniversalDecoder()。解码
// decode:= api.Codecs.UniversalDeserializer()解码
$ b 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
导入:
- 包:k8s.io/client-go
版本:^ 2.0.0
这些是对 kubectl
的引用:
- https://github.com/kubernetes /kubernetes/blob/43ac38e29e6ecf83e78bc7c5d9f804310b051c95/pkg/kubectl/cmd/apply.go#L637
- https://github.com/kubernetes/kubernetes/blob/43ac38e29e6ecf83e78bc7c5d9f804310b051c95/pkg/kubectl/cmd/util /factory_client_access.go#L205-L213
不幸的是, 编辑: 其他资源类型也存在此问题: 您需要导入 完整的工作示例是: 使用以下 请注意,我还导入了 编辑:给我的同事的荣誉 Stefan Schimanski 谁提出了初步解决方案。 How can I deserialize a Kubernetes YAML file into an Go struct? I took a look into the This is an MWE: I am using client version These are the references to Unfortunately, the docs are very confusing to me, so I have no idea how to tackle this problem. Edit: This problem also exists with other resource types:
no kindService已注册版本v1
_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
:
包主
pre>
导入(
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
元数据:
名称:my-nginx
规格:
副本:2
模板:
元数据:
标签:
运行:my-nginx
spec:
containers:
- name:my-nginx
image:nginx
ports:
- containerPort:80
func main(){
// decode:= api.Codecs.UniversalDecoder()。解码
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。
kubectl
code, but somehow I get an error for every YAML file:no kind "Deployment" is registered for version "apps/v1beta1"
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
. The glide.yaml
looks like this:package: test/stackoverflow
import:
- package: k8s.io/client-go
version: ^2.0.0
kubectl
:
no kind "Service" is registered for version "v1"
You need to import _ "k8s.io/client-go/pkg/apis/extensions/install"
otherwise the schema is empty, see also docs.
The complete working example is:
$ go get -u github.com/golang/dep/cmd/dep
$ dep init
$ go run main.go
With the following 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)
}
Note that I also imported _ "k8s.io/client-go/pkg/api/install"
for you so that you can use objects in v1
such as pods or services.
EDIT: Kudos to my colleague Stefan Schimanski who proposed the initial solution.
这篇关于如何反序列化Kubernetes YAML文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!