对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

MongoDB数据库资源架构

MongoDB 自定义资源定义了 Kubernetes Operator 管理的数据库部署。您的自定义资源规范定义了这些资源,Kubernetes Operator 会对其进行监控。当您更新资源的规范时,Kubernetes 操作符 会将更改推送到 Ops Manager,后者会修改 MongoDB 部署的配置。

MongoDB CRD 支持三种部署类型。下图说明了各类型的组成:

显示MongoDB Controllers for Kubernetes Operator 中MongoDB资源的高级架构的图表
点击放大

警告

Kubernetes Operator 不支持仲裁节点。

即使您可以部署 Standalone 资源,我们仍建议您部署具有一个节点的 ReplicaSet 资源,因为副本集允许您在将来添加节点。在 Kubernetes 中,Standalone 资源相当于仅有一个节点的 ReplicaSet 资源。

对于 Standalone 资源,Kubernetes 操作符 会以 StatefulSet 的形式部署单节点副本集。Kubernetes 操作符 会创建 StatefulSet,其中包含 Pod 规范,并依赖 Kubernetes StatefulSet Controller 为此单一 mongod 实例创建 Pod。

对于 ReplicaSet 资源,Kubernetes Operator 会将副本集部署为 StatefulSet,其节点数等于 spec.members 的值。Kubernetes 操作符 依赖 Kubernetes StatefulSet Controller 为每个节点创建一个 Pod。每个 Pod 运行一个 MongoDB Agent 实例,该实例管理该 Pod 上的 mongod 进程。

ShardedCluster 资源由配置服务器、mongos 实例和分片节点组成。Kubernetes 操作符 部署:

  • 一个适用于所有配置服务器的 StatefulSet

  • 所有 mongos 实例使用一个 StatefulSet

  • 每个分片一个 StatefulSet

Kubernetes 操作符 依赖 Kubernetes StatefulSet Controller 在每个 StatefulSet 中创建一个 Pod。对于具有 2 个分片的分片集群,这意味着总共有 4 个 StatefulSet(1 个配置服务器 + 1 个 mongos + 2 个分片)。

部署类型
StatefulSet
StatefulSet 大小

独立运行的实例

1

1Pod

副本集(Replica Set)

1

1每个成员 Pod

分片集群

<numberOfShards> + 2

每个 mongos、分片节点或配置服务器节点 1 个 1 Pod

当您应用 MongoDB 自定义资源规范时,Kubernetes 操作符 会将每个资源部署为 StatefulSet。随后,Kubernetes 操作符将进入一个持续的调节循环:

  1. spec.opsManager.configMapRef.name 中指定的 ConfigMap 读取项目配置

  2. 从 中指定的 Secretspec.credentials 或从 您的秘密存储工具中 读取 API 凭证 。

  3. 连接到 MongoDB Ops Manager 并执行以下操作:

    • 从 ConfigMap 中的 orgId 读取组织结构。

    • 读取或创建 projectName 中指定的项目。

    • 验证 <project-id>-group-secret 是否存在,或使用 MongoDB Ops Manager API 密钥创建它。

    • 将 Kubernetes 操作符 注册为 ConfigMap 和凭证 Secrets 的监视器。

  4. 验证 TLS 和 X.509 证书,如果启用:

    • 对于副本集:在 <prefix>-<resource-name>-cert 中查找证书。

    • 对于分片集群:在 <prefix>-<resource-name>-x-cert(每个分片)、<prefix>-<resource-name>-config-cert(配置服务器)和 <prefix>-<resource-name>-mongos-certmongos 实例)中查找证书。

  5. 创建或更新 StatefulSets。数量取决于部署类型。此时,每个 Pod 运行一个 MongoDB Agent,但尚不包含 mongod 实例。

    • 每个 MongoDB Agent 都会轮询 Ops Manager 以获取自动化配置。

    • 在非静态容器上,MongoDB Agent 会下载版本在 spec.version 中指定的 MongoDB 二进制文件。

    • 收到配置后,MongoDB Agent 将启动 mongod

    • 除非 spec.persistentfalse,否则 Kubernetes 操作符会为每个 Pod(除 mongos Pod 外)生成 PersistentVolumeClaims。

  6. 将自动化配置更新推送到 MongoDB Ops Manager。每个 MongoDB Agent 都会拉取更新的配置并应用该配置。如果您更改任何字段,Kubernetes Operator 会对 StatefulSets 执行滚动更新。

  7. 创建或更新 Kubernetes 服务

    • 对于 ReplicaSetStandalone:命名为 <resource-name>-svc 的无头 ClusterIP 服务。

    • 对于ShardedCluster

      • mongos: 使用 spec.service<resource-name>-svc 中的名称。

      • Config servers: <resource-name>-cs.

      • 每个分片:<resource-name>-sh

下图演示了副本集的协调流程:

显示副本集调节流程的示意图
点击放大

下图演示分片集群的协调流程:

显示分片集群调节流程的示意图
点击放大

如果用户身份验证方法是 SCRAM,则 MongoDBUser 资源取决于存储用户凭证的秘密。Kubernetes 操作符 会监视秘密的变化,并按如下方式进行协调:

  1. spec.MongoDBResourceRef.name 确定 MongoDB 用户的资源。

  2. 连接到 MongoDB Ops Manager,读取组织和项目,并验证代理秘钥。

  3. 更新 MongoDB Ops Manager 中的用户凭据,如果该凭据不存在,则创建新用户。如果用户名已更改,Kubernetes 操作符 会删除旧名称,然后添加新名称。

下图说明了 MongoDBUser 协调流程:

显示 MongoDBUser 协调流程的图表
点击放大