1

我不确定标题是否是正确的术语..但我基本上想使用 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 deployment.create(obj) 来创建该部署)。

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

有没有办法自动做到这一点?或目前存在的一些辅助功能?

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

4

2 回答 2

3

我认为,您可以简单地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))
}

希望它会有所帮助。

于 2018-12-08T11:22:43.280 回答
1

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

scheme := runtime.NewScheme()
corev1.AddToScheme(scheme)
codec := serializer.NewCodecFactory(scheme).LegacyCodec(corev1.SchemeGroupVersion)
output, _ := runtime.Encode(codec, stripped)
于 2020-11-10T15:50:57.537 回答