Я использую 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/ сериализатору
Это выставлено в клиенте - иди сюда: 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 находится на пути устаревания
Я также посмотрел на другие вопросы, помеченные [client-go], но большинство используют старые примеры или используют файл YAML с одним kind
определенным, и с тех пор API изменился.
Изменить: поскольку мне нужно сделать это для более чем одного кластера и создавать кластеры программно (AWS EKS API + CloudFormation / eksctl ), я хотел бы минимизировать накладные расходы на создание объектов ServiceAccount
во многих контекстах кластера, во многих учетных записях AWS. В идеале, единственным этапом аутентификации, связанным с созданием моего клиентского набора, является использование aws-iam-authenticator для получения токена с использованием данных кластера (имя, регион, сертификат CA и т. Д.). Некоторое время не было выпуска aws-iam-authenticator, но содержимое master
позволяет передавать стороннюю роль роли кросс-аккаунта и внешний идентификатор, который необходимо передать. ИМО, это чище, чем с помощью ServiceAccount
(и IRSA) потому что есть другие сервисы AWS, с которыми приложению (внутреннему API, который создает и применяет надстройки к этим кластерам) необходимо взаимодействовать.
Изменить: я недавно нашел https://github.com/ericchiang/k8s . Это определенно проще, чем client-go, на высоком уровне, но не поддерживает это поведение.
^---$
в своем коде?Ответы:
Похоже, вы выяснили, как десериализовать файлы YAML в Kubernetes
runtime.Object
, но проблема заключается в динамическом развертыванииruntime.Object
без написания специального кода для каждого вида.kubectl
достигает этого путем непосредственного взаимодействия с REST API . В частности, через resource.Helper .В моем коде у меня есть что-то вроде:
источник
package restmapper
этом, и это выглядит очень многообещающе. Принимая ответ на данный момент, но скоро вернусь к нему.