[namespaces] Kubernetes-네임 스페이스간에 비밀 공유

Kubernetes의 네임 스페이스간에 비밀을 공유하는 방법이 있습니까?

내 사용 사례는 다음과 같습니다. 모든 네임 스페이스에 대해 동일한 개인 레지스트리가 있고 각각에 대해 동일한 비밀을 생성하지 않으려 고합니다.

당신의 도움을 주셔서 감사합니다.



답변

비밀 API 개체는 네임 스페이스에 있습니다. 동일한 네임 스페이스에있는 pod에서만 참조 할 수 있습니다. 기본적으로 모든 네임 스페이스에 대한 비밀을 만들어야합니다.

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


답변

동일한 네임 스페이스에있는 포드에서만 참조 할 수 있습니다. 그러나 한 네임 스페이스에서 다른 네임 스페이스로 비밀을 복사 할 수 있습니다. 다음은 네임 스페이스에서 다음으로 localdockerreg비밀 을 복사하는 예입니다 .defaultdev

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

### UPDATE ### Kubernetes v1.14에서 --export플래그는 더 이상 사용되지 않습니다 . 따라서 -oyaml플래그가 있는 다음 명령은 다음 버전에서 경고없이 작동합니다.

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

또는 소스 네임 스페이스가 반드시 기본값이 아닌 경우

kubectl get secret localdockerreg --namespace=default -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace=dev -f -


답변

허용되는 대답은 정확합니다. 네임 스페이스간에 비밀을 복사하려는 경우 여기에 힌트가 있습니다.

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

/ 2020 년 4 월 편집 :

이제 ClusterSecret 연산자를 사용하여 네임 스페이스와 네임 스페이스간에 비밀을 공유하거나 동기화하는 방법이 있습니다.

https://github.com/zakkg3/ClusterSecret


답변

보안 비밀은 네임 스페이스 리소스이지만 Kubernetes 확장을 사용하여 복제 할 수 있습니다. 이를 사용하여 비밀에 저장된 자격 증명 또는 인증서를 모든 네임 스페이스에 자동으로 전파하고 동기화 상태를 유지합니다 (소스를 수정하고 모든 복사본이 업데이트 됨). Kubernetes Reflector ( https://github.com/EmberStack/kubernetes-reflector )를 참조하십시오 .

확장 기능을 사용하면 주석을 통해 네임 스페이스간에 비밀을 자동으로 복사하고 동기화 할 수 있습니다.

소스 시크릿에서 주석을 추가하십시오.

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

그러면 모든 네임 스페이스에 비밀 복사본이 생성됩니다. 다음을 사용하여 복사본이 생성되는 네임 스페이스를 제한 할 수 있습니다.

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

확장은 ConfigMaps 및 cert-manager 인증서도 지원합니다. 설명자 : 저는 Kubernetes Reflector 확장 프로그램의 저자입니다.


답변

Innocent Anigbo가 대답했듯이 동일한 네임 스페이스에 비밀이 있어야합니다. 당신이 dynamicaly을 지원하거나 비밀 생성을 망각하지 않도록해야하는 경우 네임 스페이스 개체에 대한 initialiser 만들 수있을 https://kubernetes.io/docs/admin/extensible-admission-controllers/을 (내 자신에 있음을하지 않은 , 그래서 확실히 말할 수 없습니다)


답변

@NicoKowe 에서 개선

한 네임 스페이스에서 다른 네임 스페이스로 모든 비밀을 복사하는 라이너

$ 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 더 이상 사용되지 않습니다

sed YAML 또는 JSON을 편집하는 데 적합한 도구가 아닙니다.

다음은 jq원하지 않는 네임 스페이스 및 기타 메타 데이터를 삭제 하는 데 사용하는 예입니다 .

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 -