K8s Go客户端将对象转换为Kubectl资源Yamls

时间:2018-12-08 04:08:14

标签: kubernetes kubectl kubernetes-go-client

我不确定标题是否是正确的术语。.但是我基本上想使用go-client并获取与kubectl兼容的对象(yamls)。

即部署资源为:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80

我可以通过go-client从k8s集群中进行部署,例如:

    Deployments, err := clientset.AppsV1().Deployments().List(metav1.ListOptions{})
    //and then loop through each deployment:
    for _, deploy := range Deployments.Items{
     //deploy is type v1.Deployment
    }

如果我要封送部署并保存到文件中,则结构为:

type Deployment struct {
    v1.TypeMeta    `json:",inline"`
    v1.ObjectMeta  `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
    Spec              DeploymentSpec    `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
    Status            DeploymentStatus  `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}

显然与kubectl文件所期望的有很大不同。

(尽管我可以使用go-client部署。create(obj)创建该部署)。

如果我想创建一个kubectl有效资源,我 可以 创建一个遵循该类型的自定义结构,然后手动填写值。

有什么办法可以自动执行此操作?或当前有一些辅助功能?

本质上,我想将v1.Deployment结构转换为通用的kubectl yaml资源。

2 个答案:

答案 0 :(得分:0)

我认为,您只需将struct编组并获得Yaml。

我使用"github.com/ghodss/yaml"进行结构封送处理。请将此内容包含在导入中。

Deployments, err := clientset.AppsV1().Deployments().List(metav1.ListOptions{})
//and then loop through each deployment:
for _, deploy := range Deployments.Items{
    y, err := yaml.Marshal(deploy)
    if err != nil {
       panic(err)
    }
    fmt.Println("deployment print in yaml: ", string(y))
}

希望会有所帮助。

答案 1 :(得分:0)

以下是我使用类似kubectl的结构将对象编码为json的方法。如下所示,这是专门针对CoreV1中的对象的,但是您可以使用所使用的方案轻松注册其他api。

scheme := runtime.NewScheme()
corev1.AddToScheme(scheme)
codec := serializer.NewCodecFactory(scheme).LegacyCodec(corev1.SchemeGroupVersion)
output, _ := runtime.Encode(codec, stripped)