Создать 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 для каждого пространства имен, чтобы запустить этот привилегированный модуль.
Я настоятельно советую против этого, но это можно сделать таким образом.