Использование client-go для `kubectl apply` против API Kubernetes напрямую с несколькими типами в одном файле YAML - PullRequest
1 голос
/ 10 ноября 2019

Я использую https://github.com/kubernetes/client-go и все работает хорошо.

У меня есть манифест (YAML) для официальной панели инструментов Kubernetes: https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml

Я хочу имитироватьkubectl apply этого манифеста в коде Go с использованием client-go.

Я понимаю, что мне нужно выполнить некоторое (не) маршалинг байтов YAML в правильные типы API, определенные в пакете: https://github.com/kubernetes/api

Я успешно Create ввел отдельные типы API в мой кластер, , но как мне сделать это для манифеста, который содержит список типов, которые не совпадают ? Есть ли ресурс kind: List*, который поддерживает эти различные типы?

Моя текущая задача - разделить файл YAML, используя csplit с --- в качестве разделителя

csplit /path/to/recommended.yaml /---/ '{*}' --prefix='dashboard.' --suffix-format='%03d.yaml'

ДалееЯ перебираю новые (14 частей), которые были созданы, читаю их байты, включаю тип объекта, возвращаемого декодером UniversalDeserializer, и вызываю правильные методы API, используя мой клиентский набор k8s.

Я хотел бысделать это, чтобы программно вносить обновления в любые новые версии панели мониторинга в мой кластер. Мне также нужно будет сделать это для Metrics Server и многих других ресурсов. Альтернативный (возможно, более простой) метод - отправить мой код с установленным kubectl в образ контейнера и напрямую вызвать kubectl apply -f -;но это означает, что мне также нужно записать конфигурацию kube на диск или, возможно, передать ее в строку, чтобы kubectl мог использовать ее.

Я нашел эту проблему полезной: https://github.com/kubernetes/client-go/issues/193 Декодер живет здесь:https://github.com/kubernetes/apimachinery/tree/master/pkg/runtime/serializer

Он доступен в клиенте иди сюда: https://github.com/kubernetes/client-go/blob/master/kubernetes/scheme/register.go#L69

Я также взглянул на метод RunConvert, который используется kubectl: https://github.com/kubernetes/kubernetes/blob/master/pkg/kubectl/cmd/convert/convert.go#L139 ипредположим, что я могу предоставить свои собственные genericclioptions.IOStreams для получения выходных данных?

Похоже, что RunConvert находится на пути устаревания

I 'Мы также рассмотрели другие вопросы, помеченные [client-go], но большинство используют старые примеры или используют файл YAML с определенным одиночным kind, и с тех пор API изменился.

...