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.

matth3o
quelle
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

Unschuldiger Anigbo
quelle
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
Überprüfen Sie github.com/zakkg3/ClusterSecret
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 -
Hansika Madushan Weerasena
quelle
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

NicoKowe
quelle
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.

Winromulus
quelle
Nettes Addon. Verwenden Sie es jetzt. Vielen Dank!
CTiPKA
2

Wie von Innocent Anigbo beantwortet, müssen Sie das Geheimnis im selben Namespace haben. Wenn Sie diese Dynamik unterstützen oder das Vergessen der geheimen Erstellung vermeiden müssen, können Sie möglicherweise einen Initialisierer für das Namespace-Objekt https://kubernetes.io/docs/admin/extensible-admission-controllers/ erstellen (haben Sie dies nicht selbst getan , also kann ich nicht sicher sagen)

Radek 'Goblin' Pieczonka
quelle
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
Halil Kaskavalci
quelle
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 -
Evans Tucker
quelle
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 -

Bruce
quelle
0

kubectl get secret gitlab-registry --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f -

user128364
quelle
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.

jmselmi
quelle
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 -;
alextes
quelle
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 -
Reiny
quelle
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.

Thilee
quelle