Go 从Kubernetes类型生成YAML清单

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输出的最佳方法是什么?找到它,供将来参考,以下

我正在研究为我们的项目编写一个以编程方式生成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)
    }
}

这可能不是最佳做法(欢迎提供更好的建议),但它确实起到了作用。

他们的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