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.
Antes de começar
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.
Atualize sua configuração do MongoDBSearch
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.
Adicione o campo spec.clusters necessário e mova as configurações por cluster para ele.
Seis campos spec de nível superior movem-se para dentro de spec.clusters[0]:
Caminho de visualização pública | Caminho GA |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
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.
Mova spec.prometheus para spec.observability.prometheus.
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
Atualize a referência externa do CA TLS do MongoDB de um Secret para um ConfigMap.
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.
O que acontece com seus recursos do Kubernetes
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.
Recursos que mantêm seus nomes
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:
O serviço de proxy (
<name>-search-0-proxy-svc)A implantação do balanceador de carga do Envoy, ConfigMap e certificados (
<name>-search-lb-0...)TLS, X.509 e segredos de senha, exceto o segredo TLS por shard gerenciado pelo operador descrito em Fontes de cluster sharded: nomes inalterados, com uma exceção
Fontes do conjunto de réplicas: recursos recriados com novos nomes
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 |
|---|---|---|
|
|
|
|
|
|
|
|
|
Essa alteração tem os seguintes efeitos práticos:
O novo StatefulSet começa vazio. Seus pods obtêm novos
PersistentVolumeClaims, entãomongotreindexa 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.
Exclua o StatefulSet, o Service e o ConfigMap antigos.
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
Exclua os PersistentVolumeClaims órfãos.
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.
Fontes de cluster sharded: nomes inalterados, com uma exceção
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) |
|---|---|
|
|
Serviço sem cabeça |
|
Per-shard |
|
Serviço de proxy por shard |
|
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 |
|
|
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.
Verificação
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 yamlmostraspec.clusterspreenchido e nenhum camporeplicas,persistence,resourceRequirements,statefulSet,loadBalancer,jvmFlagsouprometheusde nível superior restante.Confirme se o novo StatefulSet
mongot,<name>-search-0para uma implantação de cluster único, tem todos os podsRunningeReady.Confirme se
mongotconcluiu a reindexação nos novos pods antes de excluir qualquer coisa do StatefulSet antigo. Verifique os logs ou o status do índice demongotpara 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: disabledas mantém desabilitadas.Se você usar
spec.source.externalcom TLS, confirme se o CAConfigMapreferenciado porspec.source.external.tls.ca.nameexiste e contém uma chaveca.crtválida e se a conexão demongotcom 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-svce<name>-search-confige seus PVCs órfãos. Para fontes sharded, confirme se você excluiu os segredos TLS antigos por shard.
Obter suporte
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>