AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

レプリカセットを Kubernetes に移行する

この手順では、Ops ManagerまたはCloud Managerが管理するレプリカセットを、通常のMongoDBレプリケーションを使用して、Kubernetes 演算子の下でKubernetesに移行します。これには、仮想マシンやベアメタルで実行されている配置や、別のKubernetes演算子インスタンスによって既にマネージドされている配置が含まれます。移行はライブかつ段階的に行われます。レプリカセットをKubernetesに拡張し、Kubernetesノードを昇格させてから、外部ノードを削除します。スナップショットの復元やmongosyncは必要ありません。

レプリカセットを移行する前に、以下を確認してください。

  • MongoDB Ops Manager または Cloud Manager への接続は、キー baseUrl、orgId、projectName を使用して ConfigMap されます。

  • キー publicKey および privateKey を含む API キー Secret 。

  • Kubernetes 演算子 ServiceAccount は、ドライ実行する接続性ジョブに対して batch/jobs の許可 (create、get、list、watch、および delete) を持っています。

  • プロジェクトにはちょうど 1 つの配置が含まれています。

また、次の項目も必要です。

  • MongoDB Ops Manager または Cloud Manager がマネージドする既存のレプリカセット。

  • MongoDB Ops Manager または Cloud Manager プロジェクト内の配置は 1 つだけです。

  • Kubernetes 演算子がインストールされている Kubernetes クラスター。

  • Kubernetes 演算子のバージョンに合わせた kubectl mongodb プラグイン。Kubernetes 演算子は、ドライ実行を含むリコンシルごとにこのマッチを強制します。

  • 仮想マシンホストとKubernetes Pod間の双方向ネットワーク接続とホスト名解決。

  • 配置でTLSを使用している場合、すべてのSANをカバーする事前設定済みのTLS証明書。

  • SCRAMユーザーパスワードが手元にある状態。オートメーション設定から復元することはできません。

  • 開始前に取られたバックアップ。

  • 正常で目標状態にある配置。

  • 常に 3 個以上の投票ノードを維持してください。Kubernetes 演算子は、7 個を超える投票ノードを拒否します。7 を超える場合は、投票権のない Kubernetes ノードを追加するか、投票権のある外部ノードを除いてください。

  • 一度に行う変更は1種類だけにしてください。Kubernetesノードの追加、外部ノードの削除、または一度に1つのノードの投票数と優先順位の変更のみを行います。移行が開始されると、アドミッション検証は混合変更を拒否し、移行中のKubernetesノードを除くことや外部ノードの追加も拒否します。

  • 配置が目標状態にあるときのみ実行します。

  • プライマリを最後に移行します。ノードに投票と優先順位を移行すると選挙が trigger される可能性があります。また、レプリカセットが新しいプライマリを選出する間に書き込み (write)が一時的に失敗する可能性があります。プライマリを最後に移行すると、最終ステップまでプライマリの選挙と、それが引き起こす書き込み (write)ダウンタイムをトリガーすることを回避できます。

    注意

    Kubernetes でノードの優先順位を上げることで、再選挙をtriggerすることも可能です。

  • spec.externalMembers が空でない間は、Kubernetes 演算子は 1 つのノードずつのスケーリングを強制します。このため、変更ごとには目標状態になるまで個別の待機が必要です。

1

前提条件に記述されているプロジェクト ConfigMap および API キー Secret を作成します。

2

kubectl mongodb migrate-to-mck mongodbコマンドを実行します。

kubectl mongodb migrate-to-mck mongodb \ --config-map-name <configmap> \ --secret-name <secret> \ --namespace <namespace> \ -o mongodb-cr.yaml

生成されたファイルを確認します。内容は以下の通りです。

  • spec.externalMembers, ソース プロセスをリストしています。

  • spec.members 0 に設定します。

  • プラグインが常に追加する mongodb.com/migration-dry-run: true アノテーション。

コマンドは、以下の任意フラグもサポートしています。

  • --certs-secret-prefixTLSが有効な場合に必須です。spec.security.certsSecretPrefix を設定します。

  • --prometheus-secret-namePrometheusが有効な場合に使用します。Secretは既に存在し、passwordキーを持っている必要があります。

  • --resource-name-override: 生成されたリソースに metadata.name を設定します。プラグインは、レプリカセット名が有効な Kubernetes 名ではない場合に自動的に正規化し、spec.replicaSetNameOverride を設定します。

3

