Я використовую https://github.com/kubernetes/client-go, і все працює добре.
У мене є маніфест (YAML) для офіційної інформаційної панелі Kubernetes: https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recomemed.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/isissue/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 і припускаю, що я можна надати власні загальні рішення.IOStreams, щоб отримати вихід?
Схоже, RunConvert перебуває на шляху депресії
Я також розглядав інші питання з тегом [client-go], але більшість використовують старі приклади або використовують файл YAML з окремим kind
визначеним, і API змінився з тих пір.
Редагувати: Оскільки мені потрібно це зробити для більш ніж одного кластеру і я створюю кластери програмно (AWS EKS API + CloudFormation / eksctl ), я хотів би мінімізувати накладні витрати на створення ServiceAccount
s у багатьох контекстах кластерів для багатьох облікових записів AWS. В ідеалі єдиним етапом аутентифікації, що бере участь у створенні мого набору клієнтів, є використання aws-iam-автентифікатора для отримання маркера за допомогою даних кластера (ім'я, регіон, сертифікат CA тощо). Протягом деякого часу не було випущено автентифікатор aws-iam, але вміст master
дозволяє використовувати роль сторонньої ролі між-облікових записів та зовнішній ідентифікатор. IMO, це чистіше, ніж використання ServiceAccount
(та IRSA), оскільки є інші сервіси AWS, з якими потрібно взаємодіяти з додатком (API, що створює та застосовує додатки до цих кластерів).
Редагувати: нещодавно я знайшов https://github.com/ericchiang/k8s . Це, безумовно, простіше у використанні, ніж клієнт, на високому рівні, але не підтримує таку поведінку.
^---$
у своєму коді?