Kubernetes - Geheimnisse über Namespaces hinweg teilen


98

Gibt es eine Möglichkeit, Geheimnisse in Namespaces in Kubernetes zu teilen?

Mein Anwendungsfall ist: Ich habe für alle meine Namespaces dieselbe private Registrierung und möchte vermeiden, dass für jeden das gleiche Geheimnis erstellt wird.

Danke für Ihre Hilfe.


Dies automatisiert das geheime Teilen: github.com/zakkg3/ClusterSecret
NicoKowe

Antworten:


92

Geheime API-Objekte befinden sich in einem Namespace. Sie können nur von Pods im selben Namespace referenziert werden. Grundsätzlich müssen Sie das Geheimnis für jeden Namespace erstellen.

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


4
Gleiches gilt für Konfigurationskarten. kubernetes.io/docs/tasks/configure-pod-container/…
Breedly

1
Das ist die richtige Antwort. Erwähnenswert ist, dass Sie mit kubectl + sed in einer Zeile in einen anderen Namespace klonen können. Siehe meine Antwort unten.
NicoKowe


74

Sie können nur von Pods in demselben Namespace referenziert werden. Sie können das Geheimnis jedoch einfach von einem Namensraum in einen anderen kopieren. Hier ist ein Beispiel für das Kopieren von localdockerregGeheimnissen aus dem defaultNamespace in dev:

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

### UPDATE ### In Kubernetes v1.14 ist das --exportFlag veraltet . Der folgende Befehl mit -oyamlFlag funktioniert also in den kommenden Versionen ohne Warnung.

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

oder darunter, wenn der Quellennamensraum nicht unbedingt der Standardwert ist

kubectl get secret localdockerreg --namespace=default -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=dev -f -

1
Dies funktioniert nicht, wenn Geheimnisse, aus denen Sie exportieren, nicht im Standard-Namespace enthalten sind
gerasalus

1
Funktioniert für mich in zwei beliebigen Namespaces in Version 1.13
Kshitij Saraogi

4
Hmm, wenn ich den zweiten Befehl (kein --exportFlag) verwende, erhalte ich die Fehlermeldung "Der Namespace der angegebenen Option stimmt nicht überein". kubectl version 1.15. Ich denke, Sie müssen möglicherweise sedoder etwas zwischen diesen beiden kubectlBefehlen verwenden, um den Namespace aus der Ausgabe yaml zu entfernen
Matt Dodge

6
Um genau zu sein, müssen Sie den Quellennamensraum aus der Zwischen-YAML entfernen: $ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f - ps, die nicht mit anderen Objekttypen getestet wurde, aber sollte funktionieren pps vergessen Sie nicht, die Quelle zu löschen, wenn Sie umziehen
Costa Shapiro

funktioniert und ändere den Kontext mit kubectl benutze den Kontext, wenn zwischen Clustern
Vincent Gerris

16

Die akzeptierte Antwort ist korrekt. Hier ist ein Hinweis, wenn Sie das Geheimnis zwischen Namespaces kopieren möchten.

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

/ edit apr 2020:

Jetzt gibt es eine Möglichkeit, Geheimnisse über Namespaces und deren Verwendung mithilfe des ClusterSecret-Operators zu teilen oder zu synchronisieren:

https://github.com/zakkg3/ClusterSecret


6

Geheimnisse sind Ressourcen mit Namespace, aber Sie können sie mit einer Kubernetes-Erweiterung replizieren. Wir verwenden dies, um Anmeldeinformationen oder Zertifikate, die in Geheimnissen gespeichert sind, automatisch an alle Namespaces weiterzugeben und sie synchron zu halten (ändern Sie die Quelle und alle Kopien werden aktualisiert). Siehe Kubernetes Reflector ( https://github.com/EmberStack/kubernetes-reflector ).

Mit der Erweiterung können Sie automatisch ein Geheimnis über Namespaces hinweg über Anmerkungen kopieren und synchronisieren:

Fügen Sie im Quellgeheimnis die Anmerkungen hinzu:

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

Dadurch wird eine Kopie des Geheimnisses in allen Namespaces erstellt. Sie können die Namespaces, in denen eine Kopie erstellt wird, einschränken, indem Sie:

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

Die Erweiterung unterstützt auch ConfigMaps- und Cert-Manager-Zertifikate. Disclainer: Ich bin der Autor der Kubernetes Reflector-Erweiterung.


Nettes Addon. Verwenden Sie es jetzt. Vielen Dank!
CTiPKA


1

Verbesserung von @NicoKowe

Ein Liner, um alle Geheimnisse von einem Namespace in einen anderen zu kopieren

$ 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 ist veraltet

sed ist nicht das geeignete Werkzeug zum Bearbeiten von YAML oder JSON.

Hier ist ein Beispiel, mit jqdem der Namespace und andere Metadaten gelöscht werden, die wir nicht möchten:

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

Basierend auf der Antwort von @Evans Tucker, verwendet jedoch die Whitelist anstelle des Löschens innerhalb des JQ-Filters, um nur das zu behalten, was wir wollen.

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 -

Im Wesentlichen das Gleiche, aber Etiketten erhalten.

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 get secret gitlab-registry --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f -


0

Verwenden Sie RBAC, um den Serviceaccoun zu autorisieren, das Geheimnis in den ursprünglichen Namespaces zu verwenden. Es wird jedoch nicht empfohlen, ein gemeinsames Geheimnis zwischen Namesapces zu haben.


0

Lösung zum Kopieren aller Geheimnisse.

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

yqist ein hilfreiches Befehlszeilentool zum Bearbeiten von YAML-Dateien. Ich habe dies in Verbindung mit den anderen Antworten verwendet, um dies zu erhalten:

kubectl get secret <SECRET> -n <SOURCE_NAMESPACE> -o yaml | yq write - 'metadata.namespace' <TARGET_NAMESPACE> | kubectl apply -n <TARGET_NAMESPACE> -f -

0

Sie können auch über die Verwendung von GoDaddys Kubernetes External Secrets nachdenken ! Dort speichern Sie Ihre Geheimnisse in AWS Secret Manager (ASM), und der geheime Controller von GoDaddy erstellt die Geheimnisse automatisch. Darüber hinaus würde es eine Synchronisation zwischen ASM und K8S-Cluster geben.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.