您可以为 Kubernetes Operator 选择密钥存储工具。 密钥存储工具是一个安全的位置,用于存储 Kubernetes 操作符托管的组件的敏感信息。这包括 MongoDB 数据库、Ops Manager 和 AppDB 的密钥。
配置密钥存储后,Kubernetes 操作符会访问该工具,检索密钥,并使用它们安全地建立连接。
支持的密钥存储工具
Kubernetes 操作符 支持以下密钥存储工具:
HashiCorp Vault:将敏感信息存储在 Vault 中,这是一项用于密钥管理的第三方服务。
您可以存储的密钥
You can use any supported secret storage tool for any secret in the MongoDB Controllers for Kubernetes Operator documentation except those listed in the limitations.
重要
配置后,Kubernetes Operator 将您选择的密钥存储工具用于所有密钥,但限制中列出的密钥除外。 您不能混合和匹配密钥存储工具。
限制
支持的密钥存储工具存在以下限制:
- 某些注册表(例如 OpenShift)需要使用 imagePullSecrets 从存储库中提取映像。Kubernetes Operator 无法提供来自HashiCorp Vault 的 imagePullSecrets。您可以指定 kubelet 映像凭证提供商来检索使用Kubernetes 的容器映像注册表的凭证。
设置密钥存储工具
要设置密钥存储工具,请选择以下选项之一:
要使用HashiCorp Vault存储Kubernetes Operator 的密钥,请完成以下步骤。
先决条件
在开始之前,您必须:
为 Vault实例启用Kubernetes身份验证。这允许您使用 Vault 进行身份验证。
在Kubernetes集群中部署 Vault Agent sidecar 注入器。这允许您将 Vault 中的密钥注入Kubernetes Pod 中。
下载Kubernetes Operator、 MongoDB 数据库、 MongoDB Ops Manager和 AppDB 的四个 Vault 策略文件。
在 Vault 中创建一个名为
mongodbenterprise的角色。Kubernetes Operator 中的密钥配置取决于此角色是否存在及其确切名称。
步骤
将 Vault 角色绑定到 Kubernetes Operator 及其组件的 Vault 策略。
使用以下四个命令将 Vault 角色绑定到Kubernetes Operator、 MongoDB database 、 MongoDB Ops Manager和 AppDB 资源的策略,并将变量替换为表中的值:
占位符 | 说明 |
|---|---|
{OperatorPolicyName} | 人类可读标签,用于标识 Vault 中的 Kubernetes Operator 策略。 |
{DatabasePolicyName} | 人类可读标签,用于标识 Vault 中的MongoDB database策略。 |
{OpsManagerPolicyName} | 人类可读标签,用于标识 Vault 中的MongoDB Ops Manager策略。 |
{AppDBPolicyName} | 人类可读标签,用于标识 Vault 中的 AppDB 策略。 |
{ServiceAccountNamespace} | 用于标识绑定到 Pod 的服务帐户的命名空间的标签。 |
vault write auth/kubernetes/role/{OperatorPolicyName} bound_service_account_names=enterprise-operator bound_service_account_namespaces={ServiceAccountNamespace}
vault write auth/kubernetes/role/{DatabasePolicyName} bound_service_account_names=mongodb-kubernetes-database-pods bound_service_account_namespaces={ServiceAccountNamespace}
vault write auth/kubernetes/role/{OpsManagerPolicyName} bound_service_account_names=mongodb-kubernetes-ops-manager bound_service_account_namespaces={ServiceAccountNamespace}
vault write auth/kubernetes/role/{AppDBPolicyName} bound_service_account_names=mongodb-kubernetes-appdb bound_service_account_namespaces={ServiceAccountNamespace}
这些命令确保每个组件的 Pod 仅具有其策略中指定的访问权限。
注意
此步骤授予 Kubernetes Operator 对 Vault 的访问权限。 要将 Vault 与 Kubernetes Operator 不托管的应用程序一起使用,您必须为这些应用程序编写并绑定 Vault 策略。
您可以调整此步骤中的命令,通过替换服务帐户的名称来绑定其他策略。要将其他应用程序配置为使用 Vault,请将以下命令中的 {ServiceAccountName} 替换为用于应用程序 Pod 的服务帐号:
vault write auth/kubernetes/role/{PolicyName} bound_service_account_names={ServiceAccountName} bound_service_account_namespaces={ServiceAccountNamespace}
将注释添加到Kubernetes部署文件中。
在运行此步骤中的命令之前,请确保您已创建名称为 的 Vault角色。mongodbenterprise
将以下突出显示的行添加到Kubernetes Operator部署文件的spec.template.metadata.annotations部分。 对于大多数用户来说,此文件的名称是mongodb-kubernetes.yaml或mongodb-kubernetes-openshift.yaml 。
注意
如果使用 Helm 安装了 Kubernetes Operator 并将Operator.vaultSecretBackend.enabled设置为true ,则 Kubernetes Operator 会添加以下注解。 您可以继续执行下一步。
apiVersion: apps/v1 kind: Deployment metadata: name: mongodb-kubernetes-operator namespace: production spec: replicas: 1 template: metadata: annotations: vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/role: "mongodbenterprise"
如果您正在以 Vault 在 TLS 模式下运行,并指定了 operator.vaultSecretBackend.tlsSecretRef 值,则 Kubernetes 操作符会添加以下注释。否则,将以下高亮行添加到文件中,将 {TLSSecret} 替换为密钥的名称,其中包含 ca.crt 条目。ca.crt条目的内容必须与用于生成 Vault TLS 证书的CA证书匹配。
annotations: vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/role: "mongodbenterprise" vault.hashicorp.com/tls-secret: {TLSSecret} vault.hashicorp.com/ca-cert: /vault/tls/ca.crt
在Kubernetes中定义环境变量。
将以下突出显示的行添加到Kubernetes Operator部署文件的spec.env部分。 对于大多数用户来说,此文件的名称是mongodb-kubernetes.yaml或mongodb-kubernetes-openshift.yaml 。
apiVersion: apps/v1 kind: Deployment metadata: name: mongodb-kubernetes-operator namespace: production spec: env: - name: OPERATOR_ENV value: ENVIRONMENT_NAME - name: SECRET_BACKEND value: VAULT_BACKEND
创建一个包含 Vault 配置信息的文件。
使用您首选的文本编辑应用程序,创建一个名为config的文件。 将以下文本粘贴到文件中:
apiVersion: v1 kind: ConfigMap metadata: name: secret-configuration namespace: {Namespace} data: VAULT_SERVER_ADDRESS: {VaultServerAddress} OPERATOR_SECRET_BASE_PATH: mongodbenterprise/operator DATABASE_SECRET_BASE_PATH: mongodbenterprise/database OPS_MANAGER_SECRET_BASE_PATH: mongodbenterprise/opsmanager APPDB_SECRET_BASE_PATH: mongodbenterprise/appdb
此文件中的路径是默认路径。 如果您自定义了Kubernetes Operator 配置,则可以将其替换为您的基本路径。
如果您在TLS模式运行保管库,则还必须将以下突出显示的行添加到文件中:
OPS_MANAGER_SECRET_BASE_PATH: mongodbenterprise/opsmanager APPDB_SECRET_BASE_PATH: mongodbenterprise/appdb TLS_SECRET_REF: {TLSSecret}
替换 Vault 配置信息中的占位符。
用这些值替换 config 文件中的占位符。将 .txt 文件扩展名替换为 .yaml,以 YAML 文件类型保存文件。
占位符 | 说明 |
|---|---|
{Namespace} | 您为Kubernetes Operator创建的命名空间。 默认命名空间为 |
{VaultServerAddress} | Kubernetes Operator 连接到 Vault 时应使用的地址。 |
{TLSSecret} | 包含 |
使用 Vault 配置创建 ConfigMap。
发出以下命令以创建包含 Vault 信息的ConfigMap:
kubectl create configmap secret-configuration --from-file=config.yaml
这将创建一个名为 的 ConfigMap。secret-configuration此 ConfigMap 包含 config文件的内容。
手动迁移不会自动迁移的密钥
您必须手动迁移以下密钥才能将其存储在保管库中:
任何现有的用户创建的密钥,包括存储为Kubernetes密钥的 Operator凭证(如果适用)
Kubernetes Operator 创建的 gen-key 密钥
MongoDB Ops Manager管理员档案/管理员密钥Kubernetes Operator 创建
TLS 密钥
要手动迁移或创建新密钥,请将其添加到 Vault 。 将它们添加到 Vault 后,您可以从Kubernetes中删除它们。
Kubernetes Operator 创建的所有其他密钥都会自动迁移,并且Kubernetes Operator 使用 Vault 来保存新密钥。 用户创建的密钥必须添加到 Vault 中。
后续步骤
为Kubernetes Operator 的MongoDB控制器配置密钥存储工具后,您可以: