Kubernetes - udostępnianie hasła w przestrzeniach nazw

101

Czy istnieje sposób udostępniania wpisów tajnych w przestrzeniach nazw w Kubernetes?

Mój przypadek użycia jest następujący: mam ten sam prywatny rejestr dla wszystkich moich przestrzeni nazw i chcę uniknąć tworzenia tego samego klucza tajnego dla każdego.

Dzięki za pomoc.

matth3o
źródło
to automatyzuje tajne udostępnianie: github.com/zakkg3/ClusterSecret
NicoKowe

Odpowiedzi:

93

Tajne obiekty API znajdują się w przestrzeni nazw. Mogą się do nich odwoływać tylko pody w tej samej przestrzeni nazw. Zasadniczo będziesz musiał utworzyć sekret dla każdej przestrzeni nazw.

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

Niewinny Anigbo
źródło
4
To samo dotyczy configmaps. kubernetes.io/docs/tasks/configure-pod-container/…
Breedly
1
To poprawna odpowiedź, warto wspomnieć, że możesz sklonować do innej przestrzeni nazw za pomocą kubectl + sed, wszystko w jednej linii, zobacz moją odpowiedź poniżej.
NicoKowe
75

Mogą się do nich odwoływać tylko pody w tej samej przestrzeni nazw. Ale możesz po prostu skopiować sekret z jednej przestrzeni nazw do drugiej. Oto przykład kopiowania klucza localdockerregtajnego z defaultprzestrzeni nazw do dev:

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

### UPDATE ### W Kubernetes v1.14 --exportflaga jest przestarzała . Tak więc następujące polecenie z -oyamlflagą będzie działać bez ostrzeżenia w przyszłych wersjach.

kubectl get secret localdockerreg --namespace=default -oyaml | kubectl apply --namespace=dev -f -

lub poniżej, jeśli źródłowa przestrzeń nazw niekoniecznie jest domyślna

kubectl get secret localdockerreg --namespace=default -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=dev -f -
Hansika Madushan Weerasena
źródło
1
To nie zadziała, jeśli sekrety, z których eksportujesz, nie znajdują się w domyślnej przestrzeni nazw
gerasalus
1
Działa dla mnie w dowolnych dwóch przestrzeniach nazw w
wersji 1.13
4
Hmm, kiedy używam drugiego polecenia (bez --exportflagi), pojawia się błąd z informacją, że „przestrzeń nazw z podanej opcji nie pasuje”. kubectl wersja 1.15.0 Myślę, że może być konieczne użycie sedlub coś pomiędzy tymi dwoma kubectlpoleceniami, aby usunąć przestrzeń nazw z wyjściowego yaml
Matt Dodge
6
Aby być precyzyjnym, musisz usunąć źródłową przestrzeń nazw z pośredniego YAML: $ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f - ps, który nie był testowany z innymi typami obiektów, ale powinien działać pps, nie zapomnij usunąć źródła, jeśli się przeprowadzasz
Costa Shapiro
działa i zmień kontekst za pomocą kubectl użyj kontekstu, jeśli między klastrami
Vincent Gerris
18

Przyjęta odpowiedź jest prawidłowa, oto wskazówka, jeśli chcesz skopiować sekret między przestrzeniami nazw.

kubectl get secret <secret-name> -n <source-namespace> -o yaml \
| sed s/"namespace: <source-namespace>"/"namespace: <destination-namespace>"/\
| kubectl apply -n <destination-namespace> -f -

/ edytuj kwiecień 2020:

Teraz istnieje sposób na udostępnianie lub synchronizowanie klucza tajnego w przestrzeniach nazw i jego przy użyciu operatora ClusterSecret:

https://github.com/zakkg3/ClusterSecret

NicoKowe
źródło
7

Sekrety to zasoby w przestrzeni nazw, ale do ich replikacji możesz użyć rozszerzenia Kubernetes. Używamy tego do automatycznego propagowania poświadczeń lub certyfikatów przechowywanych w tajemnicach do wszystkich przestrzeni nazw i utrzymywania ich synchronizacji (modyfikuj źródło, a wszystkie kopie są aktualizowane). Zobacz Kubernetes Reflector ( https://github.com/EmberStack/kubernetes-reflector ).

Rozszerzenie umożliwia automatyczne kopiowanie i synchronizowanie tajemnicy w przestrzeniach nazw za pośrednictwem adnotacji:

W tajemnicy źródłowej dodaj adnotacje:

 annotations:
   reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"

Spowoduje to utworzenie kopii klucza we wszystkich przestrzeniach nazw. Możesz ograniczyć przestrzenie nazw, w których tworzona jest kopia, używając:

reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2,namespace-[0-9]*"

Rozszerzenie obsługuje również certyfikaty ConfigMaps i cert-manager. Disclainer: Jestem autorem rozszerzenia Kubernetes Reflector.

winromulus
źródło
Niezły dodatek. Używam go teraz. Dzięki!
CTiPKA,
2

Jak odpowiedział Innocent Anigbo, musisz mieć sekret w tej samej przestrzeni nazw. Jeśli chcesz wspierać to dynamicznie lub unikać zapomnienia o tworzeniu sekretów, może być możliwe utworzenie inicjatora dla obiektu przestrzeni nazw https://kubernetes.io/docs/admin/extensible-admission-controllers/ (nie zrobiłem tego samodzielnie , więc nie mogę tego powiedzieć na pewno)

Radek 'Goblin' Pieczonka
źródło
1

Poprawa z @NicoKowe

Jedna linijka do kopiowania wszystkich sekretów z jednej przestrzeni nazw do drugiej

$ 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
Halil Kaskavalci
źródło
1

--export jest przestarzałe

sed nie jest odpowiednim narzędziem do edycji YAML lub JSON.

Oto przykład, który służy jqdo usuwania przestrzeni nazw i innych metadanych, których nie chcemy:

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
źródło
1

Oparty na odpowiedzi @Evans Tucker, ale używa białej listy zamiast usuwania w filtrze jq, aby zachować tylko to, co chcemy.

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 -

Zasadniczo to samo, ale zachowuje etykiety.

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 -

Bruce
źródło
0

kubectl pobiera tajny rejestr gitlab --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f -

user128364
źródło
0

Użyj RBAC, aby autoryzować serviceaccoun do używania wpisu tajnego w oryginalnych przestrzeniach nazw. Nie zaleca się jednak posiadania wspólnego sekretu między zestawami nazw.

jmselmi
źródło
0

Rozwiązanie do kopiowania wszystkich sekretów.

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 -;
alextes
źródło
0

yqto przydatne narzędzie wiersza poleceń do edycji plików YAML. Użyłem tego w połączeniu z innymi odpowiedziami, aby uzyskać to:

kubectl get secret <SECRET> -n <SOURCE_NAMESPACE> -o yaml | yq write - 'metadata.namespace' <TARGET_NAMESPACE> | kubectl apply -n <TARGET_NAMESPACE> -f -
reiny
źródło
0

Możesz także pomyśleć o użyciu zewnętrznych sekretów Kubernetes firmy GoDaddy ! gdzie będziesz przechowywać swoje sekrety w AWS Secret Manager (ASM), a tajny kontroler GoDaddy automatycznie utworzy sekrety. Ponadto byłaby synchronizacja między klastrem ASM i K8S.

Thilee
źródło