Чи є спосіб поділитися секретами між просторами імен у Kubernetes?
Мій варіант використання: у мене однаковий приватний реєстр для всіх моїх просторів імен, і я хочу уникати створення однакових секретів для кожного.
Спасибі за вашу допомогу.
Чи є спосіб поділитися секретами між просторами імен у Kubernetes?
Мій варіант використання: у мене однаковий приватний реєстр для всіх моїх просторів імен, і я хочу уникати створення однакових секретів для кожного.
Спасибі за вашу допомогу.
Відповіді:
Секретні об’єкти 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 -
### 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 -
--export
прапорця), я отримую повідомлення про помилку: "Простір імен із наданої опції не збігається". kubectl, версія 1.15. Думаю, вам може знадобитися використовувати sed
або щось середнє між цими двома kubectl
командами, щоб видалити простір імен з вихідного yaml
$ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f -
ps не перевірявся з іншими типами об’єктів, але якщо робота працює, не забудьте видалити джерело, якщо переїжджаєте
Прийнята відповідь правильна, ось підказка, якщо ви хочете скопіювати секрет між просторами імен.
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:
Секрети - це ресурси з простором імен, але ви можете скористатися розширенням 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-реєстр - namespace = revsys-com --export -o yaml | \ kubectl застосувати --namespace = devspectrum-dev -f -
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, які дали нам сертифікат-менеджера. Ось на що вони посилаються.