Docs 菜单
Docs 主页
/
MongoDB Enterprise Kubernetes Operator
/

Kubernetes 中的 MongoDB 数据库架构

在此页面上

  • MongoDB 自定义资源定义
  • 协调 MongoDB 自定义资源
  • 协调 MongoDBUser 自定义资源

重要

本部分仅适用于单个 Kubernetes 集群部署。有关多 Kubernetes 集群 MongoDB 部署,请参阅架构、功能和限制

您可以使用 Kubernetes Operator 和 Cloud Manager 或 Ops Manager 将 MongoDB 数据库资源部署到 Kubernetes 集群。您可以使用现有的 Cloud Manager 或 Ops Manager,或在 Kubernetes 中部署 Ops Manager 来管理您的数据库。

Kubernetes Operator 使用 Cloud Manager 或 Ops Manager 管理以下 MongoDB 数据库自定义资源:

  • MongoDB

  • MongoDBUser

您的 自定义资源规范在 Kubernetes Operator 中定义了这些资源。Kubernetes Operator 会监控这些资源。当您更新资源的规范时,Kubernetes Operator 会将这些更改推送到 Cloud Manager 或 Ops Manager,从而对 MongoDB 部署的配置进行更改。

Kubernetes Operator 管理由 MongoDB 自定义资源定义的 MongoDB 数据库部署。

MongoDB 数据库自定义资源规范定义了以下类型的 MongoDB 数据库自定义资源:

  • Standalone

  • ReplicaSet

  • ShardedCluster

下图说明了 Kubernetes Operator 中每种 MongoDB 资源的组成。

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

警告

Kubernetes Operator 不支持仲裁节点。

对于 MongoDB 数据库资源的 Standalone 类型,Kubernetes Operator 会以 StatefulSet 的形式向 Kubernetes 集群部署具有单一成员的副本集。

Kubernetes Operator 会创建 StatefulSet,其中包含 Pod 规范以及要创建的 Pod 数量。Kubernetes Operator 依赖 Kubernetes StatefulSet Controller 来为此独立运行的 MongoDB 数据库实例创建 Pod。

重要

在 Kubernetes 中,Standalone 资源相当于仅有一个成员的 ReplicaSet 资源。我们建议您部署具有一名成员的 ReplicaSet 而不是 Standalone,因为副本集允许您将来向其添加成员。

对于ReplicaSet 类型的 MongoDB 资源,Kubernetes Operator 将副本集作为 StatefulSet 部署到 Kubernetes 集群 ,成员数量等于spec.members 的值。

Kubernetes Operator 依赖 Kubernetes StatefulSet Controller 在 StatefulSet 中为副本集的每个成员创建一个 Pod。

StatefulSet 中的每个 Pod 都运行一个 MongoDB 助手实例。

MongoDB 资源的ShardedCluster类型由一个或多个配置服务器、 mongos实例和分片成员组成。

对于 ShardedCluster 资源,Kubernetes Operator 会部署:

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

  • 所有mongos实例使用一个 StatefulSet

  • 每个分片成员有一个 StatefulSet

Kubernetes Operator 依赖 Kubernetes StatefulSet Controller 在为分片集群创建的每个 StatefulSet 中创建一个 Pod。

当您应用 MongoDB 自定义资源规范时,Kubernetes Operator 会将每个资源作为 StatefulSet 部署到 Kubernetes 集群中。

Kubernetes Operator:

  • 监视自定义资源的规范和关联的 ConfigMap 或存储在 密钥存储工具中的密钥。

  • 当规范文件、ConfigMap 或密钥更改时,验证更改。

  • 对 Kubernetes 集群中的 MongoDB 数据库资源进行适当更新。

  • 将更改推送到 Cloud Manager 或 Ops Manager,从而对 MongoDB 部署的配置进行更改。

下图描述了 Kubernetes Operator 在更改副本集时的行为:

