Kubernetes K8s Go客户端将对象转换为kubectl资源YAML

Kubernetes K8s Go客户端将对象转换为kubectl资源YAML,kubernetes,kubectl,kubernetes-go-client,Kubernetes,Kubectl,Kubernetes Go Client,我不确定标题是否是正确的术语。但我基本上希望使用go客户端并获得符合kubectl的对象(YAML) i、 e部署资源将是: apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata

我不确定标题是否是正确的术语。但我基本上希望使用go客户端并获得符合kubectl的对象(YAML)

i、 e部署资源将是:

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客户端从我的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 deployment.create(obj)来创建部署)

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

有没有什么方法可以自动做到这一点?或者当前存在的一些帮助器函数


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

我认为,您可以简单地封送
结构并获取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))
}

希望能有所帮助。

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

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

嘿@abu不幸的是,这不起作用,因为封送部署会将其封送到v1.Deployment,而v1.Deployment不是有效的kubectl资源