Como Realizar uma Instalação do MongoDB no Kubernetes

Implantações de aplicativos no Kubernetes podem ser desafiadoras, especialmente para aplicativos stateful como o MongoDB em um cluster Kubernetes. Como facilitar o processo de implantação? Permita que o Operador Kubernetes do MongoDB implante automaticamente e gerencie aplicativos stateful em seu cluster Kubernetes.

Neste tutorial, você aprenderá como implantar o MongoDB no Kubernetes usando o Operador Kubernetes do MongoDB.

Continue lendo e comece a automatizar suas implantações no Kubernetes!

Pré-requisitos

Este tutorial será uma demonstração prática. Para acompanhar, certifique-se de atender aos seguintes requisitos:

  • A Kubernetes cluster – This demo uses the Kubernetes cluster v1.23.
  • Kubectl instalado na máquina local.
  • Git instalado em sua máquina.
  • jq, o analisador JSON, instalado na máquina local.

Criando Namespace para MongoDB

Ao implantar aplicativos no Kubernetes, criar um namespace específico para seus projetos é sempre recomendado.

Os namespaces facilitam a administração de recursos do Kubernetes para os administradores e evitam colisões de nomes. Ao mesmo tempo, criar namespaces previne o uso incorreto de recursos no ambiente do Kubernetes.

Abra seu terminal e execute o comando kubectl create abaixo para criar um novo namespace (ns) chamado mongodb em seu cluster Kubernetes.

kubectl create ns mongodb

Agora execute o comando abaixo kubectl get para verificar a lista de namespaces em seu cluster Kubernetes.

kubectl get ns

Você verá um novo namespace chamado mongodb disponível em seu cluster, conforme mostrado abaixo.

Creating and Verifying the mongodb Namespace

Download do Operador Kubernetes MongoDB

Depois de criar um espaço de nomes, é hora de baixar o MongoDB Kubernetes Operator. O MongoDB Kubernetes Operator é um conjunto de operadores Kubernetes. Esses operadores Kubernetes oferecem implantação, configuração e gerenciamento automáticos do MongoDB Community no ambiente Kubernetes.

Execute o comando git abaixo para clonar o projeto MongoDB Kubernetes Operator em sua máquina local.

git clone <https://github.com/mongodb/mongodb-kubernetes-operator.git>

Agora, execute cada comando abaixo para mudar seu diretório de trabalho atual para mongodb-kubernetes-operator e listar (ls) todos os arquivos e diretórios disponíveis.

# Alterar o diretório de trabalho para mongodb-kubernetes-operator
cd mongodb-kubernetes-operator/

# Listar arquivos e diretórios
ls

Você verá um subdiretório chamado config dentro do diretório do projeto ~/mongodb-kubernetes-operator, conforme mostrado abaixo. O subdiretório config contém exemplos de arquivos YAML para implantar o MongoDB no Kubernetes.

Downloading mongodb-kubernetes-operator Source Code

Implantando o MongoDB Operator

Agora que seu espaço de nomes personalizado e o MongoDB Kubernetes Operator estão configurados, você está pronto para implantar o MongoDB Operator em seu cluster Kubernetes. Como? Você usará a configuração dentro do diretório config.

O MongoDB Operator cuida do ciclo de vida da implantação do seu MongoDB no cluster Kubernetes. O operador criará, gerenciará e dimensionará automaticamente o estado da sua implantação do MongoDB.

Para implantar o operador MongoDB, você deve criar uma Definição de Recursos Personalizados (CRD) do Kubernetes e o controlador. O CRD do Kubernetes é extensível à API do Kubernetes, permitindo que você crie recursos personalizados no Kubernetes.

1. Execute o comando kubectl apply abaixo para criar um novo CRD do Kubernetes para a implantação do MongoDB.

O operador Kubernetes substitui toda interação humana para implantar uma aplicação no Kubernetes. O operador é um controlador de pod que implanta e gerencia automaticamente sua aplicação stateful no Kubernetes.

kubectl apply -f config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
Creating New Kubernetes CRD MongoDB Kubernetes Deployment

2. Em seguida, execute o seguinte comando kubectl get para verificar a lista de crd disponíveis no seu Kubernetes.

kubectl get crd/mongodbcommunity.mongodbcommunity.mongodb.com