この手順は、データベースユーザーを移行する場合にのみ実行してください。移行に必須ではありません。

SCRAMユーザーごとにSecretを1つずつ事前作成し、それぞれにpasswordキーを設定します。実行する:

kubectl mongodb migrate-to-mck users \ --config-map-name <configmap> \ --secret-name <secret> \ --namespace <namespace> \ --users-secrets-file users.csv \ -o users-cr.yaml

CSV ファイルは、1 行に 1 つの形式 username:database,secret-name でユーザーを Secrets にマップします。--users-secrets-file を省略すると、代わりにユーザーごとにプロンプトが表示されます。

プラグインは、X.509 と LDAP ユーザーを $external データベースに対して生成します。オートメーションエージェントユーザーをスキップします。

4

仮想マシンの証明書に署名した認証局と同じ認証局から、Kubernetesのノード証明書を発行します。

Kubernetes 演算子は、"<certsSecretPrefix>-<resourceName>-cert" という名前の kubernetes.io/tls Secret と、ca-pem キーと mms-ca.crt キーの両方を含む "<resourceName>-ca" という名前の CA ConfigMap を必要とします。証明書には、Pod ごとの DNS 名とサービス DNS 名、およびサーバー認証とクライアント認証の両方の使用をカバーする SAN が必要です。

ソース配置でTLSを使用していない場合は、移行する前に、既存の仮想マシン配置上の Ops Manager または Cloud Manager で net.tls.mode を disabled に設定してください。この場合、MongoDBカスタムリソースに何も設定する必要はありません。

注意

CA の不一致は、次のステップでのドライ実行するによって設計上捕捉されます。

5

ドライ実行するを実行する前に、spec.externalAccess を設定して、バーチャル マシン ノードが Kubernetes Pods にアクセスできるようにします。これらのノードがホスト名で Pod を解決できるようにするには、spec.externalAccess.externalDomain を設定することもできます。関与するフィールドと DNS 要件について学ぶには、移行のネットワーク要件を参照してください。

この設定はユーザーが所有します。環境に合わせてLoadBalancerやNodePort、DNSレコードを構成してください。

重要

この配置で MongoDB Search またはベクトル検索を使用する場合は、externalDomain を設定しないでください。MongoDBSearch は externalDomain を設定する MongoDB リソースをサポートしておらず、クラスター作成後にフィールドを除くことはできません。詳細については、「MongoDB Search と移行のインタラクション」を参照してください。

6

mongodb.com/migration-dry-run アノテーションが残っている状態で、生成されたリソースを適用します。アノテーションが設定されている間、Kubernetes 演算子はオートメーション構成の変更を行わず、接続の検証のみを行います。

Kubernetes 演算子は<resourceName>-connectivity-checkという名前のジョブを作成し、すべての外部ノードにダイヤルして認証を行います。ジョブはttlSecondsAfterFinishedを使用して自身を削除し、次の調整で再作成されるため、検証は自動的に行われます。KubernetesまたはMongoDB Ops Manager UIで問題を修正し、自由に再実行できます。

ドライランでは、Kubernetesから仮想マシンへの到達可能性(DNS、TLS、ファイアウォール、ノードアドレス)と認証情報(localデータベースの__systemロールを含む)、およびTLSが有効な場合のCAがチェックされます。仮想マシンからKubernetesへのインバウンド接続はチェックされません。

その方向性は完全にネットワークの設定に依存するため、単一のコマンドで保証することはできません。代わりに、このチェックリストを確認してください。

  • <metadata.name>-0.<spec.externalAccess.externalDomain> のパスワードなしに従って Kubernetes ノードが持つホスト名が、バーチャル マシン ノードから解決可能であることを確認します。

  • KubernetesノードまたはLoadBalancerのIPアドレスに、仮想マシンから到達できることを確認します。

status.conditions[type=NetworkConnectivityVerified] から結果を読み取る:

バリデーター ジョブ 終了コード
条件ステータス
理由
意味

ジョブが実行中です

Unknown

Running

status.phase は ConnectivityCheckRunning です。

0

True

NetworkValidationPassed

すべての外部ノードは到達可能であり認証済みです。

2

False

AuthenticationFailed

認証情報、認証メカニズム、または不足している__system@localロール。

3

False

NetworkFailed

DNS、TLS、タイムアウト、または到達不能なノード。ジョブPodのログを確認します。

1 またはその他

False

UnknownError

未分類の障害。ジョブ Pod ログを確認する。

