Como realizar uma instalação do MongoDB no Kubernetes

Implantar aplicativos no Kubernetes pode ser desafiador, especialmente para aplicativos stateful como o MongoDB no cluster Kubernetes. Como facilitar a implantação? Deixe o Operador Kubernetes do MongoDB implantar e gerenciar automaticamente aplicativos stateful dentro do 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 ter os seguintes requisitos:

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

Criando Namespace para MongoDB

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

Os namespaces facilitam a administração de recursos do Kubernetes para os administradores e evitam colisões de nomes. Ao mesmo tempo, criar namespaces impede 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 para MongoDB

Depois de criar um espaço de nomes, é hora de baixar o Operador Kubernetes do MongoDB. O Operador Kubernetes do MongoDB é 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 do Operador Kubernetes do MongoDB para a sua máquina local.

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

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

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

# Liste arquivos e diretórios
ls

Você verá um subdiretório chamado config dentro do diretório do projeto ~/mongodb-kubernetes-operator, como 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 Operador MongoDB

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

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

Para implantar o operador MongoDB, você deve criar uma Definição de Recursos Personalizados (CRD) do Kubernetes Custom Resources Definition (CRD) 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 com estado 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 uma nova função, rolebinding e serviceaccount para o operador do MongoDB, que são permissões personalizadas no 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 a função, rolebinding e serviceaccount para o operador do MongoDB.

# Verificar lista de função
kubectl get role mongodb-kubernetes-operator -n mongodb

# Verificar lista de rolebinding
kubectl get rolebinding mongodb-kubernetes-operator -n mongodb

# Verificar serviceaccount
kubectl get serviceaccount mongodb-kubernetes-operator -n mongodb

A saída abaixo mostra que a função, rolebinding e serviceaccount mongodb-kubernetes-operator foram criados no namespace mongodb.

Checking role, rolebinding, and serviceaccount on Kubernetes

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

Este comando cria um novo pod (mongodb-kubernetes-operator) com a imagem base Docker (quay.io/mongodb/mongodb-kubernetes-operator). Este pod atuará como controlador para implantar automaticamente ReplicaSets 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.

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

# Verificar pods no namespace mongodb
kubectl get pods -n mongodb

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

Verifying MongoDB Operator Deployment and Pod

Implantando ReplicaSet do MongoDB no Kubernetes

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

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

Relacionado: Iniciando com o Monitoramento de Cluster Kubernetes usando 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 utilizado em diferentes cenários de implantação, 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 editor de sua preferência. Neste exemplo, usamos 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 implantando o Operador do MongoDB Kubernetes nos serviços de nuvem, como GKE e AKS, use o arquivo YAML mongodb.com_v1_mongodbcommunity_cr.yaml. Mas se estiver implantando localmente dentro do Kind ou Minikube, você pode usar o arquivo YAML personalizado (configuração arbitrária do estado persistente/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml), que cria automaticamente PV e PVC personalizados para os pods do Conjunto de Réplicas do MongoDB.

Abaixo, altere o número (membros) de Conjuntos de Réplicas que deseja implantar, dependendo do seu ambiente, mas o padrão é 3. Para este tutorial, o número de Conjuntos de Réplicas está definido como 2.

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

Substitua <sua-senha-aqui> pela sua senha forte. Você usará esta senha para fazer login no banco de dados do MongoDB e, por padrão, usará a autenticação SCRAM.

Salve as alterações e feche o editor quando estiver satisfeito com a senha.

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

2. Em seguida, execute o comando kubectl abaixo para implantar (apply) o Conjunto de Réplicas do MongoDB usando 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 senhas de usuário do MongoDB. Ao mesmo tempo, alguns PVs e PVCs com o tipo hostPath para o Conjunto de Réplicas do MongoDB.

O deployment levará algum tempo, dependendo do tamanho dos ReplicaSets a serem criados e do próprio cluster Kubernetes.

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

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

# Verificando o crd mongodbcommunity
kubectl get mongodbcommunity -n mongodb

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

O output 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 do MongoDB estão em execução com os nomes mdb0-0 e mdb0-1. Cada pod contém dois containers diferentes, o mongod, e o container mongodb-agent.
Verifying MongoDB ReplicaSet Deployment and Pods

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

kubectl get pv,pvc -n mongodb

O output 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 o Deployment do MongoDB

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

Você criará um novo segredo do Kubernetes para o novo usuário, editará o recurso personalizado do deployment do ReplicaSet e atualizará o ReplicaSet no seu cluster.

1. Crie um novo arquivo YAML usando o editor de sua preferência e preencha o seguinte segredo do Kubernetes. Você pode nomear o arquivo YAML como desejar, mas neste tutorial o arquivo é chamado de new-user.yaml.

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 meta.dados 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 no seu cluster e aplica esse 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 seu 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 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 que você fez 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 formato JSON e analisam a saída usando o comando jq na linha de comando.

Substitua mdb0-admin-mongoadmin por seus detalhes de ambiente da seguinte forma:

  • mdb0 – O nome dos 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 do administrador e conexões
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 appuser
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 standard e standardSrv. Você também verá o nome de usuário e a senha do seu deployment do MongoDB.

Retrieving Details of MongoDB User and Password, and Connections

Conectando-se 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á o banco de dados de sua máquina local e a conexão do usuário 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 do mongodb (-n).

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. Por fim, 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.

Altere o campo de nome de usuário e senha com 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 MongoDB Kubernetes Operator. Você também aprendeu sobre o uso básico do operador Kubernetes. E até agora, você já possui um conhecimento sólido sobre implantar e gerenciar aplicativos automaticamente no Kubernetes.

Não configurar uma conexão TLS em sua implementação do MongoDB para construir sobre esse conhecimento recém-adquirido? A conexão TLS protege as conexões entre conjuntos de réplicas e garante a segurança das conexões do cliente ou do aplicativo com o MongoDB.

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