Como distribuir um aplicativo no Kubernetes com o MongoDB Atlas Operator
Joel Lord, Cedric Clyburn9 min read • Published Aug 16, 2022 • Updated Aug 30, 2024
Avalie esse Tutorial
O Kubernetes é agora um padrão em todo o setor quando se trata de contêineres, mas quando se trata de implementar um banco de dados, pode ser um pouco complicado! No entanto, tarefas como adicionar persistência, garantir redundância e manutenção de banco de dados podem ser facilmente tratadas com o MongoDB Atlas. Felizmente, o Operador do MongoDB Atlas oferece todos os benefícios do uso do MongoDB Atlas, enquanto ainda gerencia tudo de dentro do seu cluster Kubernetes. Neste tutorial, implantaremos um aplicativo de pilhaMERN no Kubernetes, instalaremos o operador Atlas e conectaremos nosso back-end ao Atlas usando um segredo do Kubernetes.
Quando se trata de implantar um banco de dados no Kubernetes, não existe uma solução simples. Além dos desafios de persistência e redundância, talvez seja necessário mover dados para servidores geolocalizados específicos para garantir a conformidade com as políticas do GDPR. Portanto, você precisará de um banco de dados confiável, escalonável e resiliente depois de iniciar seu aplicativo em produção.
O MongoDB Atlas é uma plataforma de dados de desenvolvedor completa que inclui o banco de dados que você ama, que toma conta de muitas das complexidades do banco de dados que você está usando. Mas há uma lacuna entre o MongoDB Atlas e seu cluster Kubernetes. Vamos dar uma olhada no MongoDB Atlas Operator implementando o exemplo de aplicativo MERN com um back-end e um front-end.
Esse aplicativo usa uma arquitetura de aplicativo de três camadas, que terá o seguinte layout em nosso cluster Kubernetes:
Para dar uma breve visão geral desse layout, temos um back-end com uma implementação que garantirá que tenhamos dois pods em execução a qualquer momento, e o mesmo se aplica ao nosso front-end. O tráfego é redirecionado e configurado pelo nosso ingresso, o que significa que
/api
solicitações são roteadas para o nosso back-end e todo o resto vai para o front-end. O back-end do nosso aplicativo é responsável pela conexão com o banco de dados, onde estamos usando o MongoDB Atlas Operator para vincular a uma instância do Atlas.Para simplificar o processo de instalação do aplicativo, podemos usar um único comando
kubectl
para implantar nosso aplicativo de demonstração no Kubernetes. O único arquivo que usaremos inclui todas as implantações e serviços para o back-end e o front-end do nosso aplicativo e usa contêineres criados com os Dockerfiles na pasta.Primeiro, comece clonando o repositório que contém o código-fonte inicial.
1 git clone https://github.com/mongodb-developer/mern-k8s.git 2 3 cd mern-k8s
Em segundo lugar, como parte deste tutorial, você precisará executar
minikube tunnel
para acessar nossos serviços em localhost
.1 minikube tunnel
Agora, vamos implantar tudo em nosso cluster do Kubernetes aplicando o seguinte
application.yaml
arquivo.1 kubectl apply -f k8s/application.yaml
Você pode dar uma olhada no que está sendo executado no seu cluster usando o comando
kubectl get
.1 kubectl get all
Você deve ver vários pods, serviços e implantações para o back-end e o front-end, bem como conjuntos de réplicas. No momento, é mais provável que eles estejam em um status ContainerCreating. Isso ocorre porque o Kubernetes precisa puxar as imagens para seu registro local. Assim que as imagens estiverem prontas, os pods começarão.
Para ver o aplicativo em ação, basta acessar
localhost
em seu navegador da Web e o aplicativo deverá estar ativo!No entanto, você notará que não há como adicionar entradas a nosso aplicativo, e isso ocorre porque ainda não fornecemos uma connection string para que o backend se conecte a uma instância do MongoDB. Por exemplo, se verificarmos os registros de um dos Pods de backend criados recentemente, podemos ver que há um espaço reservado para uma connection string.
1 kubectl logs pod/mern-k8s-back-d566cc88f-hhghl 2 3 Connecting to database using $ATLAS_CONNECTION_STRING 4 Server started on port 3000 5 MongoParseError: Invalid scheme, expected connection string to start with "mongodb://" or "mongodb+srv://"
Encontramos um pequeno problema, pois esse aplicativo de demonstração está usando um espaço reservado (
$ATLAS_CONNECTION_STRING
) para a string de conexão do MongoDB, que precisa ser substituído por uma string de conexão válida do nosso cluster Atlas. Esse problema pode ser resolvido com o MongoDB Atlas Operator, que permite gerenciar tudo de dentro do Kubernetes e oferece todas as vantagens de usar o MongoDB Atlas, incluindo a geração de uma string de conexão como um segredo do Kubernetes.Como há atualmente uma lacuna entre seu cluster Kubernetes e o MongoDB Atlas, vamos usar o Operador Atlas para corrigir esse problema. Por meio do operador, poderemos gerenciar nossos projetos e clusters do Atlas a partir do Kubernetes. Especificamente, obter sua connection string para corrigir o erro que recebeu anteriormente pode ser feito agora por meio dos segredos do Kubernetes, o que significa que não precisaremos recuperá-la da UI ou do Atlas CLI.
O Atlas Operator faz a ponte entre o Atlas, a plataforma de dados do MongoDB e seu cluster do Kubernetes. Ao usar o operador, você pode usar
kubectl
e suas ferramentas familiares para gerenciar e configurar suas implantações do Atlas. Particularmente, ele permite que a maior parte da funcionalidade e das ferramentas do Atlas seja executada sem precisar sair do seu cluster do Kubernetes. A instalação do operador do Atlas cria as definições de recursos personalizados que se conectarão aos servidores Atlas do MongoDB.O processo de instalação do Operador Atlas é tão simples quanto executar um comando
kubectl
. Todo o código fonte do operador pode ser encontrado no repositório do Github.1 kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-atlas-kubernetes/main/deploy/all-in-one.yaml
Isso criará novos recursos personalizados em seu cluster que você poderá usar para criar ou gerenciar seus projetos e clusters existentes do Atlas.
Vá para a página deregistro do Atlas para criar sua conta gratuita. Essa conta permitirá que você crie um banco de dados em um servidor compartilhado e você nem precisará de um cartão de crédito para usá-lo.
Para que o operador possa gerenciar seu cluster, você precisará fornecer a ele uma chave de API com as permissões apropriadas. Em primeiro lugar, vamos recuperar o ID da organização.
Na parte superior esquerda da interface do usuário do Atlas, você verá o nome da sua organização em um menu suspenso. Ao lado do menu suspenso, há um ícone de engrenagem. Clicar neste ícone abrirá uma página chamada Configurações da organização. Nessa página, procure uma caixa rotulada ID da organização.
Salve esse ID da organização em algum lugar para uso futuro. Você também pode salvá-lo em uma variável de ambiente.
1 export ORG_ID=60c102....bd
Observação: se estiver usando o Windows, use:
1 set ORG_ID=60c102....bd
Em seguida, vamos criar uma chave de API. Na mesma tela, procure a opçãoAccess Manager no menu de navegação esquerdo. Isso levará você à telaAcesso à organização . Nesta tela, siga as instruções para criar uma nova chave de API.
A chave precisará da função Organization Project Creator para criar novos projetos e clusters. Se você quiser gerenciar clusters existentes, precisará fornecer a ele a função " Proprietário da organização" . Salve as chaves privadas e públicas da API. Você também pode adicioná-los ao ambiente.
1 export ATLAS_PUBLIC_KEY=iwpd...i 2 export ATLAS_PRIVATE_KEY=e13debfb-4f35-4...cb
Observação: se estiver usando o Windows, use:
1 set ATLAS_PUBLIC_KEY=iwpd...i 2 set ATLAS_PRIVATE_KEY=e13debfb-4f35-4...cb
Agora que você criou a chave de API, você pode especificar esses valores para o Operador do MongoDB Atlas. Ao criar esse segredo em nosso cluster Kubernetes, isso concederá ao operador as permissões necessárias para criar e gerenciar projetos e clusters para nossa conta Atlas específica.
Você pode criar o segredo com
kubectl
e, para simplificar, vamos nomear nosso segredo mongodb-atlas-operator-api-key
. Para que o operador possa encontrar esse segredo, ele precisa estar dentro do namespace mongodb-atlas-system
.1 kubectl create secret generic mongodb-atlas-operator-api-key \ 2 --from-literal="orgId=$ORG_ID" \ 3 --from-literal="publicApiKey=$ATLAS_PUBLIC_KEY" \ 4 --from-literal="privateApiKey=$ATLAS_PRIVATE_KEY" \ 5 -n mongodb-atlas-system
Em seguida, precisaremos rotular esse segredo, o que ajuda o operador Atlas a encontrar as credenciais.
1 kubectl label secret mongodb-atlas-operator-api-key atlas.mongodb.com/type=credentials -n mongodb-atlas-system
Precisamos de uma senha para o usuário do banco de dados para acessar nossos bancos de dados, criar novos bancos de dados etc. No entanto, você não vai querer codificar essa senha em seus arquivos yaml. É mais seguro salvá-lo como um segredo do Kubernetes. Assim como a chave API, esse segredo também precisará ser rotulado.
1 kubectl create secret generic atlaspassword --from-literal="password=mernk8s" 2 kubectl label secret atlaspassword atlas.mongodb.com/type=credentials
Parabéns! Agora você está pronto para gerenciar seus projetos e implantações do Atlas no Kubernetes. Isso pode ser feito com os três novos CRDs que foram adicionados ao seu cluster. Esses CRDs são
AtlasProject
para gerenciar projetos, AtlasDeployment
para gerenciar implantações e AtlasDatabaseUser
para gerenciar usuários de banco de dados no MongoDB Atlas.- Projetos: permite isolar diferentes ambientes de banco de dados (por exemplo, ambientes de desenvolvimento/qa/produção) uns dos outros, bem como usuários/equipes.
- Sistemas: instância do MongoDB em execução em um fornecedor de nuvem.
- Usuários: usuários do banco de dados que têm acesso aos sistemas de banco de dados MongoDB.
O processo de criação de um projeto, usuário e implantação é demonstrado abaixo, mas sinta-se à vontade para pular para baixo e simplesmente aplicar esses arquivos usando a pasta
/atlas
.Comece criando um novo projeto no qual o novo cluster será implantado. Em um novo arquivo chamado
/operator/project.yaml
, adicione o seguinte:1 apiVersion: atlas.mongodb.com/v1 2 kind: AtlasProject 3 metadata: 4 name: mern-k8s-project 5 spec: 6 name: "MERN K8s" 7 projectIpAccessList: 8 - ipAddress: "0.0.0.0/0" 9 comment: "Allowing access to database from everywhere (only for Demo!)"
Isso criará um novo projeto chamado "MERN K8s" no Atlas. Agora, este projeto estará aberto a qualquer pessoa na web. É prática recomendada abri-lo apenas para endereços IP conhecidos, conforme mencionado no comentário.
Agora, para que seu aplicativo se conecte a esse banco de dados, você precisará de um usuário de banco de dados. Para criar esse usuário, abra um novo arquivo chamado
/operator/user.yaml
e adicione o seguinte:1 apiVersion: atlas.mongodb.com/v1 2 kind: AtlasDatabaseUser 3 metadata: 4 name: atlas-user 5 spec: 6 roles: 7 - roleName: "readWriteAnyDatabase" 8 databaseName: "admin" 9 projectRef: 10 name: mern-k8s-project 11 username: mernk8s 12 passwordSecretRef: 13 name: atlaspassword
Você pode ver como a senha usa o segredo que criamos anteriormente,
atlaspassword
, no namespacemern-k8s-project
.Finalmente, como você tem uma configuração de projeto e um usuário para se conectar ao banco de dados, você pode criar uma nova implantação dentro deste projeto. Em um novo arquivo chamado
/operator/deployment.yaml
, adicione o seguinte yaml.1 apiVersion: atlas.mongodb.com/v1 2 kind: AtlasDeployment 3 metadata: 4 name: mern-k8s-cluster 5 spec: 6 projectRef: 7 name: mern-k8s-project 8 deploymentSpec: 9 name: "Cluster0" 10 providerSettings: 11 instanceSizeName: M0 12 providerName: TENANT 13 regionName: US_EAST_1 14 backingProviderName: AWS
Isso criará uma nova implantação M0 (grátis) no AWS, na região US_EAST_1 . Aqui, estamos referenciando
mern-k8s-project
em nosso namespace Kubernetes e criando um cluster denominado Cluster0
. Você pode usar uma sintaxe semelhante para implantar em qualquer região na AWS, GCP ou Azure. Para criar uma instância sem servidor, consulte o exemplo de instância sem servidor.Agora você tem tudo pronto para criar este novo projeto e cluster. Você pode aplicar esses novos arquivos ao seu cluster usando:
1 kubectl apply -f ./operator
Isso levará alguns minutos. Você pode ver o status do cluster e a criação do projeto com
kubectl
.1 kubectl get atlasprojects 2 kubectl get atlasdeployments
Enquanto isso, você pode Go a UI do Atlas. O projeto já deve ter sido criado e você deve ver que um cluster está em processo de criação.
Obter sua connection string para esse banco de dados recém-criado agora pode ser feito por meio do Kubernetes. Após a criação do novo banco de dados, você pode usar o comando a seguir, que usa
jq
, para visualizar as connection strings, sem usar a UI do Atlas, convertendo para JSON a partir da base64.1 kubectl get secret mern-k8s-cluster0-mernk8s -o json | jq -r '.data | with_entries(.value |= @base64d)' 2 3 { 4 … 5 "connectionStringStandard": "![](https://mongodb-devhub-cms.s3.us-west-1.amazonaws.com/api_key_credentials_bcc611f1f0.png)", 6 "connectionStringStandardSrv": "mongodb+srv://mernk8s:mernk8s@cluster0.fb4qw.mongodb.net", 7 "password": "mernk8s", 8 "username": "mernk8s" 9 }
Agora que seu projeto e cluster foram criados, você pode acessar as várias propriedades da sua instância do Atlas. Agora você pode acessar a connection string e até mesmo configurar seu serviço de backend para usar essa connection string. Go conectar nosso back-end ao nosso banco de dados sem realmente especificar a string de conexão, em vez disso, usaremos o segredo do Kubernetes que acabamos de criar.
Agora que pode encontrar sua connection string no Kubernetes, você pode usá-la como parte do sistema para especificar a connection string para o backend.
No arquivo
/k8s/application.yaml
, altere a seçãoenv
do modelo de container para o seguinte:1 env: 2 - name: PORT 3 value: "3000" 4 - name: "CONN_STR" 5 valueFrom: 6 secretKeyRef: 7 name: mern-k8s-cluster0-mernk8s 8 key: connectionStringStandardSrv
Isso usará a mesma connection string que você acabou de ver em seu terminal.
Como alteramos nossa implantação, você pode aplicar essas alterações ao seu cluster usando
kubectl
:1 kubectl apply -f k8s/application.yaml
Agora, se você der uma olhada nos seus pods atuais:
1 kubectl get pods
Você verá que os pods de backend foram reiniciados. Agora você deve poder testar o aplicativo com o backend conectado ao nosso cluster Atlas recém-criado. Agora, basta acessar
localhost
para visualizar o aplicativo atualizado depois que a implantação for reiniciada. Você verá o aplicativo totalmente em execução, usando esse cluster recém-criado.Além disso, à medida que você adicionar itens ou talvez limpar as entradas do planejador de viagens, notará as entradas adicionadas e removidas da guia "Collections " do banco de dados
Cluster0
na interface do usuário do Atlas. Vamos dar uma olhada em nosso banco de dados usando o MongoDB Compass, com o nome de usuário mernk8s
e a senha mernk8s
, conforme definimos anteriormente.Vamos finalizar usando
kubectl
para excluir o Atlas cluster e projeto e limpar nosso espaço de trabalho. Podemos excluir tudo do namespace atual usando kubectl delete
1 kubectl delete atlasdeployment mern-k8s-cluster 2 kubectl delete atlasproject mern-k8s-project
Agora você sabe como aproveitar o MongoDB Atlas Operator para criar e gerenciar clusters do Kubernetes. Demonstramos apenas uma pequena parte da funcionalidade que o operador oferece, mas sinta-se à vontade para consultar a documentação para saber mais.
Se você estiver usando o MongoDB Enterprise em vez do Atlas, também haverá um operador disponível, que funciona de maneira muito semelhante.
Para passar pelo laboratório completo de Joel Lord, que inclui este guia e muito mais, confira o Atlas Operator Workshopautoguiado.