¿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.
¿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.
Respuestas:
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
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 localdockerreg
secreto del default
espacio 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 --export
indicador está obsoleto . Por lo tanto, el siguiente comando con -oyaml
bandera 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 -
--export
bandera), 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 sed
o algo entre esos dos kubectl
comandos para eliminar el espacio de nombres del yaml de salida
$ 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
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:
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.
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)
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
--export
es obsoleto
sed
no es la herramienta adecuada para editar YAML o JSON.
Aquí hay un ejemplo que se usa jq
para 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 -
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 -
kubectl get secret gitlab-registry --namespace = revsys-com --export -o yaml | \ kubectl apply --namespace = devspectrum-dev -f -
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 -;
yq
es 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 -
¡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.
Otra opción sería usar kubed , según lo recomendado por la amable gente de Jetstack que nos dio cert-manager. Esto es lo que enlazan.