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.


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



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


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 -

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


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.


Buen complemento. Usándolo ahora. ¡Gracias!
CTiPKA


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

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 -

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 -


0

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


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.


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 -;

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 -


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.