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.