[Série][AKS] Provisionando Bancos de Dados no Azure Kubernetes Service – MongoDB

Fala meu povo!

Depois de alguns dias de descanso dos posts por aqui, estamos de volta!

Dessa vez veremos como provisionar um cluster de MongoDB no nosso querido e amado AKS!

Do ultimo post que fizemos até este tive problemas na minha subscription do MSDN que tem um limite de gastos e precisei alterar a subscription e por consequencia tive que recriar o cluster de AKS, segue as especificações deste novo cluster:

Agora que temos nosso cluster no ar, vamos baixar as credenciais para utiliza-lo:

az aks get-credentials --resource-group aks-database-labs --name aks-database-labs

Agora vamos verificar se existem 3 nodes assim como o cluster anterior:

kubectl get nodes

Uma vez que nosso cluster esta ok vamos começar a provisionar nosso cluster mongodb. Primeira coisa será isolar nossos recursos em um namespace dedicado:

kubectl create namespace mongodb

Para este lab utilizaremos o Operator do MongoDB Community Edition, versão indicada para testes e ambientes não produtivos, para ambientes produtivos indico a utilização do MongoDB Enterprise para, além de ter todas as features, também ter um suporte especializado do fornecedor. Para baixar os arquivos necessários, execute o git clone:

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

Uma vez com os arquivos em maquina, vamos agora alterar o arquivo cluster_role_binding.yaml para inserir no namespace para criação do ServiceAccount e ClusterRole que serão utilizados pelo Operator:

vim deploy/clusterwide/cluster_role_binding.yaml

O arquivo deve ficar desta forma:

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: mongodb-kubernetes-operator
subjects:
- kind: ServiceAccount
  namespace: mongodb
  name: mongodb-kubernetes-operator
roleRef:
  kind: ClusterRole
  name: mongodb-kubernetes-operator
  apiGroup: rbac.authorization.k8s.io

Agora vamos começar a provisionar nosso Operator, para isso vamos executar alguns yamls que irão criar as rbacs e acessos necessários para o nosso cluster:

kubectl apply -f deploy/clusterwide
kubectl apply -k config/rbac --namespace mongodb

Agora vamos registrar uma nova API em nosso AKS, essa API irá conter todos os componentes necessários para seguirmos com a criação do nosso operator e cluster replica-set:

kubectl apply -f config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
kubectl get crd/mongodbcommunity.mongodbcommunity.mongodb.com

Agora vamos validar a criação das nossas RBACs executando:

kubectl apply -k config/rbac/ --namespace mongodb
kubectl get role mongodb-kubernetes-operator --namespace mongodb
kubectl get rolebinding mongodb-kubernetes-operator --namespace mongodb
kubectl get serviceaccount mongodb-kubernetes-operator --namespace mongodb

Agora vamos criar nosso Operator efetivamente executando o seguinte yaml:

kubectl create -f config/manager/manager.yaml --namespace mongodb
kubectl get pods --namespace mongodb

Uma vez que nosso Operator esteja rodando com sucesso, vamos agora criar um ReplicaSet que irá provisionar nosso cluster de MongoDB Community, para isso crie um arquivo chamado mongodb.yaml com o conteúdo abaixo:

---
apiVersion: mongodbcommunity.mongodb.com/v1
kind: MongoDBCommunity
metadata:
  name: mongodb
spec:
  members: 3
  type: ReplicaSet
  version: "4.2.6"
  security:
    authentication:
      modes: ["SCRAM"]
  users:
    - name: akslabuser
      db: admin
      passwordSecretRef: # a reference to the secret that will be used to generate the user's password
        name: akslabuserpassword
      roles:
        - name: clusterAdmin
          db: admin
        - name: userAdminAnyDatabase
          db: admin
      scramCredentialsSecretName: my-scram
  additionalMongodConfig:
    storage.wiredTiger.engineConfig.journalCompressor: zlib

---
apiVersion: v1
kind: Secret
metadata:
  name: akslabuserpassword
type: Opaque
stringData:
  password: P@ssW0rdC0mpl3x

Agora crie o Replica Set:

kubectl create -f mongodb.yaml -n mongodb
kubectl get pods -n mongodb

Varios componentes foram criados junto neste provisionamento em background, vamos ver como ficou toda nossa estrutura? Execute:

kubectl get all -n mongodb
kubectl get pvc -n mongodb
kubectl get pv -n mongodb

Agora temos nosso cluster MongoDB executando em nosso AKS, se precisarmos adicionar algum Arbiter para ajudar na eleição de novos primarys e auxiliar na gestão do cluster basta incluir no arquivo de provisionamento do Replica Set:

Execute o comando para alterar o Replica Set:

kubectl apply -f mongodb.yaml -n mongodb

Para saber as strings de conexão e informações para logar no cluster execute o seguinte comando:

kubectl get secret mongodb-admin-akslabuser -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

Para validar se o seu cluster esta funcionando apropriadamente vamos entrar em algum dos pods, logar no MongoDB e executar o comando rs.status() para verificar o cluster:

kubectl -n mongodb exec --stdin --tty mongodb-0 -- /bin/bash

Uma vez dentro do Pod mongodb-0 execute:

mongo "mongodb+srv://akslabuser:P%40ssW0rdC0mpl3x@mongodb-svc.mongodb.svc.cluster.local/admin?replicaSet=mongodb&ssl=false"

E agora para verificar o Status do nosso Replica Set, basta executar:

rs.status()

Caso vocês queiram se aprofundar mais neste lab e em outros componentes desta estrutura é só consultar o projeto no Github:

https://github.com/mongodb/mongodb-kubernetes-operator

Gente, por hoje é só, lembrando que este é um lab, caso queira executar o MongoDB em ambiente produtivo e em K8s indico seguir com a versão Enterprise.

Até o próximo Post!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: