Клиент 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))
}
Надеюсь, это поможет.