Puede devolver una base de datos de la aplicación externa a la gestión interna mediante el recurso de MongoDB Ops Manager. El recurso de MongoDB Ops Manager recupera el StatefulSet de la base de datos de la aplicación existente y, a continuación, borra el recurso de MongoDB que la gestionaba. El operador de Kubernetes no mueve ni vuelve a crear sus datos, y no reinicia los pods de MongoDB Ops Manager.
Cómo funciona la migración
El recurso de MongoDB Ops Manager comienza con una base de datos de la aplicación externa: un recurso de MongoDB con spec.role establecido en AppDB, denominado <primary-om-name>-db, que posee el StatefulSet de la base de datos de la aplicación. La migración procede de la siguiente manera:
Usted remueve
spec.externalApplicationDatabaseRefdel recurso de MongoDB Ops Manager y añadespec.applicationDatabase.El operador de Kubernetes solicita al recurso de MongoDB que libere el StatefulSet. El recurso de MongoDB informa de la fase
Pendingmientras espera a que el recurso de MongoDB Ops Manager lo reclame.El operador de Kubernetes recupera el StatefulSet y lo gestiona como una base de datos de la aplicación interna. Debido a que la cadena de conexión no cambia, los pods de MongoDB Ops Manager no se reinician.
Borra el recurso de MongoDB, que ya no posee nada.
Advertencia
Borre el recurso de MongoDB solo después de que el recurso de MongoDB Ops Manager gestione de nuevo la base de datos interna de la aplicación. Si borrar el recurso de MongoDB mientras aún es propietario del StatefulSet, Kubernetes elimina automáticamente la base de datos de la aplicación. Recuperarse de ese estado requiere volver a crear la base de datos de la aplicación a partir de las reclamaciones de volumen persistente retenidas reclamaciones de volumen persistente, lo que provoca un tiempo de inactividad y rota las credenciales de la base de datos de la aplicación.
Requisitos previos
Antes de comenzar, cumpla con las siguientes tareas:
Instala el operador de Kubernetes y
kubectl. Para aprender más, consulta Instala con Kubernetes.Confirme que el recurso primario de MongoDB Ops Manager utiliza una base de datos de la aplicación externa: establece
spec.externalApplicationDatabaseRefen un recurso de MongoDB denominado<primary-om-name>-db, no establecespec.applicationDatabase, y sustatus.applicationDatabase.phaseinformaDisabled.Confirme que el recurso de MongoDB está en la fase
Runningy es propietario del StatefulSet de la base de datos de la aplicación.
Considerations
Revise las siguientes consideraciones antes de migrar:
Establezca
spec.applicationDatabase.versionen la versión que la base de datos de la aplicación ya ejecuta. La reutilización de la misma versión mantiene los mismos archivos binarios y datos en su lugar. Otra versión inicia una actualización de la base de datos de la aplicación al mismo tiempo que el traspaso.El operador de Kubernetes no borra el Proyecto de MongoDB Ops Manager que creó para la base de datos de la aplicación externa. Remover ese Proyecto hace que las métricas históricas de la base de datos de la aplicación sean ilegibles, por lo tanto, limpiarlo es su decisión.
Procedimiento
Confirme el estado inicial.
Confirme que el recurso de MongoDB Ops Manager hace referencia a la base de datos de la aplicación externa e informa de su base de datos de la aplicación como
Disabled:kubectl get om "${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='ref={.spec.externalApplicationDatabaseRef.name} appdb={.status.applicationDatabase.phase}{"\n"}'Confirme que el recurso de MongoDB es propietario del StatefulSet de la base de datos de la aplicación:
kubectl get statefulset "${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{range .metadata.ownerReferences[*]}{.kind}/{.name}{"\n"}{end}'El comando devuelve
MongoDB/${APPDB_NAME}.
Reconfigure el recurso de MongoDB Ops Manager para usar una base de datos de la aplicación interna.
Este parche elimina spec.externalApplicationDatabaseRef y agrega spec.applicationDatabase.
kubectl patch om "${PRIMARY_OM_NAME}" \ --context "${K8S_CTX}" -n "${MDB_NS}" \ --type merge \ -p "{\"spec\":{\"externalApplicationDatabaseRef\":null,\"applicationDatabase\":{\"members\":3,\"version\":\"${APPDB_VERSION}\"}}}"Esperar a que el recurso de MongoDB Ops Manager recupere el StatefulSet.
Confirme que el recurso de MongoDB libera el StatefulSet. El recurso informa la fase
Pendingcon un mensaje de que está en migración inversa al recurso de MongoDB Ops Manager:kubectl wait --for=jsonpath='{.status.phase}'=Pending \ mdb/"${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=300s kubectl get mdb "${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{.status.message}{"\n"}'Espere a que el recurso de Ops Manager gestione de nuevo la base de datos de la aplicación:
kubectl wait --for=jsonpath='{.status.applicationDatabase.phase}'=Running \ om/"${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=1200s kubectl wait --for=jsonpath='{.status.opsManager.phase}'=Running \ om/"${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" --timeout=1800s
Verifique la migración.
Confirme que el recurso de MongoDB Ops Manager es propietario del StatefulSet de la base de datos de la aplicación:
kubectl get statefulset "${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{range .metadata.ownerReferences[*]}{.kind}/{.name}{"\n"}{end}'El comando devuelve
MongoDBOpsManager/${PRIMARY_OM_NAME}.Confirme que el recurso de MongoDB Ops Manager informa que su base de datos de la aplicación es
Runningy que el recurso de MongoDB ya no existe:kubectl get om "${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{.status.applicationDatabase.phase}{"\n"}' kubectl get mdb --context "${K8S_CTX}" -n "${MDB_NS}"Confirme que los pods de MongoDB Ops Manager no se reiniciaron comprobando su antigüedad y el número de reinicios:
kubectl get pods --context "${K8S_CTX}" -n "${MDB_NS}"
Devuelve una base de datos de aplicación multiclúster.
Si el recurso principal de Ops Manager hace referencia a una base de datos de aplicación MongoDBMultiCluster externa, puede devolverla a una base de datos de aplicación multiclúster gestionada internamente. El operador de Kubernetes solicita al recurso MongoDBMultiCluster que libere el StatefulSet de la base de datos de aplicación en cada clúster miembro. A continuación, el recurso Ops Manager vuelve a adoptar cada StatefulSet como una base de datos de aplicación interna. Los pods de Ops Manager no se reinician, ya que la cadena de conexión no cambia.
El procedimiento coincide con el procedimiento de clúster único que se describe en esta página, con las siguientes diferencias:
Configure las siguientes variables de entorno adicionales para los clústeres miembros y la configuración TLS de la base de datos de la aplicación. Utilice los mismos valores que utiliza la base de datos de la aplicación externa:
export K8S_CTX_MEMBER_1="<member-cluster-1-context>"export K8S_CTX_MEMBER_2="<member-cluster-2-context>"export APPDB_CERT_PREFIX="appdb"export APPDB_CA_CONFIGMAP="${APPDB_NAME}-ca"El
spec.applicationDatabaserestaurado debe establecertopologyenMultiClustery debe usar el mismo diseño de miembro y configuración TLS que la base de datos de la aplicación externa, para que el recurso del administrador de operaciones pueda volver a adoptar los StatefulSets existentes:kubectl patch om "${PRIMARY_OM_NAME}" \ --context "${K8S_CTX}" -n "${MDB_NS}" \ --type merge \ -p "{\"spec\":{\"externalApplicationDatabaseRef\":null,\"applicationDatabase\":{\"topology\":\"MultiCluster\",\"version\":\"${APPDB_VERSION}\",\"security\":{\"certsSecretPrefix\":\"${APPDB_CERT_PREFIX}\",\"tls\":{\"ca\":\"${APPDB_CA_CONFIGMAP}\"}},\"clusterSpecList\":[{\"clusterName\":\"${K8S_CTX_MEMBER_1}\",\"members\":2},{\"clusterName\":\"${K8S_CTX_MEMBER_2}\",\"members\":2}]}}}"El recurso MongoDBMultiCluster informa la fase
Pendingmientras que el recurso Ops Manager recupera los StatefulSets. Elimine el recurso MongoDBMultiCluster solo después de questatus.applicationDatabase.phaseinformeRunning.Para verificar la migración, inspeccione el StatefulSet de la base de datos de la aplicación en cada clúster miembro, denominado
<primary-om-name>-db-<cluster-index>. Tras la transferencia, el StatefulSet permanece con unownerReferencesvacío, y el recurso del Administrador de operaciones lo gestiona como una base de datos de aplicación interna.
Problemas comunes de migración
El recurso de MongoDB no libera el StatefulSet
Si el recurso de MongoDB permanece en la fase Running y sigue siendo propietario del StatefulSet, el recurso de MongoDB Ops Manager no ha solicitado la liberación. Confirme que su conjunto de parches spec.externalApplicationDatabaseRef a null y añadió spec.applicationDatabase.
La versión de la base de datos de la aplicación no coincide
Establezca spec.applicationDatabase.version en la versión que la base de datos de la aplicación ya ejecuta para que el StatefulSet recuperado mantenga los mismos binarios.
Borraste el recurso de MongoDB demasiado pronto
Si borrar el recurso de MongoDB mientras siga siendo propietario del StatefulSet, Kubernetes elimina el StatefulSet y los secretos que comparte con el recurso de MongoDB Ops Manager. Para recuperar, vuelva a crear la base de datos de la aplicación a partir de las reclamaciones de volumen persistente retenidas. Esta ruta provoca tiempo de inactividad y rota las credenciales de la base de datos de la aplicación. Para obtener más información, consulta Recuperación ante desastres para los recursos de Ops Manager y AppDB.
Próximos pasos
Para usar una base de datos de la aplicación externa de nuevo, consulte Migrar una base de datos de la aplicación a una implementación externa.