MongoDB 自定义资源定义了 Kubernetes Operator 管理的数据库部署。您的自定义资源规范定义了这些资源,Kubernetes Operator 会对其进行监控。当您更新资源的规范时,Kubernetes 操作符 会将更改推送到 Ops Manager,后者会修改 MongoDB 部署的配置。
MongoDB CRD 支持三种部署类型。下图说明了各类型的组成:
警告
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 | 每个 |
MongoDB 资源协调
当您应用 MongoDB 自定义资源规范时,Kubernetes 操作符 会将每个资源部署为 StatefulSet。随后,Kubernetes 操作符将进入一个持续的调节循环:
从
spec.opsManager.configMapRef.name中指定的 ConfigMap 读取项目配置。从 中指定的 Secret
spec.credentials或从 您的秘密存储工具中 读取 API 凭证 。连接到 MongoDB Ops Manager 并执行以下操作:
从 ConfigMap 中的
orgId读取组织结构。读取或创建
projectName中指定的项目。验证
<project-id>-group-secret是否存在,或使用 MongoDB Ops Manager API 密钥创建它。将 Kubernetes 操作符 注册为 ConfigMap 和凭证 Secrets 的监视器。
验证 TLS 和 X.509 证书,如果启用:
对于副本集:在
<prefix>-<resource-name>-cert中查找证书。对于分片集群:在
<prefix>-<resource-name>-x-cert(每个分片)、<prefix>-<resource-name>-config-cert(配置服务器)和<prefix>-<resource-name>-mongos-cert(mongos实例)中查找证书。
创建或更新 StatefulSets。数量取决于部署类型。此时,每个 Pod 运行一个 MongoDB Agent,但尚不包含
mongod实例。每个 MongoDB Agent 都会轮询 Ops Manager 以获取自动化配置。
在非静态容器上,MongoDB Agent 会下载版本在
spec.version中指定的 MongoDB 二进制文件。收到配置后,MongoDB Agent 将启动
mongod。除非
spec.persistent为false,否则 Kubernetes 操作符会为每个 Pod(除mongosPod 外)生成 PersistentVolumeClaims。
将自动化配置更新推送到 MongoDB Ops Manager。每个 MongoDB Agent 都会拉取更新的配置并应用该配置。如果您更改任何字段,Kubernetes Operator 会对 StatefulSets 执行滚动更新。
创建或更新 Kubernetes 服务:
对于
ReplicaSet或Standalone:命名为<resource-name>-svc的无头ClusterIP服务。对于
ShardedCluster:mongos: 使用spec.service或<resource-name>-svc中的名称。Config servers:
<resource-name>-cs.每个分片:
<resource-name>-sh。
下图演示了副本集的协调流程:
下图演示分片集群的协调流程:
MongoDBUser 资源协调
如果用户身份验证方法是 SCRAM,则 MongoDBUser 资源取决于存储用户凭证的秘密。Kubernetes 操作符 会监视秘密的变化,并按如下方式进行协调:
从
spec.MongoDBResourceRef.name确定 MongoDB 用户的资源。连接到 MongoDB Ops Manager,读取组织和项目,并验证代理秘钥。
更新 MongoDB Ops Manager 中的用户凭据,如果该凭据不存在,则创建新用户。如果用户名已更改,Kubernetes 操作符 会删除旧名称,然后添加新名称。
下图说明了 MongoDBUser 协调流程: