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


95

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

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

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


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

Ответы:


86

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

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


3
То же самое для configmaps. kubernetes.io/docs/tasks/configure-pod-container/…
Breedly

1
Это правильный ответ, стоит упомянуть, что вы можете клонировать в другое пространство имен с помощью kubectl + sed, все в одной строке, см. Мой ответ ниже.
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.


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

2

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


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 -


0

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


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 будет синхронизация.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.