Kubernetes의 네임 스페이스간에 비밀을 공유하는 방법이 있습니까?
내 사용 사례는 다음과 같습니다. 모든 네임 스페이스에 대해 동일한 개인 레지스트리가 있고 각각에 대해 동일한 비밀을 생성하지 않으려 고합니다.
당신의 도움을 주셔서 감사합니다.
답변:
비밀 API 개체는 네임 스페이스에 있습니다. 동일한 네임 스페이스에있는 pod에서만 참조 할 수 있습니다. 기본적으로 모든 네임 스페이스에 대한 비밀을 만들어야합니다.
https://kubernetes.io/docs/concepts/configuration/secret/#details
동일한 네임 스페이스에있는 포드에서만 참조 할 수 있습니다. 그러나 한 네임 스페이스에서 다른 네임 스페이스로 비밀을 복사 할 수 있습니다. 다음은 네임 스페이스에서 다음으로 localdockerreg
비밀 을 복사하는 예입니다 .default
dev
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 -
--export
플래그 없음 )을 사용할 때 "제공된 옵션의 네임 스페이스가 일치하지 않습니다"라는 오류가 표시됩니다. kubectl 버전 1.15. 난 당신이 사용해야 할 수도 있습니다 생각 sed
또는 그 둘 사이에 뭔가 kubectl
출력 YAML에서 네임 스페이스를 제거하는 명령
$ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f -
ps는 다른 개체 유형으로 테스트되지 않았지만 작동해야합니다. 이동하는 경우 소스를 삭제하는 것을 잊지 마십시오
허용되는 대답은 정확합니다. 네임 스페이스간에 비밀을 복사하려는 경우 여기에 힌트가 있습니다.
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 연산자를 사용하여 네임 스페이스와 네임 스페이스간에 비밀을 공유하거나 동기화하는 방법이 있습니다.
보안 비밀은 네임 스페이스 리소스이지만 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 -
@Evans Tucker의 답변을 기반으로하지만 jq 필터 내에서 삭제하는 대신 화이트리스트를 사용하여 원하는 것만 유지합니다.
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 -
본질적으로 동일하지만 레이블을 유지합니다.
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-
GoDaddy의 Kubernetes 외부 비밀을 사용할 수도 있습니다 ! AWS Secret Manager (ASM)에 비밀을 저장하고 GoDaddy의 비밀 컨트롤러가 비밀을 자동으로 생성합니다. 또한 ASM과 K8S 클러스터간에 동기화가있을 것입니다.
또 다른 옵션은 cert-manager를 제공 한 Jetstack의 친절한 사람들이 권장 하는 kubed를 사용 하는 것입니다. 여기에 링크가 있습니다.