图表描述了 MongoDB Enterprise Kubernetes Operator 如何更改副本集的“MongoDB 自定义资源定义”
点击放大

下图描述了对分片集群进行更改时 Kubernetes Operator 的行为方式:

图表描述了 MongoDB Enterprise Kubernetes Operator 如何更改分片集群的“MongoDB 自定义资源定义”
点击放大

当您创建或更改 MongoDB 资源规范时,或者当您更改关联的 ConfigMap 或密钥时,Kubernetes Operator 会执行以下操作来协调更改:

  1. 从用于在 Kubernetes Operator 中创建或连接项目的 ConfigMap 中读取所需的组织和项目配置。

    如果您更改了资源规范,Kubernetes Operator 会识别出发生了更改,然后检查 spec.opsManager.configMapRef.name 中指定的 ConfigMap 的规范。

    注意

    为 MongoDB 资源配置 Kubernetes Operator 时,您将创建一个 ConfigMap 来连接或创建您的 Cloud Manager 或 Ops Manager 项目。MongoDB 助手使用此 ConfigMap 来启动或变更 MongoDB 资源的部署。

  2. 从 Cloud Manager 或 Ops Manager 中指定的密钥读取 Cloud Manager 或 Ops Manager 的身份验证配置:

    此密钥存储 Kubernetes Operator 向 Cloud Manager 或 Ops Manager 进行身份验证所需的 Cloud Manager API 密钥Ops Manager API 密钥

    注意

    为 MongoDB 资源配置 Kubernetes Operator 时,您可以在 Kubernetes 中创建此密钥,也可以将此密钥存储在您的密钥存储工具中。

  3. Kubernetes Operator 连接到 Cloud Manager 或 Ops Manager 并执行以下操作:

    • 从 ConfigMap 中的 orgId 字段读取组织。您必须提供 orgId 字段的值。

    • 读取 ConfigMap 中的 projectName 字段中指定的项目名称,或者,如果您没有为此可选字段指定值,则在 Cloud Manager 或 Ops Manager 中创建此项目(如果该项目不存在)。

    • 检查Kubernetes Operator 为MongoDB Agent助手创建的 <project-id>-group-secret 密钥是否存在。 Kubernetes Operator 从密钥存储工具中读取密钥,或者使用MongoDB Ops Manager API密钥Cloud Manager API密钥创建密钥。

    • 将自己注册为 ConfigMap 和此密钥的监视者。这样,Kubernetes Operator 就能对您对 ConfigMap 或密钥所做的更改做出反应。

  4. Kubernetes Operator 会验证所有 TLS 和 X.509 证书

    • 如果为副本集启用了 TLS,Kubernetes Operator 会在 <prefix>-<resource-name>-cert 密钥或您的密钥存储工具中查找提供的证书

    • 如果为分片集群启用了 TLS,Kubernetes Operator 会在这些密钥中查找证书:

      • <prefix>-<resource-name>-x-cert 供每个分片成员使用。

      • <prefix>-<resource-name>-config-cert ,对于所有配置服务器。

      • <prefix>-<resource-name>-mongos-cert 对于所有mongos实例。

      • 您的密钥存储工具

    • 如果已启用 X.509使用 X.509 和 TLS 的内部身份验证,Kubernetes Operator 将检查其证书是否包含所需的配置。

  5. Kubernetes Operator 查找并更新必要的 StatefulSet,或者创建新的 StatefulSet(如果它们不存在)。StatefulSets 的数量取决于 MongoDB 资源的类型。

    • 对于 ReplicaSetStandalone 资源,Kubernetes Operator 会创建单个 StatefulSet。

    • 对于 ShardedCluster 资源,Kubernetes Operator 会创建:

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

      • 所有mongos实例都有一个 StatefulSet。

      • 每个分片成员有一个 StatefulSet。

      此时,每个 Pod 至少运行一个MongoDB Agent实例,但尚不包含mongod实例。

    • 每个 MongoDB 助手实例都会开始轮询 Cloud Manager 或 Ops Manager,以接收 MongoDB 自动化配置。

      注意

      非静态容器:当 MongoDB 助手首次收到配置时,它会从互联网或 Ops Manager 下载spec.version中指定版本的 MongoDB 二进制文件(如果在本地模式下配置了 MongoDB 助手)。

      静态容器:静态容器不会在运行时下载二进制文件。 要了解更多信息,请参阅静态容器(公共预览版)。

    • MongoDB Agent收到自动化配置后,会在相应的 Pod 上启动mongod实例。

    • 对于 MongoDB 自定义资源创建的每个 StatefulSet 的每个 Pod( StatefulSetmongos 除外),Kubernetes Operator 都会生成 持久卷声明 。您可以通过在资源规范中将spec.persistent设置为false来覆盖此行为。

  6. Kubernetes Operator 会根据规范中的更改更新从 MongoDB 助手收到的自动化配置,然后将其发送给 Cloud Manager 或 Ops Manager。

    • 每个 Pod 的每个 MongoDB 助手都会再次轮询 Cloud Manager 或 Ops Manager 并接收更新的自动化配置。

    • 如果您更改了规范中的任何字段,Kubernetes Operator 会执行 StatefulSets 的滚动更新,以启动符合新规范的新 Pod。

    • Kubernetes Operator 等待每个 MongoDB 助手报告其已达到就绪状态。

    注意

    如果更改数据库资源的 安全配置 ,或 缩减 现有的 StatefulSet,Kubernetes Operator6 在运行步骤5 {17 之前运行步骤 。

  7. Kubernetes Operator 会更新 Kubernetes 服务,或为新的 MongoDB 资源创建每个新 StatefulSet 所需的服务。

    对于 ServiceTypeClusterIP 时,Kubernetes Operator 将ClusterIP 设置为None ,并执行以下操作:

    • 如果此服务不存在,则创建此服务。

    • 对于 ReplicaSetStandalone 资源,Kubernetes Operator 使用自定义资源名称并附加 -svc 来命名服务。

    • 对于 ShardedCluster 资源,Kubernetes Operator 使用以下命名约定:

      • 对于mongos实例,Kubernetes Operator 使用spec.service中指定的名称,或附加-svc的资源名称。

      • 对于配置服务器,Kubernetes Operator 使用带有 -cs 附加符的资源名称。

      • 对于每个分片,Kubernetes Operator 使用资源名称,并在名称后附加 -sh

    • 对于端口,Kubernetes Operator 使用默认端口27017 或 中指定的 .net.port spec.additionalMongodConfig

如果用户身份验证方法设置为SCRAM ,则MongoDB 用户资源规范取决于存储用户档案的密钥存储工具。 如果您使用的是 Kubernetes 密钥 ,您可以在spec.passwordSecretKeyRef MongoDBUser资源规范的 设置中指定密钥。

Kubernetes Operator 会监视密钥的变化。如果对密钥配置进行更改,Kubernetes Operator 会对更改进行调节。它会采取以下行动:

  1. 根据 MongoDB 用户资源规范中的 spec.MongoDBResourceRef.name 设置中指定的值确定 MongoDB 用户的资源。

  2. 连接到 Cloud Manager 或 Ops Manager:

  3. 更新 Cloud Manager 或 Ops Manager 中的用户凭据,如果该凭据不存在,则创建新用户。

    • 如果用户身份验证方法是 SCRAM,则从密钥中读取密码。

    • 读取用户名。如果用户名已更改,Kubernetes Operator 会删除旧名称,然后添加新名称。

    • 确保用户存在于 Cloud Manager 或 Ops Manager 中。

下图描述了如果对用户密钥或“MongoDB 用户资源规范”进行更改,Kubernetes Operator 会如何操作。

图表描述了 MongoDB Enterprise Kubernetes Operator 如何协调对 MongoDBUser 自定义资源定义的更改
点击放大

后退

部署 MongoDB 数据库资源