Abaixo, você pode ver o CRD com o nome mongodbcommunity.mongodbcommunity.mongodb.org.

Checking List of CRDs

3. Execute o comando abaixo para criar um novo Controle de Acesso Baseado em Função (RBAC) personalizado para o Operador MongoDB e especifique a implementação do RBAC para o namespace mongodb.

Este comando cria um novo papel, vinculação de funções e conta de serviço para o operador MongoDB, que são permissões personalizadas em seu cluster Kubernetes. Essas permissões personalizadas são necessárias para implantar e gerenciar automaticamente o MongoDB.

kubectl apply -k config/rbac/ -n mongodb
Deploying RBAC for MongoDB Deployment

4. Agora, execute cada comando kubectl abaixo para verificar o papel, a vinculação de funções e a conta de serviço para o operador MongoDB.

# Verificando a lista de funções
kubectl get role mongodb-kubernetes-operator -n mongodb

# Verificando a lista de vinculação de funções
kubectl get rolebinding mongodb-kubernetes-operator -n mongodb

# Verificando a conta de serviço
kubectl get serviceaccount mongodb-kubernetes-operator -n mongodb

A saída abaixo mostra que o papel, a vinculação de funções e a conta de serviço mongodb-kubernetes-operator são criados no namespace mongodb.

Checking role, rolebinding, and serviceaccount on Kubernetes

5. Após a verificação, execute o comando kubectl abaixo para implantar o Operador MongoDB no namespace mongodb.

Este comando cria um novo pod (mongodb-kubernetes-operator) com a imagem base do Docker (quay.io/mongodb/mongodb-kubernetes-operator). Este pod atuará como o controlador para implantar automaticamente os conjuntos de réplicas do MongoDB no cluster Kubernetes.

kubectl create -f config/manager/manager.yaml -n mongodb

Abaixo, você pode ver que a implantação do operador MongoDB foi criada, mas o pod ainda está inicializando.

Deploying MongoDB Operator to the mongodb Namespace

6. Por fim, execute os seguintes comandos para verificar a implantação e os pods no namespace mongodb.

# Verificando a implantação no namespace mongodb
kubectl get deployment.apps -n mongodb

# Verificando os pods no namespace mongodb
kubectl get pods -n mongodb

Como você pode ver abaixo, o pod do Operador MongoDB está em execução.

Verifying MongoDB Operator Deployment and Pod

**Implantando ReplicaSet do MongoDB no Kubernetes

**

Após a implantação do seu MongoDB, você implantará o ReplicaSet no seu Kubernetes para fornecer alta disponibilidade e redundância para a sua implantação do MongoDB. Você não gostaria de ter tempo de inatividade na sua implantação.

A implantação do MongoDB ReplicaSets usando o Operador Kubernetes do MongoDB é segura por padrão, utilizando a autenticação SCRAM para usuários. Ao mesmo tempo, você pode utilizar uma conexão segura TLS para conexões de usuários e aplicativos e expor métricas do Prometheus para monitorar recursos.

Relacionado: Iniciando com o Monitoramento de Cluster Kubernetes do Grafana & Prometheus

Dentro do diretório config/samples/, você verá vários exemplos de arquivos YAML para a implantação do ReplicaSet. Cada arquivo pode ser usado em cenários de implantação diferentes, mas o arquivo padrão de implantação do ReplicaSet é mongodb.com_v1_mongodbcommunity_cr.yaml.

1. Edite o arquivo YAML para a sua implantação usando o seu editor preferido. Neste exemplo, estamos usando o arquivo /mongodb.com_v1_hostpath.yaml para implantação local. Este arquivo YAML está localizado no diretório config/samples/arbitrary_statefulset_configuration/.

Se estiver a implementar o Operador do MongoDB Kubernetes nos serviços de nuvem, como GKE e AKS, utilize o ficheiro YAML mongodb.com_v1_mongodbcommunity_cr.yaml. Mas se estiver a implementar localmente dentro do Kind ou Minikube, pode utilizar o ficheiro YAML personalizado (arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml), que cria automaticamente PV e PVC personalizados para os pods do MongoDB ReplicaSet.

Em seguida, altere o número (membros) dos ReplicaSets que pretende implementar, dependendo do seu ambiente, mas o valor predefinido é 3. Para este tutorial, o número de ReplicaSets está definido como 2.

