Клиент K8s Go конвертирует объекты в ресурсы yubls kubectl - PullRequest
0 голосов
/ 08 декабря 2018

Я не уверен, что название соответствует правильной терминологии. Но я в основном хочу использовать 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

Я могу получить развертывания из моего кластера k8s через go-client, например, так:

    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 deploy.create (obj) для создания этого развертывания).

Если бы я хотел создать допустимый ресурс kubectl, я мог бы создать пользовательскую структуру, соответствующую этому типу, а затем вручную заполнить значения.

Есть ли способ сделать это автоматически?или какие-то вспомогательные функции, которые есть в настоящее время?

по сути, я хочу преобразовать структуру v1.Deployment в общий ресурс kamectl yaml.

1 Ответ

0 голосов
/ 08 декабря 2018

Я думаю, вы можете просто маршалировать 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))
}

Надеюсь, это поможет.

...