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

部署 MongoDB Ops Manager 使用外部应用程序数据库

您可以部署使用外部应用程序数据库的 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 图表的使用权限。

将 MongoDB Ops Manager 版本和应用程序数据库版本设置为一致的版本对。管理 MongoDB Ops Manager 实例托管外部应用程序数据库,因此,应用程序数据库版本必须是管理 MongoDB Ops Manager 实例在其版本清单中提供的 MongoDB 版本。示例,8.0.xOps Manager 实例提供 8.0.xMongoDB 版本,但是 7.0.xMongoDB Ops Manager 实例不存在。

1
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 派生的原因。

2
kubectl create namespace "${MDB_NS}" --context "${K8S_CTX}"
3
helm upgrade --install --kube-context "${K8S_CTX}" \
--namespace "${MDB_NS}" --create-namespace \
mongodb-kubernetes "${OPERATOR_HELM_CHART}"
kubectl rollout status deployment/mongodb-kubernetes-operator \
--context "${K8S_CTX}" -n "${MDB_NS}" --timeout=300s
4

两个 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}"
5
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。

6
  1. 等待内部托管的应用程序数据库和 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
  2. 确认 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
  3. 确认 Kubernetes 操作符已为管理 MongoDB Ops Manager 实例创建了管理式 API 密钥秘密:

    kubectl get secret "${MANAGEMENT_OM_ADMIN_KEY_SECRET}" \
    --context "${K8S_CTX}" -n "${MDB_NS}"
7
kubectl create configmap "${APPDB_PROJECT_CONFIGMAP}" \
--context "${K8S_CTX}" -n "${MDB_NS}" \
--from-literal=baseUrl="${MANAGEMENT_OM_URL}" \
--from-literal=projectName="${APPDB_PROJECT_NAME}" \
--from-literal=orgId=""
8
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。

9

此资源省略了 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 操作符配置文件系统备份存储。

10
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。这是预期的,并不是错误。

11
  1. 确认管理 MongoDB Ops Manager Pod、外部应用程序数据库 Pod 和主节点 (primary node in the replica set) MongoDB Ops Manager Pod 正在运行:

    kubectl get pods --context "${K8S_CTX}" -n "${MDB_NS}"
  2. 确认 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}。

  3. 确认 Kubernetes 操作符已创建用于主节点 (primary node in the replica set) MongoDB Ops Manager 实例的连接字符串密钥:

    kubectl get secret "${APPDB_CONNECTION_STRING_SECRET}" \
    --context "${K8S_CTX}" -n "${MDB_NS}"

如果外部应用程序数据库报告 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 数据库备份。