Клиент K8s Go конвертирует объекты в ресурсы yubls kubectl

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

Ниже приведен способ, которым я кодирую объекты в json со структурой, подобной kubectl. Как показано ниже, это специально для объектов из CoreV1, но вы можете легко зарегистрировать другие API с использованной схемой.

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

Я думаю, вы можете просто маршал struct и получите ямл

я использовал "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))
}

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

Другие вопросы по тегам