Kubernetes 中的 MongoDB 数据库架构
重要
本部分仅适用于单个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 会监控这些资源。 当您更新资源规范时, KubernetesKubernetes Operator 会将这些更改推送到Cloud Manager或MongoDBCloud Manager MongoDB Ops ManagerMongoDBOps Manager ,从而对MongoDB部署的配置进行更改。
MongoDB
自定义资源定义
Kubernetes Operator 管理由 MongoDB 自定义资源定义的 MongoDB 数据库部署。
MongoDB 数据库自定义资源规范定义了以下类型的 MongoDB 数据库自定义资源:
Standalone
ReplicaSet
ShardedCluster
下图说明了 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
,因为副本集允许您将来向其添加成员。
副本集(Replica Set)
对于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
自定义资源
当您应用 MongoDB 自定义资源规范时,Kubernetes Operator 会将每个资源作为 StatefulSet 部署到 Kubernetes 集群中。
Kubernetes Operator:
监视自定义资源的规范和关联的 ConfigMap 或存储在 密钥存储工具中的密钥。
当规范文件、ConfigMap 或密钥更改时,验证更改。
对 Kubernetes 集群中的 MongoDB 数据库资源进行适当更新。
将更改推送到 Cloud Manager 或 Ops Manager,从而对 MongoDB 部署的配置进行更改。
副本集调节示意图
下图描述了 Kubernetes Operator 在更改副本集时的行为:
分片集群调节示意图
下图描述了对分片集群进行更改时 Kubernetes Operator 的行为方式:
对账工作流程
当您创建或更改 MongoDB 资源规范时,或者当您更改关联的 ConfigMap 或密钥时,Kubernetes Operator 会执行以下操作来协调更改:
从用于在 Kubernetes Operator 中创建或连接项目的 ConfigMap 中读取所需的组织和项目配置。
如果您更改了资源规范,Kubernetes Operator 会识别出发生了更改,然后检查
spec.opsManager.configMapRef.name
中指定的 ConfigMap 的规范。注意
为 MongoDB 资源配置 Kubernetes Operator 时,您将创建一个 ConfigMap 来连接或创建您的 Cloud Manager 或 Ops Manager 项目。MongoDB 助手使用此 ConfigMap 来启动或变更 MongoDB 资源的部署。
从 Cloud Manager 或 Ops Manager 中指定的密钥读取 Cloud Manager 或 Ops Manager 的身份验证配置:
spec.credentials
在资源规范中您的密钥存储工具
此密钥存储 Kubernetes Operator 向 Cloud Manager 或 Ops Manager 进行身份验证所需的 Cloud Manager API 密钥或 Ops Manager API 密钥。
注意
为 MongoDB 资源配置 Kubernetes Operator 时,您可以在 Kubernetes 中创建此密钥,也可以将此密钥存储在您的密钥存储工具中。
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 或密钥所做的更改做出反应。
Kubernetes Operator 会验证所有 TLS 和 X.509 证书。
如果为副本集启用了 TLS,Kubernetes Operator 会在
<prefix>-<resource-name>-cert
密钥或您的密钥存储工具中查找提供的证书。如果为分片集群启用了 TLS,Kubernetes Operator 会在这些密钥中查找证书:
如果已启用 X.509 或使用 X.509 和 TLS 的内部身份验证,Kubernetes Operator 将检查其证书是否包含所需的配置。
Kubernetes Operator 查找并更新必要的 StatefulSet,或者创建新的 StatefulSet(如果它们不存在)。StatefulSets 的数量取决于 MongoDB 资源的类型。
对于
ReplicaSet
或Standalone
资源,Kubernetes Operator 会创建单个 StatefulSet。对于
ShardedCluster
资源,Kubernetes Operator 会创建:适用于所有配置服务器的一个 StatefulSet。
所有
mongos
实例都有一个 StatefulSet。每个分片成员有一个 StatefulSet。
此时,每个 Pod 至少运行一个MongoDB Agent实例,但尚不包含
mongod
实例。每个 MongoDB 助手实例都会开始轮询 Cloud Manager 或 Ops Manager,以接收 MongoDB 自动化配置。
注意
非静态容器: 当MongoDB Agent 首次收到配置时,它会从互联网或MongoDB 下载 中指定版本的
spec.version
MongoDB Ops ManagerMongoDB Agent二进制文件(如果在本地模式配置了 )。静态容器:静态容器不会在运行时下载二进制文件。 要了解更多信息,请参阅静态容器(公共预览版)。
MongoDB Agent收到自动化配置后,会在相应的 Pod 上启动
mongod
实例。对于 MongoDB 自定义资源创建的每个 StatefulSet 的每个 Pod( StatefulSet
mongos
除外),Kubernetes Operator 都会生成 持久卷声明 。您可以通过在资源规范中将spec.persistent
设置为false
来覆盖此行为。
Kubernetes Operator 会根据规范中的更改更新从 MongoDB 助手收到的自动化配置,然后将其发送给 Cloud Manager 或 Ops Manager。
每个 Pod 的每个 MongoDB 助手都会再次轮询 Cloud Manager 或 Ops Manager 并接收更新的自动化配置。
如果您更改了规范中的任何字段,Kubernetes Operator 会执行 StatefulSets 的滚动更新,以启动符合新规范的新 Pod。
Kubernetes Operator 等待每个 MongoDB 助手报告其已达到就绪状态。
Kubernetes Operator 会更新 Kubernetes 服务,或为新的 MongoDB 资源创建每个新 StatefulSet 所需的服务。
对于 ServiceType
ClusterIP
时,Kubernetes Operator 将ClusterIP
设置为None
,并执行以下操作:如果此服务不存在,则创建此服务。
对于
ReplicaSet
或Standalone
资源,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
。
调节MongoDBUser
自定义资源
如果用户身份验证方法设置为SCRAM ,则MongoDB 用户资源规范取决于存储用户档案的密钥存储工具。 如果您使用的是 Kubernetes 密钥 ,您可以在spec.passwordSecretKeyRef
MongoDBUser
资源规范的 设置中指定密钥。
Kubernetes Operator 会监视密钥的变化。如果对密钥配置进行更改,Kubernetes Operator 会对更改进行调节。它会采取以下行动:
根据 MongoDB 用户资源规范中的
spec.MongoDBResourceRef.name
设置中指定的值确定 MongoDB 用户的资源。连接到 Cloud Manager 或 Ops Manager:
从 ConfigMap 中的
orgId
读取组织结构。从 ConfigMap 中的
projectName
读取项目名称;如果不存在,则在 Cloud Manager 或 Ops Manager 中创建该项目。检查Kubernetes Operator 为MongoDB Agent助手创建的
<project-id>-group-secret
是否存在。 Kubernetes Operator 从密钥存储工具中读取密钥,或者使用MongoDB Ops Manager API密钥或Cloud Manager API密钥创建密钥。
更新 Cloud Manager 或 Ops Manager 中的用户凭据,如果该凭据不存在,则创建新用户。
如果用户身份验证方法是 SCRAM,则从密钥中读取密码。
读取用户名。如果用户名已更改,Kubernetes Operator 会删除旧名称,然后添加新名称。
确保用户存在于 Cloud Manager 或 Ops Manager 中。
下图描述了如果对用户密钥或“MongoDB 用户资源规范”进行更改,Kubernetes Operator 会如何操作。