Kubernetes - 跨命名空间共享秘密

时间:2017-09-19 10:20:54

标签: namespaces kubernetes

有没有办法在Kubernetes中跨命名空间共享秘密?

我的用例是:我的所有命名空间都有相同的私有注册表,我想避免为每个命名空间创建相同的秘密。

感谢您的帮助。

14 个答案:

答案 0 :(得分:28)

秘密API对象驻留在命名空间中。它们只能由同一名称空间中的pod引用。基本上,您必须为每个命名空间创建secrete。

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

答案 1 :(得分:21)

只能由同一名称空间中的pod引用它们。但是您可以将秘密从一个名称空间复制到另一个名称空间。这是将localdockerreg机密从default命名空间复制到dev的示例:

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

答案 2 :(得分:6)

秘密是命名空间资源,但是您可以使用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和证书管理器证书。 声明:我是Kubernetes Reflector扩展的作者。

答案 3 :(得分:2)

正如Innocent Anigbo所回答的,你需要在同一名称空间中拥有秘密。如果您需要动态支持或避免伪造秘密创建,可能可以为命名空间对象https://kubernetes.io/docs/admin/extensible-admission-controllers/创建初始化器(我自己没有这样做,所以无法确定)

答案 4 :(得分:1)

可接受的答案是正确的,如果您要在命名空间之间复制机密,这是一个提示。

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

答案 5 :(得分: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 -

答案 6 :(得分:1)

基于@Evans Tucker的答案,但在jq过滤器中使用白名单而不是删除来仅保留我们想要的内容。

def compile(): try: for file in compile_list: py_compile.compile(file) except Exception as exception: script_heal(file, exception)

本质上是一样,但是保留标签。

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 -

答案 7 :(得分:0)

kubectl获取秘密gitlab-registry --namespace = revsys-com --export -o yaml | \    kubectl apply --namespace = devspectrum-dev -f-

答案 8 :(得分:0)

@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

答案 9 :(得分:0)

使用RBAC授权serviceaccoun在原始名称空间上使用秘密。但是,建议不要在名称空间之间使用共享的机密。

答案 10 :(得分: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 -;

答案 11 :(得分:0)

yq是用于编辑YAML文件的有用的命令行工具。我将其与其他答案结合使用来获得此信息:

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

答案 12 :(得分:0)

您还可以考虑使用GoDaddy's Kubernetes External Secrets!您将在其中将您的机密存储在AWS Secret Manager(ASM)中的位置,而GoDaddy的机密控制器将自动创建机密。而且,ASM和K8S集群之间将保持同步。

答案 13 :(得分:0)

Another option would be to use kubed,这是由Jetstack的好心人推荐的,他给了我们证书管理员。 Here is what they link to.