MongoDB Ops Manager リソースによって、外部のアプリケーションデータベースを内部マネジメントに戻すことができます。MongoDB Ops Manager リソースは既存のアプリケーションデータベース StatefulSet を回収し、ユーザーはその後、それをマネージャーしていた MongoDB リソースを削除します。Kubernetes 演算子は、データを移動したり再作成したりしません。また、MongoDB Ops Manager ポッドを再起動しません。
移行の仕組み
MongoDB Ops Manager リソースは、外部アプリケーションデータベースから始まります。このデータベースは、spec.role が AppDB に設定され、<primary-om-name>-db という名前の MongoDB リソースであり、アプリケーションデータベース StatefulSet を所有します。移行は次のように進行します。
MongoDB Ops Manager リソースから
spec.externalApplicationDatabaseRefを除き、spec.applicationDatabaseを追加します。Kubernetes 演算子は、MongoDBリソースに対してStatefulSetを解放するように要求します。MongoDBリソースは、MongoDB Ops Managerリソースによる再利用を待機している間、
Pendingフェーズを報告します。Kubernetes Operator は StatefulSet を回収し、内部アプリケーションデータベースとして管理します。接続文字列が変更されないため、Ops Managerの pod は再起動しません。
MongoDBリソースを削除すると、そのリソースは何も所有しなくなります。
警告
Ops Managerリソースが内部のアプリケーションデータベースを再びマネージドするようになってから、MongoDBリソースを削除してください。StatefulSetを所有している間にMongoDBリソースを削除すると、Kubernetesはアプリケーションデータベースをガベージコレクションします。その状態からリカバリするには、保持されているPersistent Volume Claimsからアプリケーションデータベースを再作成する必要があります。これにはダウンタイムが発生し、アプリケーションデータベースの認証情報がローテーションされます。
前提条件
始める前に、次のタスクを完了してください。
Kubernetes 演算子と
kubectlをインストールします。詳細については、「Kubernetes を使用したインストール。」を参照してください。プライマリ MongoDB Ops Manager リソースが外部アプリケーションデータベースを使用していることを確認します。
spec.externalApplicationDatabaseRefを<primary-om-name>-dbという名前の MongoDB リソースに設定し、spec.applicationDatabaseを設定せず、そのstatus.applicationDatabase.phaseはDisabledを報告します。MongoDB リソースが
Runningフェーズにあり、アプリケーションデータベース StatefulSet を所有していることを確認してください。
Considerations
移行する前に、次の検討事項を検討してください。
spec.applicationDatabase.versionをアプリケーションデータベースがすでに実行しているバージョンに設定します。同じバージョンを再利用することで、同じバイナリとデータをそのまま維持します。別のバージョンは、ハンドオーバーと同時にアプリケーションデータベースのアップグレードを開始します。Kubernetes 演算子は、外部のアプリケーションデータベース用に作成したMongoDB Ops Managerプロジェクトを削除しません。そのプロジェクトを除くと、アプリケーションデータベースの過去のメトリクスが読み取れなくなるため、クリーンアップするかどうかはユーザーが判断してください。
手順
開始状態を確認します。
MongoDB Ops Managerリソースが外部のアプリケーションデータベースを参照しており、そのアプリケーションデータベースが
Disabledとして報告されていることを確認します。kubectl get om "${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='ref={.spec.externalApplicationDatabaseRef.name} appdb={.status.applicationDatabase.phase}{"\n"}'MongoDB リソース がアプリケーションデータベース StatefulSet を所有していることを確認します。
kubectl get statefulset "${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{range .metadata.ownerReferences[*]}{.kind}/{.name}{"\n"}{end}'コマンドは
MongoDB/${APPDB_NAME}を返します。
MongoDB Ops Manager リソースを内部アプリケーションデータベースを使用するように再構成します。
このパッチは spec.externalApplicationDatabaseRef を除き、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}\"}}}"MongoDB Ops ManagerリソースがStatefulSetを再利用するのを待ちます。
MongoDBリソースがStatefulSetを解放したことを確認します。リソースは、MongoDB Ops Managerリソースへの逆移行中であるというメッセージとともに
Pendingフェーズを報告します。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"}'MongoDB Ops Managerリソースが内部アプリケーションデータベースを再び管理するのを待ちます。
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
移行を検証します。
MongoDB Ops Manager リソースがアプリケーションデータベース StatefulSet を所有していることを確認してください。
kubectl get statefulset "${APPDB_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{range .metadata.ownerReferences[*]}{.kind}/{.name}{"\n"}{end}'コマンドは
MongoDBOpsManager/${PRIMARY_OM_NAME}を返します。MongoDB Ops Managerリソースがアプリケーションデータベースを
Runningとして報告しており、MongoDBリソースが存在しなくなったことを確認します。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}"MongoDB Ops Manager ポッドの経過時間と再起動回数を確認し、再起動していないことを確認します。
kubectl get pods --context "${K8S_CTX}" -n "${MDB_NS}"
マルチクラスター アプリケーション データベースを返す
プライマリ Ops Managerリソースが外部の MongoDB MultiCluster Application Database を参照している場合は、それを内部で管理されているマルチクラスターの Application Database に戻すことができます。 Kubernetes Operator は、MongoDB MultiClusterリソースに対して、各ノード クラスタでアプリケーション データベース ステートメントをリリースするように要求します。その後、Ops Managerリソースは各ステートメントを内部アプリケーションデータベースとして再取得します。接続文字列が変更されないため、Ops Manager ポッドは再起動しません。
この手順は、次の違いを除いて、このページの単一クラスターの手順と一致します。
ノード クラスターとアプリケーション データベース TLS 構成用に次の追加の環境変数を設定します。外部アプリケーション データベースが使用するのと同じ値を使用します。
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"復元された
spec.applicationDatabaseは、topologyをMultiClusterに設定し、外部アプリケーション データベースと同じノード 配置と TLS 構成を使用する必要がある必要があります。これにより、Ops Managerリソースは既存の Atlas App Services を再利用できるようになります。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}]}}}"MongoDB リソースは
Pendingフェーズを報告し、Ops Managerリソースはステートメントを再利用します。 MongoDB MultiClusterリソースは、status.applicationDatabase.phaseがRunningを報告した後にのみ削除します。移行を確認するには、
<primary-om-name>-db-<cluster-index>という名前の各ノードクラスターのアプリケーション データベース ステートメントを調べます。引き継ぎ後、StatusSet は空のownerReferencesのままで維持され、Ops Managerリソースはそれを内部アプリケーション データベースとして管理します。
一般的な移行の問題
MongoDB リソースは StatefulSet を解放しない
MongoDBリソースがRunningフェーズのままで、依然としてStatefulSetを所有している場合、MongoDB Ops Managerリソースはリリースを要求していません。パッチセットspec.externalApplicationDatabaseRefがnullに適用され、spec.applicationDatabaseが追加されたことを確認します。
アプリケーションデータベースのバージョンが一致していません
spec.applicationDatabase.version をアプリケーションデータベースがすでに実行しているバージョンに設定することで、回収された StatefulSet で同じバイナリを維持できます。
MongoDBリソースを削除するのが早すぎました
MongoDBリソースを削除してもStatefulSetが所有されたままである場合、KubernetesはStatefulSetと、それがMongoDB Ops Managerリソースと共有するシークレットをガベージコレクションします。復旧するには、保持されている Persistent Volume Claims からアプリケーションデータベースを再作成します。このパスはダウンタイムを引き起こし、アプリケーションデータベースの認証情報をローテーションします。詳細については、「 MongoDB Ops Managerと AppDB リソースの障害復旧 」を参照してください。
次のステップ
外部のアプリケーションデータベースを再度使用するには、「アプリケーションデータベースを外部配置に移行する」を参照してください。