Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Migrar MongoDBSearch de la vista previa pública a la versión general

Esta guía describe los cambios que debe realizar para recrear una implementación existente de MongoDBSearch después de actualizar el operador de Kubernetes a la versión de disponibilidad general (GA) de MongoDBSearch.

Importante

Esta migración no es una actualización in situ, y la búsqueda no se mantiene en ejecución durante la migración. El operador de Kubernetes reconstruye la implementación de búsqueda desde cero. Hasta que la nueva implementación esté lista y finalice la reindexación de los datos, las consultas de MongoDB Search y Vector Search (las etapas de agregación $search y $vectorSearch) no estarán disponibles. Utilice esta guía para recrear una configuración equivalente de su implementación de vista previa pública en el operador de Kubernetes de disponibilidad general, no para actualizar una implementación en ejecución sin interrupciones.

En esta guía, "Vista previa pública" se refiere a cualquier versión de MongoDBSearch anterior a la disponibilidad general. El recurso personalizado MongoDBSearch solo ha tenido una versión de API, v1, por lo que ni Kubernetes ni el operador de Kubernetes convierten automáticamente los valores de campo antiguos. Debe aplicar manualmente cada cambio de esta guía, una sola vez, a su manifiesto existente.

Esta guía no cubre las nuevas funcionalidades de GA ni los campos opcionales. Si una sección no se aplica a su manifiesto actual, sáltela.

GA impone una versión mínima compatible mongot, 1.70.1. Si su recurso MongoDBSearch especifica una versión spec.version anterior a 1.70.1, la reconciliación fallará después de la actualización con un error de versión no compatible. Si no configura spec.version, el operador de Kubernetes proporciona su propia versión predeterminada (1.70.1 a partir de esta versión GA) y no necesita realizar ninguna acción.

Antes de actualizar, compruebe qué versión, si la hay, tiene fijada:

kubectl get mongodbsearch <name> -n <namespace> -o jsonpath='{.spec.version}'

Si el comando imprime una versión anterior a 1.70.1, actualice spec.version a 1.70.1 o posterior como parte de los cambios del manifiesto en la siguiente sección.

Un recurso personalizado de MongoDBSearch en vista previa pública nunca tuvo un campo spec.clusters. En la versión GA, spec.clusters es obligatorio, y varios campos que antes se encontraban en el nivel superior de spec ahora solo se encuentran dentro de spec.clusters[0]. Todos los manifiestos existentes requieren la misma edición mecánica, una sola vez, independientemente de la topología.

Los ejemplos de esta sección utilizan un recurso MongoDBSearch llamado my-search en el espacio de nombres mongodb. Sustituya el nombre y el espacio de nombres de su propio recurso.

1

Seis campos spec de nivel superior se mueven dentro de spec.clusters[0]:

Ruta de vista previa pública
Ruta GA

spec.replicas

spec.clusters[0].replicas

spec.persistence

spec.clusters[0].persistence

spec.resourceRequirements

spec.clusters[0].resourceRequirements

spec.statefulSet

spec.clusters[0].statefulSet

spec.loadBalancer

spec.clusters[0].loadBalancer

spec.jvmFlags

spec.clusters[0].jvmFlags

Cuando spec.clusters tiene exactamente una entrada, que es el caso de cada carga de trabajo de vista previa pública, no es necesario establecer spec.clusters[0].name o spec.clusters[0].index.

logLevel, security, source, version y autoEmbedding permanecen en el nivel superior de spec, sin cambios.

Ejemplo

La siguiente configuración de vista previa pública:

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"

En GA, la configuración se convierte en la siguiente:

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"

Importante

Si omite este paso, el servidor de la API de Kubernetes rechaza directamente su manifiesto de vista previa pública: spec.clusters es un campo obligatorio sin valor predeterminado, por lo que se trata de un fallo de admisión inmediato, no uno retardado o silencioso.

2

Este cambio es más que un simple cambio de nombre: en GA, el punto final de métricas de Prometheus está habilitado de forma predeterminada, mientras que en la vista previa pública estaba deshabilitado a menos que se estableciera explícitamente spec.prometheus.

Si ya has configurado spec.prometheus, muévelo tal cual:

Ejemplo

Vista previa pública:

spec:
prometheus:
port: 9946

GEORGIA:

spec:
observability:
prometheus:
port: 9946

