Создать Image Pull Secret из другого секрета или Copy Secret из другого пространства имен

Кажется, у меня есть проблема, которую я не могу решить хорошо. У меня есть кластер Kubernetes, работающий на GCP, и пользовательская диаграмма HELM helm/foo. У меня есть несколько экземпляров диаграммы, работающих с разными именами, и мне нужно изменить их, чтобы каждый работал в своем собственном пространстве имен. Не очень сложно, так как это всего лишь параметр для управления:

helm install --name bar --namespace bar helm/foo

Внутри диаграммы есть несколько вещей, среди которых развертывание с предоставленным imagePullSecret:

imagePullSecret: scrt

Это хорошо работает при развертывании в пространстве имен по умолчанию, точнее, в том же пространстве имен, в котором находится секрет. Но происходит сбой, когда пространство имен предоставляется, так как пространство имен "bar" не имеет доступа к "scrt", которое находится в пространстве имен по умолчанию.

Чтобы решить эту проблему, многие источники делают что-то вроде этого: https://stackoverflow.com/questions/46297949/kubernetes-sharing-secret-across-namespaces где секрет копируется между пространствами имен. Это хорошее решение, если у вас есть сценарий, запускающий все шоу, но для меня это невозможно, так как Terraform развернул N экземпляров рулевого управления / теста диаграммы.

Итак, мой вопрос: как я могу создать новый imagePullSecret из существующего, используя только helm/yaml? Я мог бы упаковать файл json в таблицу, но хотел бы избежать секретов за пределами K8.

Спасибо!

1 ответ

Решение

Краткий ответ: не стоит.

Вам следует перейти к декларативному управлению объектами Kubernetes с помощью файлов конфигурации, которые могут помочь вам понять, как использовать Kubernetes.

Объекты Kubernetes можно создавать, обновлять и удалять, храня несколько файлов конфигурации объектов в каталоге и используя kubectl apply рекурсивно создавать и обновлять эти объекты по мере необходимости. Этот метод сохраняет записи, сделанные для живых объектов, без объединения изменений в файлы конфигурации объекта.

Обычно это невозможно, потому что, как вы указали в Kubernetes - делиться секретом между пространствами имен, secret привязан к пространству имен и на него можно ссылаться только из этого пространства имен.

Для этого может быть обходной путь, но я не думаю, что Вам будет интересно. Обходной путь должен порождать Container с правами администратора и использовать его для выполнения команды:

kubectl get secret test-secret --namespace=default --export -o yaml | kubectl apply --namespace=prod -f 

Конечно, вам нужно будет создать специальный RBAC для каждого пространства имен, чтобы запустить этот привилегированный модуль.

Я настоятельно советую против этого, но это можно сделать таким образом.

Другие вопросы по тегам