从 Kubernetes 类型生成 YAML 清单
Generate YAML manifest from Kubernetes types
我正在考虑编写一个工具,以编程方式为我们的项目生成 Kubernetes 定义。
我发现 Kubernetes 中的 API 类型可以在 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)
}
}
这可能不是最佳做法(欢迎提出更好的建议),但它确实有效。
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)
}
}
他们的 API 已经更新,所以它是这样的:
import k8sJson "k8s.io/apimachinery/pkg/runtime/serializer/json"
...
serializer := k8sJson.NewSerializerWithOptions(
k8sJson.DefaultMetaFactory, nil, nil,
k8sJson.SerializerOptions{
Yaml: true,
Pretty: true,
Strict: true,
},
)
我正在考虑编写一个工具,以编程方式为我们的项目生成 Kubernetes 定义。
我发现 Kubernetes 中的 API 类型可以在 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)
}
}
这可能不是最佳做法(欢迎提出更好的建议),但它确实有效。
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)
}
}
他们的 API 已经更新,所以它是这样的:
import k8sJson "k8s.io/apimachinery/pkg/runtime/serializer/json"
...
serializer := k8sJson.NewSerializerWithOptions(
k8sJson.DefaultMetaFactory, nil, nil,
k8sJson.SerializerOptions{
Yaml: true,
Pretty: true,
Strict: true,
},
)