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.
namespaces
kubernetes
matth3o
quelle
quelle
Antworten:
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
quelle
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
localdockerreg
Geheimnissen aus demdefault
Namespace indev
:kubectl get secret localdockerreg --namespace=default --export -o yaml | kubectl apply --namespace=dev -f -
### UPDATE ### In Kubernetes v1.14 ist das
--export
Flag veraltet . Der folgende Befehl mit-oyaml
Flag 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 -
quelle
--export
Flag) verwende, erhalte ich die Fehlermeldung "Der Namespace der angegebenen Option stimmt nicht überein". kubectl version 1.15. Ich denke, Sie müssen möglicherweisesed
oder etwas zwischen diesen beidenkubectl
Befehlen verwenden, um den Namespace aus der Ausgabe yaml zu 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 umziehenDie 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
quelle
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.
quelle
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)
quelle
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
quelle
--export
ist veraltetsed
ist nicht das geeignete Werkzeug zum Bearbeiten von YAML oder JSON.Hier ist ein Beispiel, mit
jq
dem 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 -
quelle
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 -
quelle
kubectl get secret gitlab-registry --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f -
quelle
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.
quelle
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 -;
quelle
yq
ist 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 -
quelle
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.
quelle
Eine andere Möglichkeit wäre die Verwendung von Kubed , wie von den freundlichen Leuten bei Jetstack empfohlen, die uns den Cert-Manager gegeben haben. Hier ist, worauf sie verlinken.
quelle