Kubernetes: compartir secretos entre espacios de nombres

95

¿Hay alguna forma de compartir secretos entre espacios de nombres en Kubernetes?

Mi caso de uso es: tengo el mismo registro privado para todos mis espacios de nombres y quiero evitar crear el mismo secreto para cada uno.

Gracias por tu ayuda.

matth3o
fuente
esto automatiza el intercambio secreto: github.com/zakkg3/ClusterSecret
NicoKowe

Respuestas:

86

Los objetos de la API secreta residen en un espacio de nombres. Solo los pods pueden hacer referencia a ellos en ese mismo espacio de nombres. Básicamente, tendrás que crear el secreto para cada espacio de nombres.

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

Anigbo inocente
fuente
3
Lo mismo para configmaps. kubernetes.io/docs/tasks/configure-pod-container/…
Breedly
1
Esa es la respuesta correcta, vale la pena mencionar que puede clonar en otro espacio de nombres con kubectl + sed, todo en una línea, vea mi respuesta a continuación.
NicoKowe
comprobar github.com/zakkg3/ClusterSecret
NicoKowe
69

Solo los pods pueden hacer referencia a ellos en ese mismo espacio de nombres. Pero puede copiar el secreto de un espacio de nombre a otro. A continuación, se muestra un ejemplo de cómo copiar un localdockerregsecreto del defaultespacio de nombres a dev:

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

### ACTUALIZACIÓN ### En Kubernetes v1.14, el --exportindicador está obsoleto . Por lo tanto, el siguiente comando con -oyamlbandera funcionará sin advertencia en las próximas versiones.

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

o debajo si el espacio de nombres de origen no es necesariamente el predeterminado

kubectl get secret localdockerreg --namespace=default -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=dev -f -
Hansika Madushan Weerasena
fuente
1
Esto no funcionará si los secretos desde los que está exportando no están en el espacio de nombres predeterminado
gerasalus
1
Funciona para mí en dos espacios de nombres cualesquiera en la v1.13
Kshitij Saraogi
4
Hmm, cuando uso el segundo comando (sin --exportbandera), aparece un error que dice "el espacio de nombres de la opción proporcionada no coincide". kubectl versión 1.15.0 Creo que es posible que deba usar sedo algo entre esos dos kubectlcomandos para eliminar el espacio de nombres del yaml de salida
Matt Dodge
6
Para ser precisos, debe eliminar el espacio de nombres de origen del YAML intermedio: $ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f - ps no probado con otros tipos de objetos, pero debería funcionar. Pps no olvide eliminar el origen si se está mudando
Costa Shapiro
16

La respuesta aceptada es correcta, aquí hay una pista si está buscando copiar el secreto entre espacios de nombres.

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

/ editar abril 2020:

Ahora hay una forma de compartir o sincronizar secretos entre espacios de nombres y es mediante el operador ClusterSecret:

https://github.com/zakkg3/ClusterSecret

NicoKowe
fuente
6

Los secretos son recursos con espacios de nombres, pero puede usar una extensión de Kubernetes para replicarlos. Usamos esto para propagar credenciales o certificados almacenados en secretos a todos los espacios de nombres automáticamente y mantenerlos sincronizados (modificar la fuente y todas las copias se actualizan). Consulte Reflector de Kubernetes ( https://github.com/EmberStack/kubernetes-reflector ).

La extensión le permite copiar automáticamente y mantener sincronizado un secreto en los espacios de nombres mediante anotaciones:

En el secreto de la fuente, agregue las anotaciones:

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

Esto creará una copia del secreto en todos los espacios de nombres. Puede limitar los espacios de nombres en los que se crea una copia mediante:

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

La extensión también es compatible con ConfigMaps y certificados de administrador de certificados. Descargo de responsabilidad: soy el autor de la extensión Reflector de Kubernetes.

Winromulus
fuente
Buen complemento. Usándolo ahora. ¡Gracias!
CTiPKA
2

Como respondió Innocent Anigbo, debe tener el secreto en el mismo espacio de nombres. Si necesita respaldar eso dinámicamente o evitar falsificar la creación secreta, podría ser posible crear un inicializador para el objeto de espacio de nombres https://kubernetes.io/docs/admin/extensible-admission-controllers/ (no lo he hecho por mi cuenta , así que no puedo decirlo con seguridad)

Radek 'Goblin' Pieczonka
fuente
1

Mejorando de @NicoKowe

Un trazador de líneas para copiar todos los secretos de un espacio de nombres a otro

$ 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
fuente
1

--export es obsoleto

sed no es la herramienta adecuada para editar YAML o JSON.

Aquí hay un ejemplo que se usa jqpara eliminar el espacio de nombres y otros metadatos que no queremos:

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
fuente
1

Basado en la respuesta de @Evans Tucker, pero usa la lista blanca en lugar de la eliminación dentro del filtro jq para mantener solo lo que queremos.

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 -

Esencialmente lo mismo pero conserva las etiquetas.

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
fuente
0

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

user128364
fuente
0

Utilice RBAC para autorizar a la cuenta de servicio a utilizar el secreto en los espacios de nombres originales. Pero, no se recomienda tener un secreto compartido entre nombres.

jmselmi
fuente
0

Solución para copiar todos los secretos.

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
fuente
0

yqes una útil herramienta de línea de comandos para editar archivos YAML. Utilicé esto junto con las otras respuestas para obtener esto:

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

¡También puede pensar en usar los secretos externos de Kubernetes de GoDaddy ! donde almacenará sus secretos en AWS Secret Manager (ASM) y el controlador secreto de GoDaddy creará los secretos automáticamente. Además, habría sincronización entre el clúster ASM y K8S.

Thilee
fuente