Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

Migrar o MongoDBSearch do Public Preview para o GA

Este guia descreve as alterações que você deve fazer para recriar uma implantação existente do MongoDBSearch depois de atualizar o operador Kubernetes para a versão de Disponibilidade Geral (GA) do MongoDBSearch.

Importante

Esta migração não é uma atualização in-loco, e a pesquisa não continua em execução enquanto você migra. O operador Kubernetes reconstrói sua implantação de pesquisa do zero. Até que a nova implantação esteja pronta e termine de reindexar seus dados, as query de pesquisa do MongoDB Search e da pesquisa vetorial (os estágios de agregação $search e $vectorSearch) não estarão disponíveis. Use este guia para recriar uma configuração equivalente de sua implantação de visualização pública no operador Kubernetes GA, não para atualizar uma implantação em execução sem interrupção.

Neste guia, "Public Preview" significa qualquer versão do MongoDBSearch antes do GA. O recurso personalizado MongoDBSearch sempre teve apenas uma versão de API, v1, portanto, nem o Kubernetes nem o operador do Kubernetes convertem automaticamente valores de campo antigos. Você deve aplicar todas as alterações neste guia manualmente, uma vez, ao seu manifesto existente.

Este guia não abrange novas funcionalidades GA ou campos opcionais. Se uma seção não se aplicar ao seu manifesto existente, ignore-a.

O GA força uma versão mongot mínima suportada, 1.70.1. Se o seu recurso MongoDBSearch fixar um spec.version explícito anterior a 1.70.1, a reconciliação falhará após a atualização com um erro de versão não suportada. Se você não definir spec.version, o operador Kubernetes fornecerá seu próprio padrão (1.70.1 a partir desta versão GA) e você não precisará realizar nenhuma ação.

Antes de atualizar, verifique qual versão, se houver, você fixou:

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

Se o comando imprimir uma versão anterior a 1.70.1, atualize spec.version para 1.70.1 ou posterior como parte das alterações de manifesto na próxima seção.

Um recurso personalizado do MongoDBSearch de visualização pública nunca teve um campo spec.clusters. No GA, spec.clusters é necessário, e vários campos que costumavam viver no nível superior de spec agora vivem apenas dentro de spec.clusters[0]. Cada manifesto existente precisa da mesma edição mecânica, uma vez, independentemente da topologia.

Os exemplos nesta seção usam um recurso MongoDBSearch chamado my-search no namespace mongodb. Substitua o nome e o namespace do seu próprio recurso.

1

Seis campos spec de nível superior movem-se para dentro de spec.clusters[0]:

Caminho de visualização pública
Caminho 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

Quando spec.clusters tem exatamente uma entrada, o que é o caso para cada carga de trabalho de visualização pública, você não precisa definir spec.clusters[0].name ou spec.clusters[0].index.

logLevel, security, source, version e autoEmbedding permanecem no nível superior de spec, inalterados.

Exemplo

A seguinte configuração de visualização 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"

torna-se a seguinte configuração no 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

Se você pular esta etapa, o servidor da API do Kubernetes rejeitará seu manifesto de visualização pública imediatamente: spec.clusters é um campo obrigatório sem padrão, portanto, esta é uma falha de admissão imediata, não uma falha atrasada ou silenciosa.

2

Essa mudança é mais do que uma renomeação: na GA, o ponto de extremidade de métricas do Prometheus está habilitado por padrão, enquanto na Public Preview ele foi desabilitado, a menos que você definisse explicitamente spec.prometheus.

Se você já definiu spec.prometheus, mova-o como está:

Exemplo

Visualização pública:

spec:
prometheus:
port: 9946

GA:

spec:
observability:
prometheus:
port: 9946

Se você nunca definir spec.prometheus, não terá nada para mover, mas um destino de raspagem do Prometheus na porta 9946 aparecerá após a atualização, onde não existia antes.

Importante

Para manter as métricas desabilitadas após a atualização, adicione o seguinte explicitamente:

spec:
observability:
prometheus:
mode: disabled
3

Aviso

Essa alteração interrompe o TLS existente sem fallback automático. Se o recurso MongoDBSearch configurar um CA TLS em spec.source.external.tls.ca e você pular esta etapa, o TLS externo será interrompido no momento em que o operador do Kubernetes GA começar a reconciliar: ele sempre lê um ConfigMap e não tem fallback para um Secret. Se o seu recurso não usar spec.source.external.tls.ca de forma alguma, esta etapa não se aplica a você.

O caminho do campo, spec.source.external.tls.ca.name, não muda. O que muda é o tipo de objeto Kubernetes que o operador Kubernetes espera nesse nome: um Secret na visualização pública, um ConfigMap no GA. Ambos esperam o certificado CA na mesma chave, ca.crt.

Exemplo

Na visualização pública, spec.source.external.tls.ca.name refere-se a um Secret:

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

No GA, o mesmo nome deve se referir a um ConfigMap com a mesma chave ca.crt:

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

O recurso MongoDBSearch de referência não é alterado. spec.source.external.tls.ca.name ainda aponta para o mesmo nome:

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

Crie o ConfigMap antes de atualizar o Kubernetes Operator, se puder, ou ao mesmo tempo:

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

Você pode reutilizar o nome do seu antigo Secret, como mostrado no exemplo anterior, ou escolher um novo. O operador do Kubernetes não lê mais o antigo Secret. Você pode exclui-lo depois de confirmar que o TLS externo funciona novamente.

Esta seção aborda o que acontece com os objetos Kubernetes subjacentes que o operador Kubernetes gerencia e o que verificar e limpar depois. O que muda depende se o recurso MongoDBSearch sincroniza de um conjunto de réplicas ou de um cluster sharded.

