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


101

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

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

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


이 비밀 공유를 자동화 : github.com/zakkg3/ClusterSecret
NicoKowe에게

답변:


94

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

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



1
정답입니다. kubectl + sed를 사용하여 다른 네임 스페이스에 모두 한 줄로 복제 할 수 있습니다. 아래 내 대답을 참조하십시오.
NicoKowe

75

동일한 네임 스페이스에있는 포드에서만 참조 할 수 있습니다. 그러나 한 네임 스페이스에서 다른 네임 스페이스로 비밀을 복사 할 수 있습니다. 다음은 네임 스페이스에서 다음으로 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 -

1
내보내는 비밀이 기본 네임 스페이스에없는 경우 작동하지 않습니다
gerasalus

1
v1.13에 두 네임 스페이스에서 나를 위해 작품
Kshitij Saraogi

4
두 번째 명령 ( --export플래그 없음 )을 사용할 때 "제공된 옵션의 네임 스페이스가 일치하지 않습니다"라는 오류가 표시됩니다. kubectl 버전 1.15. 난 당신이 사용해야 할 수도 있습니다 생각 sed또는 그 둘 사이에 뭔가 kubectl출력 YAML에서 네임 스페이스를 제거하는 명령
매트 닷지

6
정확하게 말하면 중간 YAML에서 소스 네임 스페이스를 제거해야합니다. $ kubectl get secret <SECRET> --namespace <NS-SRC> -oyaml | grep -v '^\s*namespace:\s' | kubectl apply --namespace <NS-DST> -f - ps는 다른 개체 유형으로 테스트되지 않았지만 작동해야합니다. 이동하는 경우 소스를 삭제하는 것을 잊지 마십시오
Costa Shapiro

경우 클러스터 간의 kubectl 사용 상황과 작품 및 변경 컨텍스트
빈센트 Gerris

18

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

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


7

보안 비밀은 네임 스페이스 리소스이지만 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 확장 프로그램의 저자입니다.


좋은 애드온. 지금 사용하세요. 감사!
CTiPKA


1

@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

1

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

1

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


0

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


0

RBAC를 사용하여 원래 네임 스페이스의 시크릿을 사용하도록 serviceaccoun을 인증하십시오. 그러나 이것은 네임 스페이스간에 공유 된 비밀을 갖는 것을 권장하지 않습니다.


0

모든 비밀을 복사하는 솔루션입니다.

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

yqYAML 파일을 편집하는 데 유용한 명령 줄 도구입니다. 나는 이것을 얻기 위해 다른 답변과 함께 이것을 사용했습니다.

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

0

GoDaddy의 Kubernetes 외부 비밀을 사용할 수도 있습니다 ! AWS Secret Manager (ASM)에 비밀을 저장하고 GoDaddy의 비밀 컨트롤러가 비밀을 자동으로 생성합니다. 또한 ASM과 K8S 클러스터간에 동기화가있을 것입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.