この手順では、Ops Manager またはCloud Manager が管理するすべてのレプリカセットを、通常のMongoDBレプリケーションを使用して、 Kubernetes Operator の下のKubernetesに移行します。これには、仮想マシンまたは必要最低限のマシンで実行される配置と、別のKubernetes Operatorインスタンスによってすでに管理されている配置が含まれます。移行はライブで増分されます。レプリカセット をKubernetesに拡張し、 Kubernetesノードを昇格させてから、外部ノードをプルーニングします。スナップショット復元は行われず、mongosync は関係ありません。
始める前に
レプリカセットを移行する前に、次の確認を確認してください。
A Ops Manager or Cloud Manager connection
ConfigMapwith the keysbaseUrl,orgId, andprojectName.An API key
Secretwith the keyspublicKeyandprivateKey.The Kubernetes Operator
ServiceAccounthasbatch/jobspermissions (create,get,list,watch, anddelete) for the dry-run connectivity Job.プロジェクトには 1 つの配置が含まれています。
また、次のコマンドも必要です。
Ops Manager またはCloud Manager が管理する既存のレプリカセット。
Ops Manager またはCloud Managerプロジェクト内の 1 つの配置。
Kubernetes Operator がインストールされたKubernetesクラスター。
Kubernetes Operator に一致するバージョンの
kubectl mongodbプラグイン。 Kubernetes Operator は、ドライバーの実行を含むすべての調整でこの一致を強制します。仮想マシン ホストとKubernetesポッド間の双方向ネットワーク接続とホスト名解決。
配置で TLS が使用される場合、すべての SAN をカバーする事前構成された TLS 証明書。
SCRAM ユーザー パスワード コレクション。オートメーション構成からこれらを回復することはできません。
を開始する前に取得されたバックアップ。
正常で目的の状態にある配置。
常に少なくとも 3 の投票ノードを保持します。 Kubernetes Operator は 7 を超える投票メンバーを拒否します。 7 を超える場合は、投票権のないKubernetesノードを追加するか、投票権のある外部ノードを削除します。
一度に 1 種類の変更のみを行います。Kubernetes ノードを追加する、外部ノードをプルーニングする、または一度に 1 つのノードのみの投票と優先順位を変更します。認証検証は、移行が開始されると混合変更を拒否し、 Kubernetesノードの削除や移行中の外部ノードの追加も拒否します。
配置が目的の状態にある場合にのみ実行します。
最後にプライマリを移行します。投票と優先順位をノードに付与すると選挙 がトリガーされ、レプリカセットが新しいプライマリを選択している間に書込み (write) が一時的に失敗することがあります。プライマリを最後に移行すると、最後のステップまで、その選挙とそれによって発生する 書込み (write) ダウンタイムがトリガーされないようにできます。
注意
また、 Kubernetesでノードの優先順位を上げることで、再選挙をトリガーすることもできます。
While
spec.externalMembersis non-empty, Kubernetes Operator forces one-member-at-a-time scaling. This is why each change needs its own wait for goal state.
手順
MongoDBカスタムリソースを生成します。
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.members0に設定します。プラグインが常に追加する
mongodb.com/migration-dry-run: trueアノテーション。
コマンドは、次の任意フラグもサポートしています。
--certs-secret-prefix: TLS が有効な場合に必要です。spec.security.certsSecretPrefixを設定します。--prometheus-secret-name: Prometheus が有効な場合に使用します。Secretはすでに存在し、passwordキーを持っている必要があります。--resource-name-override: 生成されたリソースにmetadata.nameを設定します。プラグインは、有効なKubernetes名でない場合にレプリカセット名を自動的に正規化し、spec.replicaSetNameOverrideを設定します。
MongoDBUser カスタム リソースを生成します。
データベースユーザーを移行する場合にのみ、この手順を完了します。移行ではその必要はありません。
SCRAM ユーザーごとに 1 つの Secret を事前に作成し、それぞれに 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ファイルは、username:database,secret-name 形式でユーザーを 1 行ごとのシークレットにマッピングします。代わりにユーザーごとにプロンプトが表示されるようにするには、--users-secrets-fileを省略します。
プラグインは、$externalデータベースに対して X.509 ユーザーと LDAP ユーザーを生成します。オートメーションエージェントユーザーをスキップします。
配置で TLS を使用する場合は、 Kubernetesノード証明書を発行します。
仮想マシン証明書に署名したのと同じ認証局からKubernetesノード証明書を発行します。
Kubernetes Operator では、<certsSecretPrefix>-<resourceName>-cert という名前の kubernetes.io/tls Secret と、ca-pem キーと mms-ca.crt キーの両方を含む <resourceName>-ca という名前の CA ConfigMap が必要です。証明書には、Ped ごとおよびサービス DNS ごとの名前と、サーバー認証とクライアント認証の使用量の両方をカバーする SAN が必要です。
元の配置で TLSnet.tls.mode disabledが使用されていない場合は、移行する前に、既存の仮想マシン配置で Ops Manager またはCloud Managerで を に設定します。この場合は、 MongoDBカスタムリソースで何も設定する必要はありません。
注意
CA の不一致は、設計上、次のステップのプライベート実行によってキャッチされます。
外部アクセスを構成します。
ドライバーを実行する前に、仮想マシンspec.externalAccess メンバーがKubernetesポッドにアクセスできるように を構成します。これらのメンバーがホスト名でポッドを解決できるようにするには、 を設定することもできます。関連するフィールドとspec.externalAccess.externalDomain DNS 要件の詳細については、「 移行のためのネットワーク要件 」を参照してください。
この設定はユーザー所有のものです。環境の LoadBalances または NodePort と DNS レコードを構成します。
重要
externalDomainこの配置でMongoDB Search またはベクトル検索を使用する場合は、 を設定しないでください。MongoDBSearch MongoDBは、externalDomain を設定する リソースをサポートしていません。また、クラスターを作成した後、フィールドを削除することはできません。詳細については、 「 MongoDB Search と移行の相互作用 」を参照してください。
ドライバーは を実行し、接続を確認します。
mongodb.com/migration-dry-run アノテーションがまだ存在する状態で、生成されたリソースを適用します。注釈が設定されている間は、 Kubernetes Operator はオートメーション構成の変更を行わず、接続のみを検証します。
Kubernetes Operator<resourceName>-connectivity-check は、すべての外部ノードを呼び出して認証する という名前のジョブを作成します。ジョブはttlSecondsAfterFinished を使用して自分自身を削除し、次の調整によってジョブが再作成されるため、再検証は自動的に行われます。 Kubernetesまたは Ops Manager UIで問題を修正し、自由に再実行できます。
ドライバーは、Kubernetes から仮想マシンへの到達性(DNS、TLS、ファイアウォール、ノード アドレス)と認証情報(localデータベースの __system ロール、および TLS が有効になっている場合は CA を含む)をチェックします。仮想マシンと Kubernetes のインバウンド接続はチェックしません。
その方向はネットワーク設定によって完全に異なるため、単一コマンドではそれを保証できません。代わりに、以下のチェックリストを正常に処理します。
Kubernetesノードが使用するホスト名がパターン
<metadata.name>-0.<spec.externalAccess.externalDomain>に従って、仮想マシンのノードから解決可能であることを確認します。Kubernetesノードまたは LoadBalancer IP に仮想マシンからアクセスできることを確認します。
status.conditions[type=NetworkConnectivityVerified] からの結果を読み取る:
バリデータージョブ終了コード | 状態 | 理由 | 意味 |
|---|---|---|---|
ジョブはまだ実行中 |
|
| The |
|
|
| すべての外部ノードはアクセス可能であり、認証されます。 |
|
|
| Credentials, the authentication mechanism, or a missing |
|
|
| DNS、TLS、タイムアウト、または到達不能なノード。ジョブ ポッド ログを確認します。 |
|
|
| クラス化されていない障害。ジョブ ポッド ログを確認します。 |
Failures that occur before the Job starts use the reasons OperatorImageUnknown, BuildStatefulSetOptions, AgentCertSecretFailed, and AgentCertSubject.
Kubernetes Operator removes the NetworkConnectivityVerified condition from status.conditions entirely once no external members remain.
レプリカセットをKubernetesに拡張します。
ドライバーによる注釈を削除します。
kubectl annotate mdb <resourceName> \ mongodb.com/migration-dry-run-
これは、 Kubernetes Operator が Ops Managerプロジェクトの所有権を取得する点です。
spec.members と spec.memberConfig を一緒に発生させます。
警告
ノード数を増やす前にspec.memberConfigを設定する
By default, new Kubernetes members join as voting members. The CRD defaults are votes: 1 and priority: "1", which let a still-syncing member participate in an election before it has finished its initial sync.
MongoDB recommends that you write one spec.memberConfig entry per new Kubernetes member with votes: 0 and priority: "0" before you raise the member count, so that a still-syncing member cannot win an election. votes is an integer. priority is a string.
例、3 つのKubernetesノードを非投票として追加するには、次のようにします。
spec: memberConfig: - votes: 0 priority: "0" - votes: 0 priority: "0" - votes: 0 priority: "0"
完全な最初の同期とターゲットの状態を待ちます。上記の任意の手順で MongoDBUser リソースを生成した場合は、ここで適用し、各 が Updated の status.phase に達していることを確認します。
外部ノードをプルーニングします。
重要
spec.externalMembers から一度に 1 つのエントリのみを削除します。次のエントリを削除する前に、各削除後に最終状態を待ってください。
以下に例を挙げます。
kubectl patch mdb <resourceName> --type=json \ -p='[{"op":"remove","path":"/spec/externalMembers/0"}]'
エントリを削除することはできますが、移行が開始されると追加することはありません。
status.conditions[type=Migrating].reason が Extending、InProgress、Pruning を介して移動するのを監視します。
理由 | ステータス | 意味 |
|---|---|---|
|
| ドライバーによる注釈が設定されています。 |
|
| 目的のKubernetesノード数が最後に調整された数を超えています。 |
|
| The |
|
| 外部メンバーは存在しますが、変更はありません。これは、最初の調整の理由でもあります。 |
|
| すべての外部メンバーが削除されました。 |
Precedence is Validating > Extending > Pruning > InProgress. A prune that also grows the Kubernetes side reports Extending, which is another reason to make one change at a time.
同時にプルーニングと拡張は許可されていません。
To script against migration completion, use kubectl wait --for=condition=Migrating=False rather than polling status.phase.
接続文字列のシークレット
Kubernetes Operator は、<metadata.name>-cluster-connection-string という名前の認証情報を含まない接続文字列Secret を自動的に生成し、アクティブなノードと同期します。接続文字列 をハードコーディングする代わりに、アプリケーションをこの Secret に向けます。
移行中の可用性
移行を通じて読み取りは引き続き利用できます。選挙中に書き込みが一時的に失敗する可能性があるため、ドライバーは再試行可能な書き込みを使用する必要があります。読み取りターゲットが移動すると読み取りレイテンシが増加する可能性があるため、仮想マシンと同じリージョンでKubernetesクラスターを実行します。休止モードがないため、移行されたセカンダリ ブレークに対して長時間実行されているカーソル。