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.