创建镜像从其他 Secret 拉取 Secret 或者从其他命名空间复制 Secret

创建镜像从其他 Secret 拉取 Secret 或者从其他命名空间复制 Secret

我遇到了一个似乎无法很好地解决的问题。我有一个在 GCP 上运行的 Kubernetes 集群和一个自定义 HELM 图表 helm/foo。我有多个以不同名称运行的图表实例,需要对其进行更改,以便每个实例都在自己的命名空间中运行。这并不难,因为它只是 helm 的一个参数:

helm install --name bar --namespace bar helm/foo

图表里面有几件事,其中包括一个提供了 imagePullSecret 的部署:

imagePullSecret: scrt

当部署到默认命名空间时,或者更确切地说,与机密所在的命名空间相同,这可以很好地工作。但是当提供命名空间时会失败,因为命名空间“bar”无法访问默认命名空间中的“scrt”。

为了解决这个问题,许多来源都采取了类似以下的做法:https://stackoverflow.com/questions/46297949/kubernetes-sharing-secret-across-namespaces 其中机密在命名空间之间复制。如果您有一个运行整个过程的脚本,这是一个很好的解决方案,但对我来说不可行,因为 Terraform 部署了 N 个 chart helm/test 实例。

所以我的问题是:如何仅使用 helm/yaml 从现有 imagePullSecret 创建新 imagePullSecret?我可以将 json 文件打包在图表中,但想避免在 K8 之外拥有机密。

谢谢!

答案1

简短的回答:你不应该。

你应该过去使用配置文件对 Kubernetes 对象进行声明式管理,这可能有助于您了解如何使用 Kubernetes。

通过将多个对象配置文件存储在一个目录中并根据需要使用递归创建和更新这些对象,可以创建、更新和删除 Kubernetes 对象kubectl apply。此方法保留对活动对象的写入,而不会将更改合并回对象配置文件。

通常这是不可能的,因为正如你所指出的Kubernetes - 跨命名空间共享秘密 secret绑定到命名空间,并且只能从该命名空间内引用。

可能会有一个解决方法来实现这一点,但我认为你不会感兴趣。解决方法是需要生成Container一个行政权限并使用它来执行命令:

kubectl get secret test-secret --namespace=default --export -o yaml | kubectl apply --namespace=prod -f 

当然你需要创建特殊的RBAC,为每个命名空间运行这个特权 pod。

我强烈反对这样做,但可以这样做。

相关内容