Kubernetes - обмін секретами між просторами імен


96

Чи є спосіб поділитися секретами між просторами імен у Kubernetes?

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

Спасибі за вашу допомогу.


це автоматизує обмін секретами
NicoKowe

Відповіді:


87

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

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


3
Те саме для конфігураційних карт. kubernetes.io/docs/tasks/configure-pod-container/…
Помірно

1
Це правильна відповідь, варто згадати, що ви можете клонувати інший простір імен за допомогою kubectl + sed, все в один рядок, див. Мою відповідь нижче.
NicoKowe


69

На них можуть посилатися лише стручки в тому самому просторі імен. Але ви можете просто скопіювати секрет з одного простору імен в інший. Ось приклад копіювання localdockerregсекрету з defaultпростору імен у dev:

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

### UPDATE ### У 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. Думаю, вам може знадобитися використовувати 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 не перевірявся з іншими типами об’єктів, але якщо робота працює, не забудьте видалити джерело, якщо переїжджаєте
Коста Шапіро,

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-реєстр - namespace = revsys-com --export -o yaml | \ kubectl застосувати --namespace = devspectrum-dev -f -


0

Використовуйте RBAC, щоб дозволити службовому рахунку використовувати секрет у вихідних просторах імен. Але це не рекомендується мати спільний секрет між програмами імен.


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.