ジョブの開始前に発生する失敗は、OperatorImageUnknown、BuildStatefulSetOptions、AgentCertSecretFailed、AgentCertSubject の理由を使用します。

Kubernetes 演算子は、外部ノードがなくなると、status.conditions から NetworkConnectivityVerified 状態を完全に除きます。

7

dry-run 注釈を除く:

kubectl annotate mdb <resourceName> \ mongodb.com/migration-dry-run-

この時点で、Kubernetes 演算子がOps Managerプロジェクトの所有権を取得します。

spec.members を発生させ、spec.memberConfig を手動で書き込み (write) します。

警告

spec.memberConfig を設定するノード数を増やす前に

デフォルトでは、新しい Kubernetes ノードは投票ノードとして参加します。CRD デフォルトは votes: 1 と priority: "1" です。これらのデフォルトにより、同期中のノードは最初の同期が完了する前に選挙に参加できます。

MongoDB は、ノード数を増やす前に、votes: 0 と priority: "0" を使用して、新しい Kubernetes ノードごとに spec.memberConfig エントリを 1 つ書き込み (write)することを推奨します。これにより、まだ同期中のノードが選挙に勝つことができなくなります。votes は整数です。priority は string です。

例として、3つのKubernetesノードを投票権なしで追加するには、次のようにします。

spec: memberConfig: - votes: 0 priority: "0" - votes: 0 priority: "0" - votes: 0 priority: "0"

完全な最初の同期と目標状態を待ちます。上記の任意の手順で MongoDBUser リソースを生成した場合は、今すぐ適用し、それぞれが Updated の status.phase に達していることを確認してください。

8

spec.memberConfig を編集して、投票と優先順位を Kubernetes ノードに移行します。votesは整数です。priorityは float を含んでいる string です。

外部ノードは、ソースのオートメーション設定で保持している投票権と優先順位をそのまま維持します。spec.externalMembersにはvotesまたはpriorityフィールドがありません。

目標状態を待機します。

9

重要

spec.externalMembers からは一度に 1 エントリーのみ除くことができます。各項目を除くした後、目標状態になるのを待ってから、次の項目を除くしてください。

以下に例を挙げます。

kubectl patch mdb <resourceName> --type=json \ -p='[{"op":"remove","path":"/spec/externalMembers/0"}]'

移行開始後は、エントリを除くことはできますが、追加することはできません。

status.conditions[type=Migrating].reason が Extending、InProgress、Pruning を通って動くのを見る:

理由
ステータス
意味

Validating

True

ドライラン アノテーションが設定されています。

Extending

True

目的のKubernetesノード数が、最後に調整された数を超えています。

Pruning

True

externalMembers の数が status.migrationObservedExternalMembersCount を下回りました。

InProgress

True

外部ノードは存在しますが、何も変わっていません。これも最初の調整時の理由です。

MigrationComplete

False

すべての外部ノードが削除されました。

優先順位は Validating > Extending > Pruning > InProgress です。Kubernetes 側の削除と拡大の両方を行うプルーンは Extending を報告します。これもまた、変更を1つずつ行う別の理由です。

Pruningとextendingを同時に行うことはできません。

移行の完了をスクリプトで処理するには、status.phaseをポーリングするのではなく、kubectl wait --for=condition=Migrating=Falseを使用してください。

10

移行は、spec.externalMembers が空であり、Migrating 条件が理由 MigrationComplete で False であり、すべてのデータが永続的ボリュームクレームに存在している場合に完了します。

kubectl wait --for=condition=Migrating=False mdb/<resourceName>

アプリケーション接続文字列を更新し、仮想マシンを廃止します。Kubernetes 演算子 は、バーチャル マシンを自動的に廃止しません。

Kubernetes 演算子は、認証情報を含まない接続文字列 Secret を <metadata.name>-cluster-connection-string という名前で自動的に生成し、アクティブ ノードと同期させます。接続文字列をハードコードするのではなく、アプリケーションをこの Secret に向けてください。

移行中はずっと読み取りが利用可能です。選挙中に書き込み (write)が一時的に失敗する可能性があります。そのため、ドライバーは再試行可能な書き込みを使用する必要があります。読み取り対象が移動すると、読み取りレイテンシが増加する可能性があります。そのため、Kubernetes クラスターをバーチャル マシンと同じリージョン内で実行します。移行されたセカンダリに対する長時間カーソルは、クイエッス モードがないため、切断されます。