Kubernetes - совместное использование секретов в пространствах имен

95

Есть ли способ обмениваться секретами между пространствами имен в Kubernetes?

Мой пример использования: у меня один и тот же частный реестр для всех пространств имен, и я не хочу создавать один и тот же секрет для каждого из них.

Спасибо за вашу помощь.

matth3o
источник
это автоматизирует обмен
секретами

Ответы:

86

Секретные объекты API находятся в пространстве имен. На них могут ссылаться только модули в том же пространстве имен. По сути, вам нужно будет создать секрет для каждого пространства имен.

https://kubernetes.io/docs/concepts/configuration/secret/#details

Иннокентий Анигбо
источник
3
То же самое для configmaps. kubernetes.io/docs/tasks/configure-pod-container/…
Breedly
1
Это правильный ответ, стоит упомянуть, что вы можете клонировать в другое пространство имен с помощью kubectl + sed, все в одной строке, см. Мой ответ ниже.
NicoKowe
проверьте github.com/zakkg3/ClusterSecret
NicoKowe
69

На них могут ссылаться только модули в том же пространстве имен. Но вы можете просто скопировать секрет из одного пространства имен в другое. Вот пример копирования localdockerregсекрета из defaultпространства имен в dev:

 kubectl get secret localdockerreg --namespace=default --export -o yaml | kubectl apply --namespace=dev -f -

### ОБНОВЛЕНИЕ ### В Kubernetes v1.14 --exportфлаг устарел . Таким образом, следующая команда с -oyamlфлагом будет работать без предупреждения в следующих версиях.

kubectl get secret localdockerreg --namespace=default -oyaml | kubectl apply --namespace=dev -f -

или ниже, если исходное пространство имен не обязательно по умолчанию

kubectl get secret localdockerreg --namespace=default -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=dev -f -
Хансика Мадушан Вирасена
источник
1
Это не сработает, если секреты, из которых вы экспортируете, не находятся в пространстве имен по умолчанию
gerasalus
1
Работает для меня в любых двух пространствах имен в
версии 1.13
4
Хм, когда я использую вторую команду (без --exportфлага), я получаю сообщение об ошибке «пространство имен из предоставленной опции не совпадает». kubectl версии 1.15.0 Я думаю, вам может понадобиться использовать sedили что-то среднее между этими двумя kubectlкомандами, чтобы удалить пространство имен из выходного yaml
Мэтт Додж
6
Чтобы быть точным, вам нужно удалить исходное пространство имен из промежуточного YAML: $ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f - ps не тестировалось с другими типами объектов, но должно работать. Pps не забудьте удалить исходный код, если вы перемещаетесь
Коста Шапиро
16

Принятый ответ правильный, вот подсказка, если вы хотите скопировать секрет между пространствами имен.

kubectl get secret <secret-name> -n <source-namespace> -o yaml \
| sed s/"namespace: <source-namespace>"/"namespace: <destination-namespace>"/\
| kubectl apply -n <destination-namespace> -f -

/ редактировать апр 2020:

Теперь есть способ поделиться или синхронизировать секрет между пространствами имен и его с помощью оператора ClusterSecret:

https://github.com/zakkg3/ClusterSecret

НикоКоу
источник
6

Секреты - это ресурсы в пространстве имен, но вы можете использовать расширение Kubernetes для их репликации. Мы используем это для автоматического распространения учетных данных или сертификатов, хранящихся в секретах, на все пространства имен и их синхронизации (измените источник, и все копии будут обновлены). См. Kubernetes Reflector ( https://github.com/EmberStack/kubernetes-reflector ).

Расширение позволяет автоматически копировать и синхронизировать секреты между пространствами имен с помощью аннотаций:

К исходному секрету добавьте аннотации:

 annotations:
   reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"

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

reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2,namespace-[0-9]*"

Расширение также поддерживает сертификаты ConfigMaps и cert-manager. Отказ от ответственности: я являюсь автором расширения Kubernetes Reflector.

Winromulus
источник
Хороший аддон. Используем это сейчас. Благодарность!
CTiPKA
2

Как ответил Иннокентий Анигбо, вам нужно иметь секрет в том же пространстве имен. Если вам нужно поддерживать это динамически или не забывать о создании секрета, возможно, удастся создать инициализатор для объекта пространства имен https://kubernetes.io/docs/admin/extensible-admission-controllers/ (я не делал этого самостоятельно , так что точно сказать не могу)

Радек 'Goblin' Печонка
источник
1

Улучшение от @NicoKowe

Один лайнер для копирования всех секретов из одного пространства имен в другое

$ for i in `kubectl get secrets | awk '{print $1}'`; do  kubectl get secret $1 -n <source-namespace> -o yaml | sed s/"namespace: <source-namespace>"/"namespace: <target-namespace>"/ | kubectl apply -n <target-namespace> -f -  ; done
Халил Каскавальчи
источник
1

--export не рекомендуется

sed не подходит для редактирования YAML или JSON.

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

kubectl get secret cure-for-covid-19 -n china -o json | jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' | kubectl apply -n rest-of-world -f -
Эванс Такер
источник
1

На основе ответа @Evans Tucker, но вместо удаления в фильтре jq используется белый список, чтобы сохранить только то, что мы хотим.

kubectl get secret cure-for-covid-19 -n china -o json | jq '{apiVersion,data,kind,metadata,type} | .metadata |= {"annotations", "name"}' | kubectl apply -n rest-of-world -f -

По сути то же самое, но с сохранением этикеток.

kubectl get secret cure-for-covid-19 -n china -o json | jq '{apiVersion,data,kind,metadata,type} | .metadata |= {"annotations", "name", "labels"}' | kubectl apply -n rest-of-world -f -

Брюс
источник
0

kubectl получить секретный gitlab-registry --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f -

user128364
источник
0

Используйте RBAC, чтобы разрешить serviceaccoun использовать секрет в исходных пространствах имен. Но не рекомендуется иметь общий секрет между именами.

Jmselmi
источник
0

Решение для копирования всех секретов.

kubectl delete secret --namespace $TARGET_NAMESPACE--all;
kubectl get secret --namespace default --output yaml \
    | sed "s/namespace: $SOURCE_NAMESPACE/namespace: $TARGET_NAMESPACE/" \
    | kubectl apply --namespace $TARGET_NAMESPACE --filename -;
алекс
источник
0

yq- полезный инструмент командной строки для редактирования файлов YAML. Я использовал это в сочетании с другими ответами, чтобы получить следующее:

kubectl get secret <SECRET> -n <SOURCE_NAMESPACE> -o yaml | yq write - 'metadata.namespace' <TARGET_NAMESPACE> | kubectl apply -n <TARGET_NAMESPACE> -f -
Рейни
источник
0

Вы также можете подумать об использовании внешних секретов Kubernetes от GoDaddy ! где вы будете хранить свои секреты в AWS Secret Manager (ASM), а секретный контроллер GoDaddy создаст секреты автоматически. Более того, между ASM и кластером K8S будет синхронизация.

Thilee
источник