Есть ли способ обмениваться секретами между пространствами имен в Kubernetes?
Мой пример использования: у меня один и тот же частный реестр для всех пространств имен, и я не хочу создавать один и тот же секрет для каждого из них.
Спасибо за вашу помощь.
namespaces
kubernetes
matth3o
источник
источник
Ответы:
Секретные объекты API находятся в пространстве имен. На них могут ссылаться только модули в том же пространстве имен. По сути, вам нужно будет создать секрет для каждого пространства имен.
https://kubernetes.io/docs/concepts/configuration/secret/#details
источник
На них могут ссылаться только модули в том же пространстве имен. Но вы можете просто скопировать секрет из одного пространства имен в другое. Вот пример копирования
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 -
источник
--export
флага), я получаю сообщение об ошибке «пространство имен из предоставленной опции не совпадает». kubectl версии 1.15.0 Я думаю, вам может понадобиться использоватьsed
или что-то среднее между этими двумяkubectl
командами, чтобы удалить пространство имен из выходного yaml$ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f -
ps не тестировалось с другими типами объектов, но должно работать. Pps не забудьте удалить исходный код, если вы перемещаетесьПринятый ответ правильный, вот подсказка, если вы хотите скопировать секрет между пространствами имен.
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
источник
Секреты - это ресурсы в пространстве имен, но вы можете использовать расширение 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.
источник
Как ответил Иннокентий Анигбо, вам нужно иметь секрет в том же пространстве имен. Если вам нужно поддерживать это динамически или не забывать о создании секрета, возможно, удастся создать инициализатор для объекта пространства имен https://kubernetes.io/docs/admin/extensible-admission-controllers/ (я не делал этого самостоятельно , так что точно сказать не могу)
источник
Улучшение от @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
источник
--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 -
источник
На основе ответа @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 -
источник
kubectl получить секретный gitlab-registry --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f -
источник
Используйте RBAC, чтобы разрешить serviceaccoun использовать секрет в исходных пространствах имен. Но не рекомендуется иметь общий секрет между именами.
источник
Решение для копирования всех секретов.
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 -;
источник
yq
- полезный инструмент командной строки для редактирования файлов YAML. Я использовал это в сочетании с другими ответами, чтобы получить следующее:kubectl get secret <SECRET> -n <SOURCE_NAMESPACE> -o yaml | yq write - 'metadata.namespace' <TARGET_NAMESPACE> | kubectl apply -n <TARGET_NAMESPACE> -f -
источник
Вы также можете подумать об использовании внешних секретов Kubernetes от GoDaddy ! где вы будете хранить свои секреты в AWS Secret Manager (ASM), а секретный контроллер GoDaddy создаст секреты автоматически. Более того, между ASM и кластером K8S будет синхронизация.
источник
Другой вариант - использовать kubed , как рекомендуют добрые люди из Jetstack, которые предоставили нам cert-manager. Вот на что они ссылаются.
источник