Si nunca configura spec.prometheus, no tiene nada que mover, pero aparece un objetivo de recopilación de datos de Prometheus en el puerto 9946 después de la actualización, donde antes no existía ninguno.

Importante

Para mantener las métricas deshabilitadas después de la actualización, agregue lo siguiente explícitamente:

spec:
observability:
prometheus:
mode: disabled
3

Advertencia

Este cambio invalida el TLS existente sin una alternativa automática. Si su recurso MongoDBSearch configura una CA TLS en spec.source.external.tls.ca y omite este paso, el TLS externo fallará en el momento en que el operador de Kubernetes de disponibilidad general comience a conciliar: solo leerá un ConfigMap y no tendrá una alternativa a un Secret. Si su recurso no utiliza spec.source.external.tls.ca en absoluto, este paso no le concierne.

La ruta del campo, spec.source.external.tls.ca.name, no cambia. Lo que cambia es el tipo de objeto de Kubernetes que el operador de Kubernetes espera con ese nombre: un Secret en la vista previa pública y un ConfigMap en la disponibilidad general. Ambos esperan el certificado de CA con la misma clave, ca.crt.

Ejemplo

En la vista previa pública, spec.source.external.tls.ca.name se refiere a un Secret:

apiVersion: v1
kind: Secret
metadata:
name: my-search-external-ca
namespace: mongodb
type: Opaque
stringData:
ca.crt: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

En GA, el mismo nombre debe referirse a un ConfigMap con la misma clave ca.crt:

apiVersion: v1
kind: ConfigMap
metadata:
name: my-search-external-ca
namespace: mongodb
data:
ca.crt: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

El recurso de referencia MongoDBSearch no ha cambiado. spec.source.external.tls.ca.name sigue apuntando al mismo nombre:

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

Cree el ConfigMap antes de actualizar el operador de Kubernetes si es posible, o al mismo tiempo:

kubectl create configmap my-search-external-ca \
--from-file=ca.crt=./ca.crt \
--namespace mongodb

Puedes reutilizar el nombre de tu antiguo Secret, como se muestra en el ejemplo anterior, o elegir uno nuevo. El operador de Kubernetes ya no lee el antiguo Secret. Puedes eliminarlo una vez que confirmes que TLS externo funciona correctamente.

Esta sección describe qué sucede con los objetos de Kubernetes subyacentes que administra el operador de Kubernetes, y qué se debe verificar y limpiar posteriormente. Los cambios dependen de si el recurso MongoDBSearch se sincroniza desde un conjunto de réplicas o un clúster fragmentado.

La mayoría de los recursos administrados por el operador conservan el mismo nombre en la disponibilidad general. El operador de Kubernetes actualiza estos recursos directamente en la siguiente reconciliación, y no es necesario realizar ninguna acción.

Si su recurso MongoDBSearch se sincroniza desde una fuente de conjunto de réplicas (no fragmentada), el operador de Kubernetes de disponibilidad general recrea tres recursos con nombres nuevos la primera vez que concilia su recurso MongoDBSearch. El operador de Kubernetes no adopta, renombra ni elimina los objetos antiguos. Este comportamiento es intencional.

La siguiente tabla utiliza el recurso de ejemplo my-search de la sección anterior:

Resource
Nombre de la vista previa pública
Nombre de GA

mongot Conjunto con estado

my-search-search

my-search-search-0

mongot Servicio sin cabeza

my-search-search-svc

my-search-search-0-svc

mongot config ConfigMap

my-search-search-config

my-search-search-0-config

Este cambio tiene los siguientes efectos prácticos:

  • El nuevo StatefulSet comienza vacío. Sus pods obtienen nuevos PersistentVolumeClaims, por lo que mongot se reindexa desde cero, lo que puede llevar tiempo dependiendo del tamaño de su conjunto de datos.

  • Los pods del antiguo StatefulSet siguen en ejecución. El operador de Kubernetes no los reduce. Hasta que elimines el antiguo StatefulSet, estarás duplicando la capacidad de cómputo para tus pods mongot.

  • Los PVC del antiguo StatefulSet y el antiguo ConfigMap quedan huérfanos. Ya nadie los lee, pero tampoco nadie los elimina.

  • El cambio de nombre DNS del servicio sin interfaz gráfica no requiere ninguna acción por su parte. Sin un balanceador de carga, el operador de Kubernetes reescribe la cadena de conexión de la fuente de sincronización en cada reconciliación. Con un balanceador de carga administrado o no administrado, este servicio no forma parte de la ruta de conexión.

