このガイドでは、Kubernetes 演算子 を MongoDBSearch の一般提供(GA)リリースにアップグレードした後に既存の MongoDBSearch 配置を再作成するために行う必要な変更について説明します。
重要
この移行はインプレースアップグレードではなく、移行中は検索は実行されません。Kubernetes 演算子は、検索配置をゼロから再構築します。新しい配置の準備が整い、データの再インデックス化が完了するまで、MongoDB Search およびベクトル検索クエリ($search および $vectorSearch 集計ステージ)は使用できません。このガイドを使用して、GA Kubernetes 演算子でパブリック プレビュー配置の同等の構成を再作成します。実行中の配置を中断せずにアップグレードすることはできません。
このガイドでは、"パブリック プレビュー" は GA 前の MongoDBSearch のリリースを意味します。MongoDBSearch カスタム リソースには、常に 1 つの API バージョン v1 があるため、Kubernetes と Kubernetes 演算子のどちらも古いフィールド値を自動的に変換しません。このガイドのすべての変更を、手動で 1 度、既存のマニフェストに適用する必要があります。
このガイドでは、新しい GA 機能や任意フィールドは説明していません。セクションが既存のマニフェストに適用されない場合は、スキップしてください。
始める前に
GAは、サポートされる最小のmongotバージョンである1.70.1を強制します。MongoDBSearchリソースで1.70.1よりも前のspec.versionが明示的にピン留めされている場合、アップグレード後にreconciliationが失敗し、サポートされていないバージョンであることを示すエラーが発生します。spec.version を設定しない場合、Kubernetes Operator が独自のデフォルト(この GA リリース時点では 1.70.1)を適用するため、アクションを実行する必要はありません。
アップグレードする前に、ピン留めているバージョンがある場合は、そのバージョンを確認してください。
kubectl get mongodbsearch <name> -n <namespace> -o jsonpath='{.spec.version}'
コマンドで 1.70.1 以前のバージョンが表示される場合は、次のセクションのマニフェストの変更の一部として spec.version を 1.70.1 以降に更新します。
MongoDB 検索構成の更新
Public Preview MongoDBSearch カスタムリソースには spec.clusters フィールドがありませんでした。GA では spec.clusters が必要となり、spec のトップレベルにあったいくつかのフィールドは spec.clusters[0] 内にのみ存在するようになりました。すべての既存のマニフェストには、トポロジーに関わらず、同じ機械的な編集が 1 度だけ必要です。
このセクションの例では、mongodb 名前空間の my-search という名前の MongoDBSearch リソースを使用します。リソースの名前と名前空間を置き換えます。
必要な spec.clusters フィールドを追加し、クラスターごとの設定をその中に移動します。
6 つのトップレベル spec フィールドが spec.clusters[0] 内に移動します。
パブリック プレビュー パス | GA パス |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
spec.clusters にエントリが 1 つだけある場合、これはすべてのパブリックプレビューワークロードに該当しますが、spec.clusters[0].name または spec.clusters[0].index を設定する必要はありません。
logLevel, security、source、version、autoEmbeddingは変更されず、specのトップ レベルに留まります。
例
次のパブリック プレビュー構成:
apiVersion: mongodb.com/v1 kind: MongoDBSearch metadata: name: my-search namespace: mongodb spec: source: mongodbResourceRef: name: my-replica-set replicas: 3 persistence: single: storage: 20Gi resourceRequirements: requests: cpu: "1" memory: 2Gi limits: cpu: "2" memory: 4Gi statefulSet: spec: template: spec: nodeSelector: disktype: ssd loadBalancer: managed: replicas: 2 jvmFlags: - "-Xmx2g"
GA では次の構成になります。
apiVersion: mongodb.com/v1 kind: MongoDBSearch metadata: name: my-search namespace: mongodb spec: source: mongodbResourceRef: name: my-replica-set clusters: - replicas: 3 persistence: single: storage: 20Gi resourceRequirements: requests: cpu: "1" memory: 2Gi limits: cpu: "2" memory: 4Gi statefulSet: spec: template: spec: nodeSelector: disktype: ssd loadBalancer: managed: replicas: 2 jvmFlags: - "-Xmx2g"
重要
この手順をスキップすると、Kubernetes API サーバーはパブリック プレビュー マニフェストを完全に拒否します。spec.clusters はデフォルトのない必須フィールドであるため、延遅されたりサイレントなりではなく、直ちに受け入れに失敗します。
spec.prometheus を spec.observability.prometheus に移動します。
この変更は名前の変更にとどまりません。GA では Prometheus メトリクスエンドポイントがデフォルトで有効になりますが、パブリックプレビューでは明示的に spec.prometheus を設定しない限り無効になっていました。
spec.prometheus を既に設定している場合は、そのまま移動します。
例
パブリック プレビュー:
spec: prometheus: port: 9946
GA:
spec: observability: prometheus: port: 9946
spec.prometheus を設定しない場合、移動するものはありませんが、アップグレード後にポート 9946 で Prometheus スクレイプ ターゲットが表示されます。
重要
アップグレード後もメトリクスを無効にするには、次の項目を明示的に追加します。
spec: observability: prometheus: mode: disabled
外部 MongoDB TLS CA 参照を Secret から ConfigMap に更新します。
警告
この変更により、既存の TLS が切断され、自動フォールバックは行われません。MongoDBSearch リソースで spec.source.external.tls.ca で TLS CA が構成されていて、この手順をスキップすると、GA Kubernetes Operator が調整を開始した瞬間に外部 TLS が切断されます。このオペレーターは ConfigMap のみを読み取り、Secret へのフォールバックはありません。リソースで spec.source.external.tls.ca をまったく使用しない場合、この手順は適用されません。
フィールドパス spec.source.external.tls.ca.name は変更されません。変更されるのは、Kubernetes Operator がその名前で期待する Kubernetes オブジェクトの種類です。パブリックプレビューでは Secret、GA では ConfigMap です。どちらも同じキー ca.crt で CA 証明書を期待します。
例
パブリック プレビューでは、spec.source.external.tls.ca.name は Secret を指します。
apiVersion: v1 kind: Secret metadata: name: my-search-external-ca namespace: mongodb type: Opaque stringData: ca.crt: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
GA では、同じ名前は同じ ca.crt キーを持つ ConfigMap を参照する必要があります。
apiVersion: v1 kind: ConfigMap metadata: name: my-search-external-ca namespace: mongodb data: ca.crt: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
参照されている MongoDBSearch リソースは変更されません。spec.source.external.tls.ca.name は依然として同じ名前を指しています。
apiVersion: mongodb.com/v1 kind: MongoDBSearch metadata: name: my-search namespace: mongodb spec: source: external: hostAndPorts: - mongodb-0.example.com:27017 tls: ca: name: my-search-external-ca
可能な場合は Kubernetes Operator をアップグレードする前または同時に ConfigMap を作成します。
kubectl create configmap my-search-external-ca \ --from-file=ca.crt=./ca.crt \ --namespace mongodb
前述の例に示すように、古いSecretの名前を再利用することも、新しい名前を選択することもできます。Kubernetes Operator は、古い Secret を読み取らなくなりました。外部TLSが再度機能することを確認してから、削除してください。
Kubernetes リソースに何が起こるか
このセクションでは、Kubernetes Operator がマネージする基礎となる Kubernetes オブジェクトに何が起こるか、およびその後に確認することとクリーンアップすることを説明します。変更される内容は、MongoDBSearch リソースがレプリカセットから同期されるか、シャーディングされたクラスターかによって異なります。
名前が保持されるリソース
ほとんどの演算子マネージドリソースは、GA で同じ名前を維持します。Kubernetes Operator は、次の調整でこれらのリソースをインプレースで更新します。アクションを実行する必要はありません。
プロキシ サービス(
<name>-search-0-proxy-svc)Envoy ロード バランサー配置、ConfigMap、および証明書(
<name>-search-lb-0...)演算子で管理されるシャードごとの TLS Secret を除き、TLS、X.509、パスワード Secret については、シャーディングされたクラスターのソース: 名前は変わりませんが、1 つだけ例外がありますを参照してください。
レプリカセットのソース: 新しい名前で再作成されたリソース
MongoDBSearchリソースがレプリカセット(シャーディングされていない)ソースから同期する場合、GA Kubernetes Operatorは初めてMongoDBSearchリソースを調整すると、新しい名前で3つのリソースを再作成します。Kubernetes 演算子は古いオブジェクトを採用、名前変更、または削除しません。この動作は設計によるものです。
次の表では、前のセクションの my-search リソース例を使用しています。
Resource | パブリック プレビュー名 | GA 名 |
|---|---|---|
|
|
|
|
|
|
|
|
|
この変更には、次のような実用的な効果があります。
新しい StatefulSet は空の状態で起動します。ポッドに新しい
PersistentVolumeClaimsが設定されるため、mongotはゼロから再インデックスされます。これには、データセットのサイズに応じて時間がかかる場合があります。古い StatefulSet の Pod は引き続き実行されます。Kubernetes 演算子は、それらを増やしません。古い StatefulSet を削除するまで、
mongotPod のコンピュートが double 実行されます。古い StatefulSet の PVC と古い ConfigMap はオーファン化されます。もはや読み取られることはありませんが、削除されることもありません。
ヘッドレスサービスの DNS 名の変更については、アクションは必要ありません。ロード バランサーがない場合、Kubernetes 演算子は各調整で同期ソース接続文字列を書き換えます。マネージドロード バランサーまたはマネージドでないロード バランサーを使用する場合、このサービスは接続パスの一部ではありません。
重要
Kubernetes Operator は古いオブジェクトを自動的に削除することはありません。新しい StatefulSet が正常に動作していることを確認した後(検証を参照)、古いリソースを削除するて、無期限に倍増したコンピュートの料金を支払うことを避けます。このクリーンアップは必須の手順であり、任意の手順ではありません。
古い StatefulSet、Service、ConfigMap を削除します。
最初に新しい StatefulSet が正常であることを確認し (「検証」を参照)、次に次のコマンドを実行します。
kubectl delete statefulset my-search-search -n mongodb kubectl delete service my-search-search-svc -n mongodb kubectl delete configmap my-search-search-config -n mongodb
孤立した PersistentVolumeClaims を削除します。
StatefulSet を削除しても PVC は削除されないため、別々に削除します。
Preview the PVCs to delete: PVCS=$(kubectl get pvc -n mongodb -o name \ | grep -E 'data-my-search-search-[0-9]+$') echo "$PVCS" After confirming, delete exactly what you previewed: echo "$PVCS" | xargs kubectl delete -n mongodb
古い PVC は data-my-search-search-<ordinal> に一致します(例: data-my-search-search-0)。data-my-search-search-0-<ordinal> に一致するものは削除しないでください(例: data-my-search-search-0-0)。これらは新しい StatefulSet に属します。
シャーディングされたクラスターのソース: 名前は変更されていませんが、1 つだけ例外があります
MongoDBSearch リソースがシャーディングされたクラスターソースから同期する場合、パブリックプレビューと GA ではシャードごとのリソース名は同じです。Kubernetes Operator は新しい名前で再作成しません。その代わり、インプレースで更新します。
Resource | パブリック プレビューと GA の名前(変更なし) |
|---|---|
シャードごとの |
|
シャードごとの |
|
Per-shard |
|
シャードごとのプロキシ サービス |
|
シャードごとの TLS 証明書を使用する場合は、1 つの例外が適用されます。Kubernetes Operator は、提供された TLS Secret から証明書とキーをシャードごとの演算子マネージド Secret に統合し、その Secret を新しい名前で再作成します。
Resource | パブリック プレビュー名 | GA 名 |
|---|---|---|
シャードごとの TLS 演算子と統合されたシークレット |
|
|
提供する TLS シークレットの名前は変更されません。この演算子マネージド シークレットのみ名前が変更されます。Kubernetes Operator は古いシークレットを削除しません。古いシークレットはオーファンになります。新しいシークレットが存在し、そのシャードで TLS が機能することを確認してから、古いシークレットを手動で削除する。
検証
Kubernetes 演算子をアップグレードし、マニフェストの変更を適用した後、古いリソースを削除する前に、このチェックリストを完了してください。
kubectl get mongodbsearch <name> -n <namespace> -o yamlにspec.clustersが入力されており、残っているトップレベルのreplicas、persistence、resourceRequirements、statefulSet、loadBalancer、jvmFlags、prometheusフィールドがないことを確認します。単一クラスター配置の新しい
mongotStatefulSetである<name>-search-0のすべてのポッドがRunningとReadyであることを確認します。古いStatefulSetから何かを削除する前に、
mongotが新しいポッド上で再インデックス作成を完了したことを確認してください。mongotのPodの準備状況だけでなく、ログやインデックスの状態を確認して完了しているかを確認してください。Prometheus スクレイピングを使用する場合は、スクレイプ構成またはダッシュボードに新しいデフォルトで有効になった動作が反映されていることを確認します。つまり、メトリクスが表示されるか、明示的な
mode: disabled設定によってメトリクスが無効のままになります。spec.source.externalを TLS と一緒に使用する場合は、spec.source.external.tls.ca.nameで参照される CAConfigMapが存在し、有効なca.crtキーを含んでいること、およびmongotの外部 MongoDB 配置への接続が正常であることを確認します。レプリカセット ソースの場合は、古い
<name>-search、<name>-search-svc、<name>-search-configオブジェクトとそのオーファン PVC を特定して削除するしたことを確認します。シャーディングされたソースの場合は、古いシャードごとの TLS Secrets を削除したことを確認します。
サポートを受ける
アップグレードの一部がこのガイドの記述と一致しない場合、またはこのガイドでカバーされていない問題が発生した場合は、MongoDB サポートにお問い合わせください。シークレットが隠されたMongoDBSearchマニフェスト、アップグレード元のKubernetes Operatorバージョンとアップグレード先のKubernetes Operatorバージョン、および次の出力を含めてください。
kubectl describe mongodbsearch <name> -n <namespace>