您可以部署使用外部应用程序数据库的 MongoDB Ops Manager 资源:即一个将 spec.role 设置为 AppDB 的 MongoDB 自定义资源,由第二个 MongoDB Ops Manager 实例作为项目进行托管。这样就可以让 MongoDB Ops Manager 备份和恢复应用程序数据库。要了解更多信息,请参阅 备份 MongoDB Ops Manager 应用程序数据库。
此过程部署一个新的 MongoDB Ops Manager 实例。要转换使用内部托管应用程序数据库的现有 MongoDB Ops Manager 实例,请参阅将应用程序数据库迁移到外部部署。
此过程将部署以下资源:
一个管理MongoDB Ops Manager 实例及其自己的内部托管应用程序数据库。此实例托管包含外部应用程序数据库的项目。
一个外部应用程序数据库:一个 MongoDB 副本集,其中
spec.role设置为AppDB,名称为<primary-om-name>-db。一个主节点 (primary node in the replica set) MongoDB Ops Manager 实例,它省略了
spec.applicationDatabase并引用了带有spec.externalApplicationDatabaseRef的外部应用程序数据库。
先决条件
在开始之前,请完成以下任务:
部署具有默认
StorageClass的 Kubernetes 集群。安装
kubectl和helm,并为该集群配置它们。获取 Kubernetes 操作符 Helm 图表的使用权限。
Considerations
将 MongoDB Ops Manager 版本和应用程序数据库版本设置为一致的版本对。管理 MongoDB Ops Manager 实例托管外部应用程序数据库,因此,应用程序数据库版本必须是管理 MongoDB Ops Manager 实例在其版本清单中提供的 MongoDB 版本。示例,8.0.xOps Manager 实例提供 8.0.xMongoDB 版本,但是 7.0.xMongoDB Ops Manager 实例不存在。
步骤
为部署设置环境变量。
export K8S_CTX="<your-kube-context>" export MDB_NS="mongodb" export OPERATOR_HELM_CHART="oci://quay.io/mongodb/helm-charts/mongodb-kubernetes" export OM_VERSION="8.0.7" export APPDB_VERSION="8.0.5-ent" export MANAGEMENT_OM_NAME="management-om" export PRIMARY_OM_NAME="primary-om" export APPDB_NAME="${PRIMARY_OM_NAME}-db" export MANAGEMENT_OM_URL="http://${MANAGEMENT_OM_NAME}-svc.${MDB_NS}.svc.cluster.local:8080" export MANAGEMENT_OM_ADMIN_KEY_SECRET="${MDB_NS}-${MANAGEMENT_OM_NAME}-admin-key" export APPDB_PROJECT_CONFIGMAP="${APPDB_NAME}-config" export APPDB_PROJECT_NAME="external-appdb" export APPDB_CONNECTION_STRING_SECRET="${APPDB_NAME}-connection-string" export OM_ADMIN_EMAIL="admin@example.com" export OM_ADMIN_PASSWORD="<your-password>" export OM_ADMIN_FIRST_NAME="Admin" export OM_ADMIN_LAST_NAME="User"
Kubernetes 操作符 要求外部应用程序数据库命名为 <primary-om-name>-db,这就是 APPDB_NAME 从 PRIMARY_OM_NAME 派生的原因。
创建 MongoDB Ops Manager 管理秘密。
两个 MongoDB Ops Manager 资源引用此秘密,并使用 spec.adminCredentials.
kubectl create secret generic ops-manager-admin-secret \ --context "${K8S_CTX}" -n "${MDB_NS}" \ --from-literal=Username="${OM_ADMIN_EMAIL}" \ --from-literal=Password="${OM_ADMIN_PASSWORD}" \ --from-literal=FirstName="${OM_ADMIN_FIRST_NAME}" \ --from-literal=LastName="${OM_ADMIN_LAST_NAME}"
部署管理 MongoDB Ops Manager 实例。
kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOF apiVersion: mongodb.com/v1 kind: MongoDBOpsManager metadata: name: ${MANAGEMENT_OM_NAME} spec: replicas: 1 version: ${OM_VERSION} adminCredentials: ops-manager-admin-secret applicationDatabase: members: 3 version: ${APPDB_VERSION} backup: enabled: false configuration: automation.versions.source: mongodb mms.ignoreInitialUiSetup: "true" mms.adminEmailAddr: admin@example.com mms.fromEmailAddr: admin@example.com mms.replyToEmailAddr: admin@example.com mms.mail.hostname: email-smtp.us-east-1.amazonaws.com mms.mail.port: "465" mms.mail.ssl: "true" mms.mail.transport: smtp mms.minimumTLSVersion: TLSv1.2 EOF
mms.* 邮件设置是必需的。当 mms.ignoreInitialUiSetup 为 true 时,除非存在 mms.fromEmailAddr 和相关的邮件设置,否则 MongoDB Ops Manager 预检检查不会启动 MongoDB Ops Manager。
等待管理 MongoDB Ops Manager 实例准备就绪。
等待内部托管的应用程序数据库和 MongoDB Ops Manager 资源:
kubectl wait --for=jsonpath='{.status.applicationDatabase.phase}'=Running \ om/"${MANAGEMENT_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=1200s kubectl wait --for=jsonpath='{.status.opsManager.phase}'=Running \ om/"${MANAGEMENT_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=1800s 确认 Ops Manager 公共 API 回答请求。
opsManager.phase的Running表示 MongoDB Ops Manager pod 已启动,但 Kubernetes 操作符用于创建应用程序数据库项目的 API 可能会有几秒的延迟。401响应是预期的未经身份验证响应,并表示 API 已就绪:om_pod="${MANAGEMENT_OM_NAME}-0" until [ "$(kubectl exec "${om_pod}" -c mongodb-ops-manager --context "${K8S_CTX}" -n "${MDB_NS}" -- \ curl -s -o /dev/null -w '%{http_code}' \ "http://$(kubectl get pod "${om_pod}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{.status.podIP}'):8080/api/public/v1.0" 2>/dev/null)" = "401" ]; do echo "waiting for management Ops Manager public API..."; sleep 10 done 确认 Kubernetes 操作符已为管理 MongoDB Ops Manager 实例创建了管理式 API 密钥秘密:
kubectl get secret "${MANAGEMENT_OM_ADMIN_KEY_SECRET}" \ --context "${K8S_CTX}" -n "${MDB_NS}"
创建外部应用程序数据库。
kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOF apiVersion: mongodb.com/v1 kind: MongoDB metadata: name: ${APPDB_NAME} spec: members: 3 version: ${APPDB_VERSION} type: ReplicaSet role: AppDB opsManager: configMapRef: name: ${APPDB_PROJECT_CONFIGMAP} credentials: ${MANAGEMENT_OM_ADMIN_KEY_SECRET} persistent: true EOF kubectl wait --for=jsonpath='{.status.phase}'=Running \ mdb/"${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=1200s
当您将 spec.role 设置为 AppDB 时,Kubernetes 操作符会针对该资源配置 SCRAM 身份验证。要了解更多信息,请参阅 spec.role。
部署主节点 (primary node in the replica set) MongoDB Ops Manager 实例。
此资源省略了 spec.applicationDatabase,而是引用了外部的应用程序数据库。
kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOF apiVersion: mongodb.com/v1 kind: MongoDBOpsManager metadata: name: ${PRIMARY_OM_NAME} spec: replicas: 1 version: ${OM_VERSION} adminCredentials: ops-manager-admin-secret externalApplicationDatabaseRef: name: ${APPDB_NAME} kind: MongoDB backup: enabled: false configuration: automation.versions.source: mongodb mms.ignoreInitialUiSetup: "true" mms.adminEmailAddr: admin@example.com mms.fromEmailAddr: admin@example.com mms.replyToEmailAddr: admin@example.com mms.mail.hostname: email-smtp.us-east-1.amazonaws.com mms.mail.port: "465" mms.mail.ssl: "true" mms.mail.transport: smtp mms.minimumTLSVersion: TLSv1.2 EOF
要为 MongoDB 部署启用备份,请将此资源上的 spec.backup.enabled 设置为 true,并配置快照存储。要了解更多,请参阅 使用 Kubernetes 操作符配置文件系统备份存储。
等待主节点 (primary node in the replica set) MongoDB Ops Manager 实例准备就绪。
kubectl wait --for=jsonpath='{.status.opsManager.phase}'=Running \ om/"${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=1800s kubectl wait --for=jsonpath='{.status.applicationDatabase.phase}'=Disabled \ om/"${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=600s
对于使用外部应用程序数据库的 MongoDB Ops Manager 资源,Kubernetes 操作符不管理内部应用程序数据库,因此 status.applicationDatabase.phase 报告 Disabled。这是预期的,并不是错误。
验证部署。
确认管理 MongoDB Ops Manager Pod、外部应用程序数据库 Pod 和主节点 (primary node in the replica set) MongoDB Ops Manager Pod 正在运行:
kubectl get pods --context "${K8S_CTX}" -n "${MDB_NS}" 确认 MongoDB 资源拥有应用程序数据库 StatefulSet,并且主节点 (primary node in the replica set) MongoDB Ops Manager 资源不拥有它:
kubectl get statefulset "${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{range .metadata.ownerReferences[*]}{.kind}/{.name}{"\n"}{end}' 该命令返回
MongoDB/${APPDB_NAME}。确认 Kubernetes 操作符已创建用于主节点 (primary node in the replica set) MongoDB Ops Manager 实例的连接字符串密钥:
kubectl get secret "${APPDB_CONNECTION_STRING_SECRET}" \ --context "${K8S_CTX}" -n "${MDB_NS}"
常见的外部应用程序数据库问题
MongoDB 资源报告版本错误
如果外部应用程序数据库报告 Failed 且消息显示 MongoDB 版本不可用,请将 spec.version 设置为管理 MongoDB Ops Manager 实例提供的版本。保持 MongoDB Ops Manager 版本和应用程序数据库版本处于同一主版本。管理 MongoDB Ops Manager 实例自身内部托管的应用程序数据库不受影响,因为当您将 automation.versions.source 设置为 mongodb 时,它会直接下载二进制文件。
外部应用程序数据库保持待处理状态
如果外部应用程序数据库处于 Pending 阶段,并且 MongoDB Agent 从未收到自动化配置,则您可能在管理 Ops Manager 公共 API 处理请求之前创建了 MongoDB 资源。Kubernetes 操作符无法创建该项目。确认 API 就绪性检查返回 401,然后再次协调资源。
操作符 拒绝外部应用程序数据库参考
spec.externalApplicationDatabaseRef.name 的值必须恰好为 <primary-om-name>-db,并且 MongoDB 资源必须与 MongoDB Ops Manager 资源位于同一命名空间中。
后续步骤
要备份外部应用程序数据库,请在管理 MongoDB Ops Manager 实例托管的项目中,在 MongoDB 资源上启用备份。要了解更多信息,请参阅配置 MongoDB 数据库备份。