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!