spec:
  members: 2 # Número de conjuntos de réplicas a criar
  security:
    authentication:
      modes:
      - SCRAM
  statefulSet:

Substitua <your-password-here> pelo seu password forte. Utilizará este password para iniciar sessão na base de dados do MongoDB e, por predefinição, utilizará a autenticação SCRAM.

Guarde as alterações e feche o editor quando estiver satisfeito com a password.

---
apiVersion: v1
kind: Secret
metadata:
  name: my-user-password
type: Opaque
stringData:
  password: <your-password-here> # Definir password para o administrador do MongoDB

2. A seguir, execute o comando kubectl abaixo para implementar (apply) o MongoDB ReplicaSet utilizando o mongodb.com_v1_hostpath.yaml no namespace mongodb.

Este comando cria o seguinte:

  • A new custom resource (MongoDBCommunity) with the name mdb0 under the mongodbcommunity.mongodb.com/v1 CRD
  • Segredos do Kubernetes para armazenar as passwords de utilizador do MongoDB. Ao mesmo tempo, alguns PVs e PVCs com o tipo hostPath para o conjunto de réplicas do MongoDB.

A implantação levará algum tempo, dependendo do tamanho dos ReplicaSets a serem criados e do próprio cluster do Kubernetes.

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Deploying MongoDB Replica Sets

3. Após a implantação, execute cada comando abaixo para verificar os recursos personalizados e os pods no namespace mongodb.

# Verificando o crd mongodbcommunity
kubectl get mongodbcommunity -n mongodb

# Verificando os pods no namespace mongodb
kubectl get pods -n mongodb

A saída abaixo mostra o seguinte:

  • O recurso personalizado MongoDBCommunity com o nome mdb0 está em execução com o MongoDB v4.4.0.
  • Os dois pods do ReplicaSet MongoDB estão em execução com os nomes mdb0-0 e mdb0-1. Cada pod contém dois contêineres diferentes, o mongod, e o contêiner mongodb-agent.
Verifying MongoDB ReplicaSet Deployment and Pods

4. Por último, execute outro comando kubectl abaixo para verificar o pv e o pvc no namespace mongodb.

kubectl get pv,pvc -n mongodb

A saída abaixo mostra alguns pv e pvc usados pelos pods do ReplicaSet do MongoDB.

Checking PV and PVC on the mongodb Namespace

Criando um Novo Usuário e Banco de Dados para a Implantação do MongoDB

Você concluiu a implantação do operador MongoDB e dos ReplicaSets em seu cluster Kubernetes neste ponto. O próximo passo é criar um novo banco de dados MongoDB e usuário para sua aplicação.

Você criará um novo segredo do Kubernetes para o novo usuário, editará o recurso personalizado da implantação do ReplicaSet e atualizará o ReplicaSet para seu cluster.

1. Crie um novo arquivo YAML usando o seu editor preferido e preencha o seguinte segredo do Kubernetes. Você pode nomear o arquivo YAML como desejar, mas o arquivo é nomeado new-user.yaml neste tutorial.

Este arquivo YAML cria um novo segredo do Kubernetes com o nome myappdata e a senha myapppassword.

---
apiVersion: v1
kind: Secret
metadata:
  name: myappdata # nome do metadado do segredo
type: Opaque
stringData:
  password: myapppassword # senha para o novo usuário

2. Em seguida, execute o comando kubectl abaixo para executar a configuração new-user.yaml.

Este comando cria e aplica (apply) um novo segredo do Kubernetes ao seu cluster e aplica este segredo ao namespace mongodb.

kubectl apply -f new-user.yaml -n mongodb
Creating Secret to Kubernetes Cluster

3. Edite o arquivo YAML da configuração do ReplicaSet CRD (mongodb.com_v1_hostpath.yaml) no diretório config/samples/arbitrary_statefulset_configuration

Adicione a seguinte configuração ao arquivo mongodb.com_v1_hostpath.yaml , que cria o banco de dados e o usuário para o MongoDB.

Certifique-se de substituir scram-secret-myapp pelas suas próprias credenciais scram, salve as alterações no arquivo e feche o editor.

    - name: appuser # Novo usuário appuser
      db: admin # Permite autenticação ao banco de dados admin
      passwordSecretRef:
        name: myappdata # O segredo do Kubernetes
      roles:
        - name: dbAdmin # Configuração da função dbAdmin
          db: appdb1 # para o appdb1
      scramCredentialsSecretName: scram-secret-myapp

