从 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,
    },
)