Importante

El operador de Kubernetes nunca elimina los objetos antiguos automáticamente. Después de confirmar que el nuevo StatefulSet funciona correctamente (consulte la sección Verificación), elimine los recursos antiguos para evitar pagar indefinidamente por un doble consumo de recursos. Esta limpieza es un paso obligatorio, no opcional.

1

Confirme primero que el nuevo StatefulSet está en buen estado (consulte Verificación), luego ejecute:

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
2

Eliminar el StatefulSet no elimina sus PVC, así que elimínelos por separado:

# 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

Los PVC antiguos coinciden con data-my-search-search-<ordinal>, por ejemplo data-my-search-search-0. No elimine nada que coincida con data-my-search-search-0-<ordinal>, por ejemplo data-my-search-search-0-0. Esos pertenecen al nuevo StatefulSet.

Si su recurso MongoDBSearch se sincroniza desde una fuente de clúster fragmentado, los nombres de los recursos por fragmento son idénticos en la vista previa pública y en la disponibilidad general. El operador de Kubernetes no los recrea con nombres nuevos. En su lugar, los actualiza directamente:

Resource
Nombre en vista previa pública y disponibilidad general (sin cambios)

Conjunto con estado por fragmento mongot

my-search-search-0-<shard-name>

Servicio sin interfaz por fragmento mongot

my-search-search-0-<shard-name>-svc

Per-shard mongot config ConfigMap

my-search-search-0-<shard-name>-config

Servicio de proxy por fragmento

my-search-search-0-<shard-name>-proxy-svc

La única excepción se aplica si utiliza certificados TLS por fragmento. El operador de Kubernetes combina el certificado y la clave del secreto TLS que usted proporciona en un secreto administrado por el operador por cada fragmento, y recrea ese secreto con un nuevo nombre:

Resource
Nombre de la vista previa pública
Nombre de GA

Secreto combinado del operador TLS por fragmento

<shard-name>-search-certificate-key

my-search-search-0-<shard-name>-certificate-key

Los secretos TLS que proporcione conservarán sus nombres. Solo se renombrará este secreto administrado por el operador. El operador de Kubernetes no elimina el secreto anterior, que queda huérfano. Verifique que el nuevo secreto exista y que TLS funcione para ese fragmento; luego, elimine el anterior manualmente.

Complete esta lista de verificación después de actualizar el operador de Kubernetes y aplicar los cambios del manifiesto, y antes de eliminar cualquier recurso antiguo:

  • Confirme que kubectl get mongodbsearch <name> -n <namespace> -o yaml muestra spec.clusters completado, y que no quedan campos de nivel superior replicas, persistence, resourceRequirements, statefulSet, loadBalancer, jvmFlags u prometheus.

  • Confirme que el nuevo mongot StatefulSet, <name>-search-0 para una implementación de clúster único, tiene todos los pods Running y Ready.

  • Confirma que mongot haya finalizado la reindexación en los nuevos pods antes de eliminar cualquier elemento del StatefulSet anterior. Comprueba los registros o el estado del índice de mongot para verificar la finalización, no solo la disponibilidad del pod.

  • Si utilizas el web scraping de Prometheus, confirma que tu configuración de scraping o tus paneles reflejen el nuevo comportamiento habilitado por defecto: o bien las métricas aparecen ahora, o bien tu configuración explícita mode: disabled las mantiene deshabilitadas.

  • Si utiliza spec.source.external con TLS, confirme que la CA ConfigMap a la que hace referencia spec.source.external.tls.ca.name existe y contiene una clave ca.crt válida, y que la conexión de mongot con la implementación externa de MongoDB es saludable.

  • Para fuentes de conjuntos de réplicas, confirme que ha localizado y eliminado los objetos <name>-search, <name>-search-svc y <name>-search-config antiguos y sus PVC huérfanos. Para fuentes fragmentadas, confirme que ha eliminado los secretos TLS antiguos por fragmento.

Si alguna parte de su actualización no coincide con lo que describe esta guía, o si encuentra un problema que esta guía no cubre, comuníquese con el soporte de MongoDB. Incluya su manifiesto de MongoDBSearch con los secretos ocultos, la versión del operador de Kubernetes desde la que está actualizando y a la que está actualizando, y la salida de:

kubectl describe mongodbsearch <name> -n <namespace>