4. Agora, execute o comando abaixo para aplicar as novas alterações feitas no arquivo mongodb.com_v1_hostpath.yaml no passo três.

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Creating New MongoDB User and Database on Kubernetes

5. Por último, execute cada comando abaixo para gerar as conexões detalhadas do MongoDB para sua aplicação. Esses comandos geram a conexão detalhada do MongoDB para suas aplicações em saída JSON e analisam a saída usando o comando de linha jq.

Substitua mdb0-admin-mongoadmin pelos detalhes do seu ambiente conforme segue:

  • mdb0 – O nome de metadados dos recursos do MongoDB.
  • admin – O banco de dados para autenticação.
  • mongoadmin – O usuário que você usará para autenticação
# Obtenha detalhes de autenticação e conexões de administração
kubectl get secrets mdb0-admin-mongoadmin -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

# Obtenha detalhes de autenticação e conexões do usuário do aplicativo
kubectl get secrets mdb0-admin-appuser -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

A saída abaixo mostra que você pode se conectar ao MongoDB usando as conexões padrão e padrãoSrv. Você também verá o nome de usuário e senha do seu deployment do MongoDB.

Retrieving Details of MongoDB User and Password, and Connections

Conectando ao Deployment do MongoDB

Você concluiu a implantação do MongoDB no cluster Kubernetes usando o operador Kubernetes do MongoDB. Mas como você sabe se a implantação funciona? Você verificará a conexão do banco de dados e do usuário de sua máquina local com o MongoDB dentro do cluster Kubernetes.

Para verificar a conexão com sua implantação do MongoDB, você usará o encaminhamento de porta. O encaminhamento de porta no Kubernetes permite que você crie uma porta de encaminhamento de qualquer serviço do Kubernetes para sua porta local.

1. Execute o comando kubectl abaixo para obter a lista de serviços (svc) no namespace mongodb.

kubectl get svc -n mongodb

Abaixo, você verá o serviço chamado mdb0-svc, que expõe a porta 27017 (porta padrão do MongoDB).

Listing Services on the mongodb Namespace

2. Em seguida, execute o comando abaixo para criar um encaminhamento de porta para o cluster Kubernetes.

Este comando cria um novo encaminhamento de porta no serviço Kubernetes (mdb0-svc) e encaminha a porta local 27017 para a porta do serviço Kubernetes 27017.

kubectl port-forward service/mdb0-svc -n mongodb 27017:27017
Setting up Port-forward

3. Finalmente, abra o aplicativo MongoDB Compass em sua máquina local, adicione uma nova conexão com o seguinte formato e clique em Conectar para se conectar ao MongoDB.

Substitua o campo de nome de usuário e senha pelo seu usuário e senha do MongoDB.

# Conectar como mongoadmin
mongodb://mongoadmin:secretpassword@localhost:27017/admin?ssl=false

# Conectar como appuser
mongodb://appuser:myapppassword@localhost:27017/admin?ssl=false
Connecting as mongoadmin user to MongoDB
Connecting as appuser to MongoDB

Quando a conexão for bem-sucedida, você verá a seguinte janela que confirma que o deployment do MongoDB para o Kubernetes está funcionando corretamente.

Para o usuário mongoadmin, você verá bancos de dados padrão (local, config e admin).

Verifying Connection to the MongoDB mongoadmin

Para o appuser, você verá apenas um banco de dados de privilégios chamado appdb1.

Verifying Connection to the MongoDB as appuser

Conclusão

Ao longo deste tutorial, você aprendeu como implantar o MongoDB no cluster Kubernetes usando o Operador Kubernetes do MongoDB. Você também aprendeu sobre o uso básico do operador Kubernetes. E até agora, você já tem um conhecimento sólido sobre a implantação e gerenciamento automático de aplicativos no Kubernetes.

Por que não configurar uma conexão TLS em sua implantação do MongoDB para construir com base nesse conhecimento recém-adquirido? A conexão TLS garante a segurança das conexões entre conjuntos de réplicas e protege as conexões de clientes ou aplicativos com o MongoDB.

Source:
https://adamtheautomator.com/mongodb-kubernetes/