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 disponibilidad general

Esta guía describe los cambios que debe realizar para volver a crear una implementación de MongoDBSearch existente 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 sigue ejecutándose mientras migra. El operador de Kubernetes reconstruye la implementación de búsqueda desde cero. Hasta que la nueva implementación esté lista y termine de reindexar los datos, las query de MongoDB Search y Vector Search (las etapas de agregación $search y $vectorSearch) no estarán disponibles. Utilice esta guía para volver a crear una configuración equivalente de su implementación de Public Preview en el operador de Kubernetes de GA, no para actualizar una implementación en ejecución sin interrupción.

En esta guía, "Public Preview" significa cualquier lanzamiento de MongoDBSearch antes de GA. El recurso personalizado de MongoDBSearch solo ha tenido una versión de API, v1, por lo que ni Kubernetes ni el operador de Kubernetes convierten los valores de campo antiguos automáticamente. Debe aplicar cada cambio de esta guía manualmente, una vez, a su manifiesto existente.

Esta guía no cubre las nuevas capacidades de GA ni los campos opcionales. Si una sección no se aplica a su manifiesto existente, omítala.

GA aplica una versión mínima admitida de mongot, 1.70.1. Si su recurso MongoDBSearch fija un spec.version explícito anterior a 1.70.1, la conciliación falla después de la actualización con un error de versión no compatible. Si no establece spec.version, el operador de Kubernetes proporciona su propio valor por defecto (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, ha anclado:

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 de manifiesto en la siguiente sección.

Un recurso personalizado de MongoDBSearch de vista previa pública nunca tuvo un campo spec.clusters. En GA, se requiere spec.clusters, y varios campos que solían estar en el nivel superior de spec ahora solo están dentro de spec.clusters[0]. Cada manifiesto existente necesita la misma edición mecánica, una vez, independientemente de la topología.

Los ejemplos de esta sección utilizan un recurso de MongoDBSearch llamado my-search en el namespace mongodb. Sustituye el nombre y el namespace de tu 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 Public Preview, 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 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"

se convierte en la siguiente configuración en 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"

Importante

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

2

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

Si ya configuró spec.prometheus, muévalo tal cual:

Ejemplo

Vista previa pública:

spec:
prometheus:
port: 9946

GA:

spec:
observability:
prometheus:
port: 9946

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

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 rompe el TLS existente sin una reserva automática. Si su recurso MongoDBSearch configura una CA de TLS en spec.source.external.tls.ca y omite este paso, el TLS externo se rompe en el momento en que el operador de Kubernetes GA comienza a conciliar: solo lee un ConfigMap y no tiene una reserva para un Secret. Si su recurso no utiliza spec.source.external.tls.ca en absoluto, este paso no se aplica a usted.

La ruta de 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 en ese nombre: un Secret en vista previa pública, un ConfigMap en GA. Ambos esperan el certificado de CA en 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 hacer referencia 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 MongoDBSearch de referencia no se modifica. 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 puede, o al mismo tiempo:

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

Puede reutilizar el nombre de su antiguo Secret, como se muestra en el ejemplo anterior, o elegir uno nuevo. El operador de Kubernetes ya no lee el antiguo Secret. Puede borrarlo una vez que confirme que el TLS externo vuelve a funcionar.

Esta sección cubre lo que sucede con los objetos de Kubernetes subyacentes que gestiona el operador de Kubernetes y lo que se debe verificar y limpiar después. Lo que cambia depende de si el recurso de MongoDB Search se sincroniza desde un set de réplicas o un clúster particionado.

La mayoría de los recursos gestionados por el operador mantienen el mismo nombre en GA. El operador de Kubernetes actualiza estos recursos en su lugar en la siguiente conciliación y no es necesario que realices ninguna acción:

Si su recurso MongoDBSearch se sincroniza desde una fuente de set de réplicas (no particionada), el operador de Kubernetes de GA recrea tres recursos con nuevos nombres la primera vez que concilia su recurso MongoDBSearch. El operador de Kubernetes no adopta, renombra ni borra 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 GA

mongot StatefulSet

my-search-search

my-search-search-0

mongot Servicio sin encabezado

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 reindexa desde cero, lo que puede llevar tiempo según el tamaño de tu conjunto de datos.

  • Los pods del antiguo StatefulSet siguen ejecutándose. El operador de Kubernetes no los escala. Hasta que elimine el antiguo StatefulSet, ejecutará el double de cómputo para sus pods mongot.

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

  • El cambio de nombre de DNS del servicio sin encabezado no requiere ninguna acción por su parte. Sin un balanceador de carga, el operador de Kubernetes reescribe la cadena de conexión de sincronizar origen en cada conciliación. Con un balanceador de carga gestionado o no gestionado, este servicio no forma parte de la ruta de conexión.

Importante

El operador de Kubernetes nunca borra los objetos antiguos por usted. Después de confirmar que el nuevo StatefulSet está en buen estado (consulte Verificación), borre los recursos antiguos para evitar pagar por el doble de cómputo indefinidamente. Esta limpieza es un paso obligatorio, no opcional.

1

Confirme primero que el nuevo StatefulSet está en buen estado (consulte Verificación) y, a continuación, 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

Al borrar el StatefulSet no se borran sus PVC, así que remuévalos 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 el recurso MongoDBSearch se sincroniza desde una fuente de clúster particionado, los nombres de los recursos por partición son idénticos en la vista previa pública y en la disponibilidad general. El operador de Kubernetes no los vuelve a crear con nombres nuevos. En su lugar, los actualiza en su lugar:

Resource
Nombre en versión preliminar pública y GA (sin cambios)

mongot StatefulSet por partición

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

Servicio sin cabeza mongot por partición

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

Per-shard mongot config ConfigMap

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

Servicio de proxy por partición

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

La única excepción se aplica si utilizas certificados TLS por partición. El operador de Kubernetes combina el certificado y la clave del secreto TLS que proporcionas en un secreto gestionado por el operador por partición y vuelve a crear ese secreto con un nuevo nombre:

Resource
Nombre de la vista previa pública
Nombre GA

Secreto combinado por operador de TLS por partición

<shard-name>-search-certificate-key

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

Los secretos TLS que proporcione conservan sus nombres. Solo se cambia el nombre de este secreto gestionado por el operador. El operador de Kubernetes no borra el secreto antiguo, que queda huérfano. Verifique que el nuevo secreto exista y que TLS funcione para esa partición, luego borre el antiguo manualmente.

Complete esta lista de comprobación después de actualizar el operador de Kubernetes y aplicar los cambios de manifiesto, y antes de borrar los recursos antiguos:

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

  • 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 ha terminado de reindexar en los nuevos pods antes de borrar nada del StatefulSet antiguo. Comprueba los registros o el estado del índice de mongot para confirmar su finalización, no solo la disponibilidad del pod.

  • Si confía en el scraping de Prometheus, confirme que su configuración de scraping o sus tableros reflejan el nuevo comportamiento habilitado por defecto: o bien las métricas aparecen ahora, o su 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 correcta.

  • Para las fuentes del set de réplicas, confirme que ha localizado y borrado los objetos <name>-search, <name>-search-svc y <name>-search-config antiguos y sus PVC huérfanos. Para las fuentes particionadas, confirme que ha borrado los secretos TLS antiguos por partición.

Si alguna parte de tu actualización no coincide con lo que describe esta guía, o encuentras un problema que esta guía no cubre, ponte en contacto con Soporte de MongoDB. Incluye tu manifiesto de MongoDBSearch con los secretos omitidos, la versión del operador de Kubernetes desde la que estás actualizando y hacia la que vas a actualizar, y el resultado de:

kubectl describe mongodbsearch <name> -n <namespace>