部署副本集
注意
对于此页面上提到的所有 Ops Manager,您都可以将其替换为 Cloud Manager。
重要
您可以使用 Kubernetes Operator 通过 Cloud Manager 和 Ops Manager 6.0.x 版或更高版本来部署 MongoDB 资源。
可以使用 Atlas Operator 将 MongoDB 资源部署到 Atlas。
警告
Kubernetes Operator 不支持仲裁节点。
副本集是一组维护相同数据集的 MongoDB 部署。副本集提供冗余和高可用性,是所有生产部署的基础。
要了解有关副本集的更多信息,请参阅 MongoDB 手册中的复制简介。
使用此过程部署 Ops Manager 管理的新副本集。部署后,使用 Ops Manager 管理副本集,包括添加、删除和重新配置成员等操作。
Considerations
当通过 Kubernetes Operator 部署副本集时,必须选择是否使用 TLS 证书加密连接。
以下是 TLS-Encrypted 连接的操作步骤:
在副本集中的 MongoDB 主机之间建立 TLS 加密连接。
在客户端应用程序和 MongoDB 部署之间建立 TLS 加密连接。
TLS 加密需要有效证书。
Non-Encrypted Connections(非加密连接)的过程如下:
不加密副本集中 MongoDB 主机之间的连接。
不会加密客户端应用程序和 MongoDB 部署之间的连接。
与使用 TLS 加密连接的部署相比,设置要求更少。
注意
你无法在 Kubernetes 集群中保护 MongoDB 的独立实例。
要为分片分片集群设立TLS加密,请参阅部署分片集群。
根据您是否要使用 TLS 加密副本集连接,选择相应的标签页。
先决条件
注意
要避免在单集群 Kubernetes 部署中存储密钥,您可以迁移所有 密钥 到 秘密存储工具 。多个 Kubernetes 集群上的部署不支持将密钥存储在密钥存储工具中,例如 HashiCorp Vault 。
为以下每个组件生成一个 TLS 证书:
您的副本集。确保为每个托管证书副本集节点的 Kubernetes 容器添加 SAN。
在您的 TLS 证书中,每个 pod 的 SAN 必须使用以下格式:
<pod-name>.<metadata.name>-svc.<namespace>.svc.cluster.local 重要
如果您使用的是基于 ACME 的服务提供商,例如 Let's Encrypt 要颁发 TLS 证书,提供商可能会禁止您将 Pod 的默认 FQDN (
*.svc.cluster.local
) 添加到证书中的 SAN 。要使用基于ACME的证书,您必须为副本集资源配置证书。 要学习;了解更多信息,请参阅操作步骤中有关基于ACME的TLS证书的步骤。
您项目的 MongoDB Agent。对于 MongoDB Agent 证书,请确保您满足以下要求:
TLS证书中的公用名不为空。
每个 TLS 证书中的组合组织和组织单位与副本集节点的 TLS 证书中的组织和组织单位不同。
您必须拥有CA证书文件并将其命名为
ca-pem
。您必须拥有用于签署TLS证书的密钥。
重要
Kubernetes Operator 使用 kubernetes.io/tls用于存储 和 资源的 TLS 证书和私钥的密钥。MongoDB Ops ManagerMongoDB从Kubernetes Operator 版本1 开始。17 。0 , Kubernetes Operator 不支持将连接的 PEM 文件存储为 不透明密钥。
注意
要避免在单集群 Kubernetes 部署中存储密钥,您可以迁移所有 密钥 到 秘密存储工具 。多个 Kubernetes 集群上的部署不支持将密钥存储在密钥存储工具中,例如 HashiCorp Vault 。
部署副本集
将kubectl
配置为默认命名空间。
如果您尚未执行,请运行以下命令,执行所创建命名空间的所有 kubectl
命令。
注意
MongoDB Ops Manager如果要在多 Kubernetes 集群 部署中部署MongoDB 资源:
将
context
设置为中心集群的名称,例如:kubectl config set context "$MDB_CENTRAL_CLUSTER_FULL_NAME"
。将
--namespace
设置为您用于多 Kubernetes 集群 MongoDB 部署的相同范围,例如:kubectl config --namespace "mongodb"
。
kubectl config set-context $(kubectl config current-context) --namespace=<metadata.namespace>
为副本集的 TLS 证书创建密钥。
运行以下 kubectl
命令可创建用于存储副本集证书的新密码:
kubectl create secret tls <prefix>-<metadata.name>-cert \ --cert=<replica-set-tls-cert> \ --key=<replica-set-tls-key>
注意
您必须在密钥前面加上 <prefix>-<metadata.name>
作为前缀。
示例,如果您将部署调用为my-deployment
并将前缀设立为mdb
,则必须为客户端 TLS 通信 命名 TLSmdb-my-deployment-cert
密钥。此外,您必须将用于内部集群身份验证(如果已启用)的TLS密钥命名为mdb-my-deployment-clusterfile
。
如果您使用 HashiCorp Vault 作为您的 Secret 存储工具,则可以创建 Vault Secret。
要了解有关 Secret 存储的选项,请参阅配置 Secret 存储。
为代理的 TLS 证书创建密钥。
运行 kubectl
命令可创建用于存储代理 TLS 证书的新Secret:
kubectl create secret tls <prefix>-<metadata.name>-agent-certs \ --cert=<agent-tls-cert> \ --key=<agent-tls-key>
如果您使用 HashiCorp Vault 作为您的 Secret 存储工具,则可以创建 Vault Secret。
创建 ConfigMap,将 CA 与部署链接起来。
运行此 kubectl
命令将 CA 与副本集关联,并指定 CA 证书文件。
重要
Kubernetes Operator 要求您在 ConfigMap 中将 MongoDB
资源证书命名为 ca-pem
。
kubectl create configmap custom-ca --from-file=ca-pem=<your-custom-ca-file>
复制示例副本集资源。
更改此 YAML 文件的设立,以匹配所需的副本集配置。
1 2 apiVersion: mongodb.com/v1 3 kind: MongoDB 4 metadata: 5 name: <my-replica-set> 6 spec: 7 members: 3 8 version: "4.2.2-ent" 9 opsManager: 10 configMapRef: 11 # Must match metadata.name in ConfigMap file 12 name: <configMap.metadata.name> 13 credentials: <mycredentials> 14 type: ReplicaSet 15 persistent: true 16 ...
16 security: 17 tls: 18 ca: <custom-ca> 19 certsSecretPrefix: <prefix> 20 ...
粘贴复制的示例以创建新的副本集资源。
打开您的首选文本编辑器并将对象规范粘贴到新的文本文件中。
根据您的偏好更改设置的值。
键 | 类型 | 说明 | 例子 |
---|---|---|---|
字符串 | myproject | ||
整型 | 3 | ||
字符串 | 此副本集应运行的 MongoDB 版本。 Community 版的格式应为 重要提示:确保选择兼容的MongoDB Server版本。 兼容版本因MongoDB 数据库资源使用的基础映像而异。 要了解有关 MongoDB 版本控制的更多信息,请参阅 MongoDB 手册中的 MongoDB 版本控制。 | 6.0.0-ent | |
字符串 | ConfigMap 的名称MongoDB Ops Manager 连接配置。 此值必须与待创建的资源位于同一命名空间。 重要提示:Kubernetes Operator 会跟踪该 ConfigMap 的任何更改并协调 | <myconfigmap> | |
字符串 | 您创建的 Secret 名称,其将作为 Ops Manager API 身份验证凭证,以便 Kubernetes Operator 与 Ops Manager 进行通信。 持有凭证的 Ops Manager Kubernetes Secret 对象必须与您要创建的资源位于同一个命名空间中。 重要提示:Kubernetes Operator 会跟踪该 Secret 的任何更改并协调 | <mycredentials> | |
字符串 | 要创建的 MongoDB 资源的类型。 | ReplicaSet | |
字符串 | 可选。 指示此 如果该值为 如要更改您持久卷申领的配置,请配置以下集合以满足部署要求:
警告: 授予容器写入 持久卷 的权限 。Kubernetes Operator 在 中设置 Disk UsageDisk IOPSAtlas Charts如果不使用Processes DeploymentMetrics持久卷 ,在 查看此部署的数据 时, 和 无法显示在 页面上的 标签页中,也无法显示在 页面中。 | true |
使用自定义证书颁发机构 (CA) 为副本集资源配置 TLS 设置。
要在您的部署中启用 TLS,请在您 Kubernetes 对象中配置以下设置:
键 | 类型 | 必要性 | 说明 | 例子 |
---|---|---|---|---|
spec.security | 字符串 | 必需 | <custom-ca> | |
spec.security | 字符串 | 必需 | 添加 Secret 名称的 示例,如果您将部署调用为 | devDb |
可选:为副本集资源配置基于 ACME 的 TLS 证书。
如果您使用的是基于 ACME 的服务提供商,例如 Let's Encrypt 要颁发 TLS 证书,提供商可能会禁止您将 Pod 的默认 FQDN (*.svc.cluster.local
) 添加到证书中的 SAN 。
要配置不包含 pod 的 FQDN 的证书:
为外部域颁发证书。有关详细信息,请参阅 Let's Encrypt 文档或提供商的文档。
确保您的证书包含您计划在副本集中部署的所有主机名。或者,您可以为
*.<externalDomain>
颁发通配符证书。要将仅包含外部域的证书用于副本集部署,必须更改副本集使用的默认主机名:
如果您希望在创建Kubernetes集群时配置主机名,请更改 默认域
cluster.local
在创建或重新创建Kubernetes集群时从 迁移到外部域。然后,使用spec.clusterDomain
设置在MongoDB资源中设立此域。否则,请使用 Kubernetes 对象中配置的以下设置来创建 MongoDB 部署:
键 | 类型 | 必要性 | 说明 | |||||||
---|---|---|---|---|---|---|---|---|---|---|
spec.externalAccess | 字符串 | 必需 | 用于向外部公开您的副本集部署的外部域。 默认情况下,每个副本集节点将 Kubernetes Pod 的 FQDN (
例如:
使用此设置部署副本集后, Kubernetes Operator 使用带有外部域的主机名来覆盖MongoDB Ops Manager自动化配置中的 要指定用于连接到副本集的其他主机名,可以使用 警告:指定此字段会更改MongoDB Ops Manager注册 | |||||||
spec.externalAccess | 集合 | Optional | ServiceSpec 的配置。 当您设立
有关 Kubernetes 规范的更多信息,请参阅 Kubernetes 文档中的 ServiceSpec。 | |||||||
spec.externalAccess | 集合 | Optional | 键值对,可让您将特定于云提供商的配置设置添加到部署中的所有集群。 要了解更多信息,请参阅 注解 以及 Kubernetes 云提供商的文档。 您可以指定占位符值来自定义注释。要了解更多信息,请参阅 |
为副本集部署添加任何其他可接受的设置。
您还可以将以下任何可选设置添加到 对象 副本集 部署的规范文件:
警告
如果 Kubernetes 集群具有spec.clusterDomain
默认域 ,则必须设置 除默认cluster.local
之外的其他值。如果既不使用默认值,也不设置spec.clusterDomain
选项,Kubernetes Operator 可能无法按预期运行。
启动副本集部署。
在任意目录中,调用以下 Kubernetes 命令来创建副本集:
kubectl apply -f <replica-set-conf>.yaml
跟踪副本集部署的状态。
要检查 MongoDB
资源的状态,请使用以下命令:
kubectl get mdb <resource-name> -o yaml -w
设置 -w
(观看) 标志后,当配置更改时,输出将立即刷新,直到状态阶段达到 Running
状态。要了解有关资源部署状态的详情,请参阅 Kubernetes Operator 故障排除。
在您使用 TLS 加密数据库资源后,可以提高以下认证安全性:
为副本集续订 TLS 证书
使用以下步骤定期更新 TLS 证书:
将kubectl
配置为默认命名空间。
如果您尚未执行,请运行以下命令,执行所创建命名空间的所有 kubectl
命令。
注意
MongoDB Ops Manager如果要在多 Kubernetes 集群 部署中部署MongoDB 资源:
将
context
设置为中心集群的名称,例如:kubectl config set context "$MDB_CENTRAL_CLUSTER_FULL_NAME"
。将
--namespace
设置为您用于多 Kubernetes 集群 MongoDB 部署的相同范围,例如:kubectl config --namespace "mongodb"
。
kubectl config set-context $(kubectl config current-context) --namespace=<metadata.namespace>
更新 TLS 证书的密钥。
运行此 kubectl
命令以更新存储副本集的证书的现有密钥:
kubectl create secret tls <prefix>-<metadata.name>-cert \ --cert=<replica-set-tls-cert> \ --key=<replica-set-tls-key> \ --dry-run=client \ -o yaml | kubectl apply -f -
将kubectl
配置为默认命名空间。
如果您尚未执行,请运行以下命令,执行所创建命名空间的所有 kubectl
命令。
注意
MongoDB Ops Manager如果要在多 Kubernetes 集群 部署中部署MongoDB 资源:
将
context
设置为中心集群的名称,例如:kubectl config set context "$MDB_CENTRAL_CLUSTER_FULL_NAME"
。将
--namespace
设置为您用于多 Kubernetes 集群 MongoDB 部署的相同范围,例如:kubectl config --namespace "mongodb"
。
kubectl config set-context $(kubectl config current-context) --namespace=<metadata.namespace>
复制示例副本集资源。
更改此 YAML 文件的设立,以匹配所需的副本集配置。
1 2 apiVersion: mongodb.com/v1 3 kind: MongoDB 4 metadata: 5 name: <my-replica-set> 6 spec: 7 members: 3 8 version: "4.2.2-ent" 9 opsManager: 10 configMapRef: 11 # Must match metadata.name in ConfigMap file 12 name: <configMap.metadata.name> 13 credentials: <mycredentials> 14 type: ReplicaSet 15 persistent: true 16 ...
粘贴复制的示例以创建新的副本集资源。
打开您的首选文本编辑器并将对象规范粘贴到新的文本文件中。
根据您的偏好更改设置的值。
键 | 类型 | 说明 | 例子 |
---|---|---|---|
字符串 | myproject | ||
整型 | 3 | ||
字符串 | 此副本集应运行的 MongoDB 版本。 Community 版的格式应为 重要提示:确保选择兼容的MongoDB Server版本。 兼容版本因MongoDB 数据库资源使用的基础映像而异。 要了解有关 MongoDB 版本控制的更多信息,请参阅 MongoDB 手册中的 MongoDB 版本控制。 | 6.0.0-ent | |
字符串 | ConfigMap 的名称MongoDB Ops Manager 连接配置。 此值必须与待创建的资源位于同一命名空间。 重要提示:Kubernetes Operator 会跟踪该 ConfigMap 的任何更改并协调 | <myconfigmap> | |
字符串 | 您创建的 Secret 名称,其将作为 Ops Manager API 身份验证凭证,以便 Kubernetes Operator 与 Ops Manager 进行通信。 持有凭证的 Ops Manager Kubernetes Secret 对象必须与您要创建的资源位于同一个命名空间中。 重要提示:Kubernetes Operator 会跟踪该 Secret 的任何更改并协调 | <mycredentials> | |
字符串 | 要创建的 MongoDB 资源的类型。 | ReplicaSet | |
字符串 | 可选。 指示此 如果该值为 如要更改您持久卷申领的配置,请配置以下集合以满足部署要求:
警告: 授予容器写入 持久卷 的权限 。Kubernetes Operator 在 中设置 Disk UsageDisk IOPSAtlas Charts如果不使用Processes DeploymentMetrics持久卷 ,在 查看此部署的数据 时, 和 无法显示在 页面上的 标签页中,也无法显示在 页面中。 | true |
为副本集部署添加任何其他可接受的设置。
您还可以将以下任何可选设置添加到 对象 副本集 部署的规范文件:
警告
如果 Kubernetes 集群具有spec.clusterDomain
默认域 ,则必须设置 除默认cluster.local
之外的其他值。如果既不使用默认值,也不设置spec.clusterDomain
选项,Kubernetes Operator 可能无法按预期运行。
启动副本集部署。
在任意目录中,调用以下 Kubernetes 命令来创建副本集:
kubectl apply -f <replica-set-conf>.yaml
跟踪副本集部署的状态。
要检查 MongoDB
资源的状态,请使用以下命令:
kubectl get mdb <resource-name> -o yaml -w
设置 -w
(观看) 标志后,当配置更改时,输出将立即刷新,直到状态阶段达到 Running
状态。要了解有关资源部署状态的详情,请参阅 Kubernetes Operator 故障排除。