Go 从Kubernetes类型生成YAML清单
我正在研究为我们的项目编写一个以编程方式生成Kubernetes定义的工具 我发现Kubernetes中的API类型可以在Go 从Kubernetes类型生成YAML清单,go,kubernetes,Go,Kubernetes,我正在研究为我们的项目编写一个以编程方式生成Kubernetes定义的工具 我发现Kubernetes中的API类型可以在k8s.io/Kubernetes/pkg/API中找到。我想根据这些类型输出YAML 给定这样一个对象: ns := &api.Namespace{ ObjectMeta: api.ObjectMeta{ Name: "test", }, } 生成kubectl create所需YAML输出的最佳方法是什么?找到它,供将来参考,以下
k8s.io/Kubernetes/pkg/API
中找到。我想根据这些类型输出YAML
给定这样一个对象:
ns := &api.Namespace{
ObjectMeta: api.ObjectMeta{
Name: "test",
},
}
生成kubectl create所需YAML输出的最佳方法是什么?找到它,供将来参考,以下是您可能需要执行的操作:
package main
import (
"os"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/runtime/serializer/json"
)
func main() {
ns := &v1.Namespace{
TypeMeta: unversioned.TypeMeta{
Kind: "Namespace",
APIVersion: "v1",
},
ObjectMeta: v1.ObjectMeta{
Name: "test",
},
}
e := json.NewYAMLSerializer(json.DefaultMetaFactory, nil, nil)
err := e.EncodeToStream(ns, os.Stdout)
if err != nil {
panic(err)
}
}
这可能不是最佳做法(欢迎提供更好的建议),但它确实起到了作用。他们的API已经更新,所以看起来是这样的:
package main
import (
"os"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/serializer/json"
)
func main() {
ns := &v1.Namespace{
TypeMeta: metav1.TypeMeta{
Kind: "Namespace",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "test",
},
}
e := json.NewYAMLSerializer(json.DefaultMetaFactory, nil, nil)
//err := e.EncodeToStream(ns, os.Stdout)
err := e.Encode(ns, os.Stdout)
if err != nil {
panic(err)
}
}
import k8sJson "k8s.io/apimachinery/pkg/runtime/serializer/json"
...
serializer := k8sJson.NewSerializerWithOptions(
k8sJson.DefaultMetaFactory, nil, nil,
k8sJson.SerializerOptions{
Yaml: true,
Pretty: true,
Strict: true,
},
)
尝试yaml.v2库并使用它封送,查看输出是否符合kubernetes。这行不通,Kubernetes没有yaml注释。它们似乎序列化为JSON,然后转换为YAML,但我还没有找到合适的API将其全部封装在正确的信封中(包括apiVersion和kind字段)。这很难看,但您可能希望尝试生成JSON并使用python将JSON正确格式化为yamlAs作为旁注,如果您不打算手动维护这些功能,那么这可能是不必要的。Kubernetes清单可以在json或yaml中定义。可以使用文件扩展名.yaml、.yml和.json。因此,如果要将输出提供给
kubectl