Я использую 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 изменился.