2016-01-27 35 views
0

我正在研究編寫一個工具,以編程方式爲我們的項目生成Kubernetes定義。從Kubernetes類型生成YAML清單

我發現Kubernetes中的API類型可以在k8s.io/kubernetes/pkg/api中找到。我想根據這些類型輸出YAML。

鑑於這樣的對象:

ns := &api.Namespace{ 
    ObjectMeta: api.ObjectMeta{ 
     Name: "test", 
    }, 
} 

什麼是生成YAML輸出由kubectl create預期的最佳方式?

+0

嘗試使用yaml.v2庫並對其進行編組,查看輸出是否符合kubernetes。 https://github.com/go-yaml/yaml –

+0

這不起作用,Kubernetes沒有yaml註釋。他們似乎序列化爲JSON,然後轉換爲YAML,但是我還沒有找到合適的API將它包裝在正確的信封中(包括apiVersion和kind fields)。 –

+0

這是醜陋的,但你可能想要嘗試生成json和使用python來正確地格式化你的json作爲yaml –

回答

1

發現,以供將來參考,這裏是你可能想要做什麼:

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

這可能不是最好的做法(更好的建議,歡迎),但它的工作。

+0

作爲一個側面說明,如果你不打算手動維護這些可能是不必要的。 Kubernetes清單可以在json或yaml中定義。可以使用文件擴展名.yaml,.yml和.json。因此,如果您將輸出提供給'kubectl',那麼您可以將其編碼爲JSON並將其寫入'.json'文件。 https://kubernetes.io/docs/user-guide/kubectl-cheatsheet/ – jqualls