Você pode implantar um recurso do MongoDB Ops Manager que usa um banco de dados de aplicativo externo: um recurso personalizado do MongoDB com spec.role definido como AppDB, que uma segunda instância do MongoDB Ops Manager gerencia como um projeto. Isso permite que o Ops Manager faça backup e restaure o banco de dados de aplicativo. Para aprender mais, consulte Fazer backup do banco de dados de aplicativo do MongoDB Ops Manager.
Este procedimento implanta uma nova instância do MongoDB Ops Manager. Para converter uma instância existente do MongoDB Ops Manager que usa um banco de dados de aplicativo gerenciado internamente, consulte Migrar um banco de dados de aplicativo para uma implantação externa.
Este procedimento implanta os seguintes recursos:
Uma instância de gerenciamento do MongoDB Ops Manager com seu próprio banco de dados de aplicativo gerenciado internamente. Esta instância gerencia o projeto que contém o banco de dados de aplicativo externo.
Um banco de dados de aplicativo externo: um conjunto de réplicas do MongoDB com
spec.roledefinido comoAppDB, chamado<primary-om-name>-db.Uma instância primária do MongoDB Ops Manager que omite
spec.applicationDatabasee faz referência ao banco de dados de aplicativo externo comspec.externalApplicationDatabaseRef.
Pré-requisitos
Antes de começar, conclua as seguintes tarefas:
Implantar um cluster Kubernetes com um
StorageClasspadrão.Instale
kubectlehelme configure-os para esse cluster.Obtenha acesso ao gráfico Helm do Kubernetes operador.
Considerações
Defina a versão do MongoDB Ops Manager e a versão do banco de dados de aplicativo como um par consistente. A instância do MongoDB Ops Manager de gerenciamento gerencia o banco de dados de aplicativo externo, portanto, a versão do banco de dados de aplicativo deve ser uma versão do MongoDB que a instância do MongoDB Ops Manager de gerenciamento ofereça em seu manifesto da versão. Por exemplo, uma 8.0.x instância do MongoDB Ops Manager oferece 8.0.x versões do MongoDB, mas uma 7.0.x A instância do MongoDB Ops Manager não. Para encontrar um par compatível, consulte a matriz de compatibilidade do banco de dados de aplicativo.
Procedimento
Defina as variáveis de ambiente para a implantação.
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"O operador do Kubernetes exige que o banco de dados de aplicativo externo seja nomeado como <primary-om-name>-db, e é por isso que APPDB_NAME deriva de PRIMARY_OM_NAME.
Criar o segredo de administrador do MongoDB Ops Manager.
Ambos os recursos do MongoDB Ops Manager referenciam este segredo com 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}"Implantar a instância do MongoDB Ops Manager de gerenciamento.
kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBOpsManagermetadata: 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.2EOFAs configurações de e-mail mms.* são obrigatórias. Quando mms.ignoreInitialUiSetup é true, a verificação prévia do MongoDB Ops Manager não inicia o MongoDB Ops Manager, a menos que mms.fromEmailAddr e as configurações de e-mail relacionadas estejam presentes.
Aguarde até que a instância de gerenciamento do MongoDB Ops Manager esteja pronta.
Aguarde o banco de dados de aplicativo gerenciado internamente e o recurso do 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=1800sConfirme se a API pública do MongoDB Ops Manager responde às solicitações. Um
opsManager.phasedeRunningsignifica que o pod do MongoDB Ops Manager está ativo, mas a API que o operador do Kubernetes usa para criar o projeto do banco de dados de aplicativo pode atrasar alguns segundos. Uma resposta401é a resposta não autenticada esperada e significa que a API está pronta: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 10doneConfirmar que o operador Kubernetes criou o segredo da chave de API programática para a instância de gerenciamento do MongoDB Ops Manager:
kubectl get secret "${MANAGEMENT_OM_ADMIN_KEY_SECRET}" \ --context "${K8S_CTX}" -n "${MDB_NS}"
Crie o banco de dados de aplicativo externo.
kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBmetadata: 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: trueEOF
kubectl wait --for=jsonpath='{.status.phase}'=Running \ mdb/"${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=1200sQuando você define spec.role como AppDB, o operador Kubernetes configura a autenticação SCRAM para o recurso. Para aprender mais, consulte spec.role.
Implantar a instância primária do MongoDB Ops Manager.
Este recurso omite spec.applicationDatabase e referencia o banco de dados de aplicativo externo em vez disso.
kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBOpsManagermetadata: 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.2EOFPara habilitar o backup para suas implantações do MongoDB, defina spec.backup.enabled como true neste recurso e configure o armazenamento de snapshot. Para aprender mais, consulte Configurar armazenar de backup do sistema de arquivos com o Kubernetes operador.
Aguarde a instância primária do Ops Manager ficar pronta.
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=600sO operador Kubernetes não gerencia um banco de dados de aplicativo interno para um recurso do MongoDB Ops Manager que usa um banco de dados de aplicativo externo, portanto, status.applicationDatabase.phase relata Disabled. Isso é esperado e não é um erro.
Verifique a implantação.
Confirme se os pods de gerenciamento do MongoDB Ops Manager, os pods externos do banco de dados de aplicativo e os pods primários do MongoDB Ops Manager estão em execução:
kubectl get pods --context "${K8S_CTX}" -n "${MDB_NS}"Confirme se o recurso do MongoDB possui o StatefulSet do banco de dados de aplicativo e se o recurso primário do MongoDB Ops Manager não possui:
kubectl get statefulset "${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{range .metadata.ownerReferences[*]}{.kind}/{.name}{"\n"}{end}'O comando retorna
MongoDB/${APPDB_NAME}.Confirme que o operador Kubernetes criou o segredo da string de conexão para a instância primária do MongoDB Ops Manager:
kubectl get secret "${APPDB_CONNECTION_STRING_SECRET}" \ --context "${K8S_CTX}" -n "${MDB_NS}"
Problemas comuns de banco de dados de aplicativo externo
O recurso MongoDB relata um erro de versão
Se o banco de dados de aplicativo externo relatar Failed com uma mensagem de que a versão do MongoDB não está disponível, defina spec.version para uma versão que a instância do MongoDB Ops Manager de gerenciamento oferece. Mantenha a versão do MongoDB Ops Manager e a versão do banco de dados de aplicativo na mesma versão principal. O próprio banco de dados de aplicativo gerenciado internamente da instância do MongoDB Ops Manager de gerenciamento não é afetado, porque ele baixa binários diretamente quando você define automation.versions.source como mongodb.
O banco de dados de aplicativo externo permanece pendente
Se o banco de dados de aplicativo externo permanecer na Pending fase e o MongoDB Agent nunca receber uma configuração de automação, você pode ter criado o recurso MongoDB antes que a API pública do MongoDB Ops Manager de gerenciamento estivesse atendendo às solicitações. O operador Kubernetes não conseguiu criar o projeto. Confirme se a verificação de prontidão da API retorna 401 e, em seguida, reconcilie o recurso novamente.
O operador rejeita a Referência externa do banco de dados de aplicativo
O valor de spec.externalApplicationDatabaseRef.name deve ser exatamente <primary-om-name>-db, e o recurso do MongoDB deve estar no mesmo namespace que o recurso do MongoDB Ops Manager.
Próximos passos
Para fazer backup do banco de dados de aplicativo externo, habilite o backup no recurso MongoDB no projeto que a instância de gerenciamento do MongoDB Ops Manager gerencia. Para saber mais, consulte Configurar backups do banco de dados MongoDB.