A maioria dos recursos gerenciados pelo operador mantém o mesmo nome no GA. O Kubernetes Operator atualiza esses recursos no local na próxima reconciliação e você não precisa realizar nenhuma ação:

Se o recurso MongoDBSearch sincronizar de uma fonte de conjunto de réplicas (não sharded), o operador GA Kubernetes recriará três recursos com novos nomes na primeira vez que reconciliar o recurso MongoDBSearch. O operador Kubernetes não adota, renomeia ou exclui os objetos antigos. Esse comportamento é intencional.

A tabela a seguir usa o recurso de exemplo my-search da seção anterior:

Resource
Nome da visualização pública
Nome GA

mongot StatefulSet

my-search-search

my-search-search-0

mongot Serviço sem cabeça

my-search-search-svc

my-search-search-0-svc

mongot config ConfigMap

my-search-search-config

my-search-search-0-config

Essa alteração tem os seguintes efeitos práticos:

  • O novo StatefulSet começa vazio. Seus pods obtêm novos PersistentVolumeClaims, então mongot reindexa do zero, o que pode levar tempo dependendo do tamanho do seu conjunto de dados.

  • Os pods do StatefulSet antigo continuam em execução. O operador Kubernetes não os dimensiona. Até que você exclua o StatefulSet antigo, você executa o double da computação para seus pods mongot.

  • Os PVCs do StatefulSet antigo e o ConfigMap antigo ficam órfãos. Ninguém os lê mais, mas ninguém os exclui também.

  • A alteração do nome DNS do serviço sem cabeça não exige nenhuma ação de sua parte. Sem um balanceador de carga, o operador Kubernetes reescreve a string de conexão de origem de sincronização em cada reconciliação. Com um balanceador de carga gerenciado ou não gerenciado, este serviço não faz parte do caminho de conexão.

Importante

O operador do Kubernetes nunca exclui os objetos antigos para você. Depois de confirmar que o novo StatefulSet está íntegro (consulte Verificação), exclua os recursos antigos para evitar pagar por computação dobrada indefinidamente. Essa limpeza é uma etapa necessária, não opcional.

1

Confirme se o novo StatefulSet está íntegro primeiro (consulte Verificação) e, em seguida, execute:

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

A exclusão do StatefulSet não exclui seus PVCs, portanto, remova-os separadamente:

# 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

Os antigos PVCs correspondem a data-my-search-search-<ordinal>, por exemplo data-my-search-search-0. Não exclua nada que corresponda a data-my-search-search-0-<ordinal>, por exemplo data-my-search-search-0-0. Eles pertencem ao novo StatefulSet.

Se o seu recurso MongoDBSearch sincronizar de uma fonte de cluster sharded, os nomes de recursos por shard serão idênticos no Public Preview e no GA. O operador Kubernetes não os recria com novos nomes. Em vez disso, ele os atualiza no local:

Resource
Nome na visualização pública e GA (sem alterações)

mongot StatefulSet por shard

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

Serviço sem cabeça mongot por shard

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

Per-shard mongot config ConfigMap

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

Serviço de proxy por shard

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

A única exceção se aplica se você usar certificados TLS por shard. O operador Kubernetes combina o certificado e a chave do segredo TLS que você fornece em um segredo gerenciado pelo operador por shard e recria esse segredo sob um novo nome:

Resource
Nome da visualização pública
Nome GA

Segredo combinado com o operador TLS por shard

<shard-name>-search-certificate-key

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

Os segredos TLS que você fornece mantêm seus nomes. Somente este segredo gerenciado pelo operador é renomeado. O operador Kubernetes não exclui o segredo antigo, que se torna órfão. Verifique se o novo segredo existe e se o TLS funciona para esse shard e, em seguida, exclua o antigo manualmente.

Conclua esta lista de verificação depois de atualizar o operador do Kubernetes e aplicar as alterações do manifesto, e antes de excluir quaisquer recursos antigos:

  • Confirme se kubectl get mongodbsearch <name> -n <namespace> -o yaml mostra spec.clusters preenchido e nenhum campo replicas, persistence, resourceRequirements, statefulSet, loadBalancer, jvmFlags ou prometheus de nível superior restante.

  • Confirme se o novo StatefulSet mongot, <name>-search-0 para uma implantação de cluster único, tem todos os pods Running e Ready.

  • Confirme se mongot concluiu a reindexação nos novos pods antes de excluir qualquer coisa do StatefulSet antigo. Verifique os logs ou o status do índice de mongot para conclusão, não apenas a prontidão do pod.

  • Se você depende do scraping do Prometheus, confirme se sua configuração de scraping ou dashboards refletem o novo comportamento habilitado por padrão: as métricas agora aparecem, ou sua configuração explícita de mode: disabled as mantém desabilitadas.

  • Se você usar spec.source.external com TLS, confirme se o CA ConfigMap referenciado por spec.source.external.tls.ca.name existe e contém uma chave ca.crt válida e se a conexão de mongot com a implantação externa do MongoDB está íntegra.

  • Para fontes de conjunto de réplicas, confirme se você localizou e excluiu os objetos antigos <name>-search, <name>-search-svc e <name>-search-config e seus PVCs órfãos. Para fontes sharded, confirme se você excluiu os segredos TLS antigos por shard.

Se alguma parte da sua atualização não corresponder ao que este guia descreve, ou se você encontrar um problema que este guia não aborda, entre em contato com o Suporte do MongoDB. Inclua seu manifesto do MongoDBSearch com segredos redigidos, a versão do Kubernetes operador da qual você está atualizando e para qual versão, e a saída de:

kubectl describe mongodbsearch <name> -n <namespace>