在 Kubernetes 中将 Vault 与多个动态名称空间一起使用

Using Vault with multiple dynamic namespaces in Kubernetes

是否可以在命名空间之间共享 ServiceAccount 或以某种方式使用来自不同命名空间的 ServiceAccount 启动 pod?

我们正在寻求使用保险库来存储动态开发环境之间的公共机密数据。通过 HERE 的非常好的步行,我们能够验证并提取单个命名空间的秘密。然而,在我们的用例中,我们将在每个开发环境的生命周期内为其创建一个新的命名空间。

如果可能,我们希望避免同时为每个命名空间配置具有新身份验证后端的保管库。

服务帐户是命名空间的,因此不共享,因此您可以将令牌从一个帐户复制到另一个帐户,但这不是推荐的方式。

C02W84XMHTD5:kubernetes-gitlab iahmad$ kubectl api-resources --namespaced | grep service
serviceaccounts             sa                                       true         ServiceAccount
services                    svc                                      true         Service
C02W84XMHTD5:kubernetes-gitlab iahmad$

如果您想按照您尝试的方式共享机密或帐户,则根本不需要使用保险库。

您可能只需要自动执行此过程,而不是共享帐户。

创建 Vault 角色时,您可以 configure bound_service_account_namespaces to be the special value *, and allow a fixed service account name from any namespace. To adapt the "create role" example from the documentation:

vault write auth/kubernetes/role/demo \
    bound_service_account_names=vault-auth \
    bound_service_account_namespaces='*' \
    policies=default \
    ttl=1h

您必须在每个命名空间中重新创建 Kubernetes 服务帐户,并且它必须具有角色中指定的确切名称。然而,Kubernetes 服务帐户是一个单独的 k8s 对象,它并不比您已有的 Deployments、Services、ConfigMaps 和 Secrets 更难;此模式不需要任何 Vault 重新配置。

(如果您使用的是像 Helm 这样的模板工具,则服务帐户不能遵循像 {{ .Release.Name }}-{{ .Chart.Name }} 这样的命名约定:Vault 似乎没有与此名称匹配的任何类型。 )