内部でマネージドされるアプリケーションデータベースを使用する MongoDB Ops Manager リソースを、外部アプリケーションデータベースを使用するリソースに変換できます。これは、spec.role が AppDB に設定されている MongoDB カスタムリソースです。これにより、Ops Manager はアプリケーションデータベースをバックアップおよび復元することができます。詳細については、MongoDB Ops Manager アプリケーションデータベースのバックアップ。を参照してください。
この移行により、既存のアプリケーションデータベースStatefulSetとその永続ボリュームの所有権が、MongoDB Ops ManagerリソースからMongoDBリソースに再割り当てされます。Kubernetes演算子はデータを移動または再作成せず、MongoDB Ops Managerポッドを再起動しません。
移行の仕組み
MongoDB Ops Manager リソースは、内部でマネージドされるアプリケーションデータベースを使用して始まります。また、Kubernetes 演算子は、<primary-om-name>-db という名前の StatefulSet を所有します。移行は次のように進行します。
を に設定し、StatefulSet と同じ名前を持つ MongoDB
spec.roleAppDBリソースを、マネジメント Ops Manager インスタンスがマネージドするプロジェクト内に作成します。MongoDB リソースはまだ StatefulSet の所有権を取得できないため、アプリケーションデータベース StatefulSet の所有権を取得できないというメッセージが表示され、Pendingフェーズのままになります。spec.externalApplicationDatabaseRefをMongoDB Ops Managerリソースに追加します。Kubernetes 演算子は、MongoDB Ops Managerリソースのオーナー参照を除き、StatefulSetを移行の準備完了としてマークすることで、StatefulSetを切り離します。その後、MongoDBリソースがその所有権を取得します。
Kubernetes 演算子は以前と同じ接続文字列を計算し、同じホスト名を使用するため、Ops Managerポッドは再起動しません。
前提条件
始める前に、次のタスクを完了してください。
Kubernetes 演算子と
kubectlをインストールします。詳細については、「Kubernetes を使用したインストール。」を参照してください。内部でマネージドされているアプリケーションデータベースを使用するプライマリ Ops Manager リソースを配置する。このリソースは
spec.applicationDatabaseを設定します。また、Kubernetes 演算子は<primary-om-name>-dbという名前の StatefulSet を所有しています。詳細について学ぶには、Ops Managerリソースを配置するを参照してください。Runningフェーズにあり、外部アプリケーションデータベースのプロジェクトを所有するマネジメントMongoDB Ops Managerリソースを配置します。詳細を学ぶには、「外部アプリケーションデータベースを使用してMongoDB Ops Managerを配置する」を参照してください。Create credentials for the Kubernetes Operator. The secret holds the programmatic API key pair that the Kubernetes Operator uses to authenticate to the management Ops Manager API on your behalf. You can give the secret any name. To learn more, see Create Credentials for the Kubernetes Operator.
Considerations
移行する前に、次の検討事項を検討してください。
MongoDB リソースに設定するアプリケーションデータベースのバージョンは、内部でマネージドされているアプリケーションデータベースが実行するバージョンと一致している必要があります。また、マネジメント MongoDB Ops Manager インスタンスが提供する MongoDB のバージョンである必要があります。
Kubernetes 演算子は移行時に
spec.applicationDatabase.passwordSecretKeyRefをサポートしていません。Kubernetes 演算子は新しいパスワードを生成し、提供したパスワードをローテーションします。MongoDBリソース構成が、異なるポッドテンプレートや異なるコンテナセットなど、内部でマネージドされているアプリケーションデータベース構成と異なる場合、アプリケーションデータベースは1〜2分間利用できなくなる可能性があります。2つの構成が意味的に同一である場合、アプリケーションデータベースは利用可能なままです。
マルチクラスターのアプリケーション データベースを移行するには、内部で管理されるアプリケーション データベースが
spec.applicationDatabase.topologyをMultiClusterに設定し、外部のアプリケーション データベースが MongoDB MultiClusterリソースである必要があります。現在のアプリケーション データベースのトポロジーが外部アプリケーション データベースの種類と一致しない場合、 Kubernetes演算子は移行を拒否します。詳細については、「 マルチクラスター アプリケーション データベースの移行 」を参照してください。
手順
移行用の環境変数を設定してください。
export K8S_CTX="<your-kube-context>"export MDB_NS="mongodb"
export MANAGEMENT_OM_NAME="management-om"export PRIMARY_OM_NAME="primary-om"
export APPDB_NAME="${PRIMARY_OM_NAME}-db"export APPDB_VERSION="8.0.5-ent"
export MANAGEMENT_OM_URL="http://${MANAGEMENT_OM_NAME}-svc.${MDB_NS}.svc.cluster.local:8080"export MANAGEMENT_OM_ADMIN_KEY_SECRET="<your-operator-credentials-secret>"
export APPDB_PROJECT_CONFIGMAP="${APPDB_NAME}-config"export APPDB_PROJECT_NAME="external-appdb"開始状態を確認します。
プライマリ MongoDB Ops Manager リソースとその内部でマネージドされているアプリケーションデータベースが
Runningフェーズであることを確認します。kubectl get om "${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{.status.opsManager.phase} / appdb={.status.applicationDatabase.phase}{"\n"}'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}を返します。
外部アプリケーションデータベース用のプロジェクト ConfigMap を作成します。
orgIdの値が必要です。空のstringに設定すると、Kubernetes 演算子 はプロジェクトと同じ名前で組織を作成します。
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=""外部アプリケーションデータベース用のMongoDBリソースを作成します。
既存のアプリケーションデータベースStatefulSetと同じ名前をリソースに付けます。
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: true security: authentication: enabled: true modes: ["SCRAM"] ignoreUnknownUsers: trueEOFMongoDB リソースが所有権を待機していることを確認します。
MongoDB Ops Manager リソースが StatefulSet を解放するまで、MongoDB リソースは 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"}'ステータスメッセージによると、リソースはアプリケーションデータベース StatefulSet の所有権を取得できません。
外部アプリケーションデータベースの参照を MongoDB Ops Manager リソースに追加します。
kubectl patch om "${PRIMARY_OM_NAME}" \ --context "${K8S_CTX}" -n "${MDB_NS}" \ --type merge \ -p "{\"spec\":{\"externalApplicationDatabaseRef\":{\"name\":\"${APPDB_NAME}\",\"kind\":\"MongoDB\"}}}"同じパッチ内で spec.applicationDatabase を除くことができます。そのままにしておいても影響はありません。spec.externalApplicationDatabaseRef を設定すると、Kubernetes 演算子はこのリソースの内部アプリケーションデータベースの管理を停止します。
移行を検証します。
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 リソースがアプリケーションデータベースを
Disabledとして報告していることを確認します。これは、Kubernetes 演算子がその内部アプリケーションデータベースをもはやマネージドしていないことを意味します。kubectl get om "${PRIMARY_OM_NAME}" --context "${K8S_CTX}" -n "${MDB_NS}" \ -o jsonpath='{.status.applicationDatabase.phase}{"\n"}'MongoDB Ops Manager ポッドの経過時間と再起動回数を確認し、再起動していないことを確認します。
kubectl get pods --context "${K8S_CTX}" -n "${MDB_NS}"
マルチクラスター アプリケーション データベースの移行
プライマリ Ops Managerリソースが内部で管理されるマルチクラスター アプリケーション データベースを使用する場合は、それを外部の MongoDB MultiClusterリソースに移行できます 。 Kubernetes Operator は各ノードクラスター内のアプリケーション データベース ステートメントをデタッチし、MongoDB MultiClusterリソースはそれぞれを採用します。接続文字列が変更されないため、Ops Manager ポッドは再起動しません。
この手順は、次の違いを除いて、このページの単一クラスターの手順と一致します。
内部で管理されるアプリケーション データベースは、
spec.applicationDatabase.topologyをMultiClusterに設定する必要があります。外部アプリケーション
spec.roleAppDBデータベースは、 が に設定され、名前、ノード、および TLS 構成が内部で管理されるアプリケーション データベースと同じ MongoDB MultiClusterリソースである必要があります。マルチクラスターの外部アプリケーションデータベースでは、サービスメトリクスの有無にかかわらず、TLS暗号化とメンバークラスター間のクロスクラスターネットワークが必要です。詳細については、「 マルチクラスターの外部アプリケーション データベースの配置 」を参照してください。kindMongoDBMultiClusterspec.externalApplicationDatabaseRefを追加するときに、 を に設定します。kubectl patch om "${PRIMARY_OM_NAME}" \ --context "${K8S_CTX}" -n "${MDB_NS}" \ --type merge \ -p "{\"spec\":{\"externalApplicationDatabaseRef\":{\"name\":\"${APPDB_NAME}\",\"kind\":\"MongoDBMultiCluster\"}}}"Kubernetes Operator は、各ノード クラスターで所有権の引き継ぎを実行します。移行を確認するには、
<primary-om-name>-db-<cluster-index>という名前の各ノードクラスターのアプリケーション データベース ステートメントを調べます。kubectl get statefulset "${APPDB_NAME}-0" --context "${K8S_CTX_MEMBER}" -n "${MDB_NS}" \ -o jsonpath='{.metadata.labels.mongodbmulticluster}{"\n"}'このコマンドは
<namespace>-<appdb-name>を返し、mongodb.com/appdb-migration-ready注釈はクリアされます。マルチクラスター配置での所有権の追跡の詳細については、「 移行注釈 」を参照してください。
一般的な移行の問題
MongoDB リソースでバージョン エラーが報告されています。
MongoDBリソースがFailedを報告し、MongoDBバージョンが利用できないというメッセージが表示される場合は、spec.versionをマネジメントMongoDB Ops Managerインスタンスが提供するバージョンに設定し、MongoDB Ops Managerバージョンとアプリケーションデータベースバージョンを同じメジャーバージョンに維持してください。
パッチ適用後も MongoDB リソースが保留されたままになる
Kubernetes 演算子は、MongoDB リソースが StatefulSet の所有権を取得できるようになる前に、StatefulSet を切り離す必要があります。プライマリ MongoDB Ops Manager リソースに spec.externalApplicationDatabaseRef を適用したことを確認します。また、 spec.externalApplicationDatabaseRef.name の値が正確に <primary-om-name>-db であることを確認します。
MongoDB リソースがプロジェクトエラーを報告します
MongoDB リソースがプロジェクトまたは登録エラーが発生した状態で Pending フェーズにとどまったままになる場合、リソースを作成した時点でマネジメント MongoDB Ops Manager パブリック API の準備ができていなかった可能性があります。マネジメント MongoDB Ops Manager リソースが Running フェーズにあること、およびその API がリクエストに答えることを確認します。その後、リソースを再調整します。
MongoDB Ops Manager のポッドが移行中に再起動する
MongoDB Ops Manager ポッドが再起動すると、計算された接続文字列が変更されます。デフォルトのポートを使用するレプリカセットの場合、接続文字列は移行前と移行後で同じです。Kubernetes 演算子 は、この移行でデフォルト以外のポートをサポートしていません。
次のステップ
外部アプリケーションデータベースをバックアップするには、マネジメント MongoDB Ops Manager インスタンスがマネージドするプロジェクト内の MongoDB リソースでバックアップを有効にします。詳細は、MongoDB データベース バックアップの設定を参照してください。
この移行を元に戻すには、MongoDB Ops Manager へ外部アプリケーションデータベースを戻す を参照してください。