MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Uma visão geral do operador Percona MongoDB Kubernetes

MongoDB e Kubernetes é uma ótima combinação, especialmente no que diz respeito à complexidade. Ainda assim, o MongoDB da Percona (PSMDB) oferece mais flexibilidade para o banco de dados NoSQL e também vem com ferramentas eficientes para a produtividade atual; não apenas no local, mas também disponível para nativos da nuvem.

A taxa de adoção do Kubernetes está aumentando constantemente. É razoável que uma tecnologia tenha um operador para fazer o seguinte:criação, modificação e exclusão de itens do ambiente Percona Server for MongoDB. O Operador Percona MongoDB Kubernetes contém as configurações k8s necessárias para manter um servidor Percona consistente para uma instância do MongoDB. Como uma opção alternativa, você pode comparar isso com https://github.com/kubedb/mongodb, mas o KubeDB para MongoDB oferece opções muito limitadas para oferecer especialmente em sistemas de nível de produção.

Os Operadores Percona Kubernetes que possuem sua configuração são baseados e estão seguindo as melhores práticas para configuração do conjunto de réplicas PSMDB. O que mais importa, o próprio operador do MongoDB oferece muitos benefícios, mas economizar tempo, um ambiente consistente são os mais importantes. Neste blog, teremos uma visão geral de como isso é benéfico, especialmente em um ambiente em contêiner.

O que este operador pode oferecer?

Este operador é útil para PSMDB usando um conjunto de réplicas. Isso significa que sua arquitetura de design de banco de dados deve estar em conformidade com o seguinte diagrama abaixo
Imagem emprestada do Documentation Design Overview da Percona

Imagem emprestada do Documentation Design Overview da Percona

Atualmente, as plataformas suportadas disponíveis para este operador são:

  • OpenShift 3.11
  • OpenShift 4.5
  • Google Kubernetes Engine (GKE) 1.15 - 1.17
  • Amazon Elastic Container Service for Kubernetes (EKS) 1.15
  • Minikube 1.10
  • VMWare Tanzu

Outras plataformas Kubernetes também podem funcionar, mas não foram testadas.

Limites de recursos

Um cluster que executa uma plataforma com suporte oficial contém pelo menos três nós, com os seguintes recursos:

  • 2 GB de RAM
  • 2 threads de CPU por provisionamento do Node for Pods
  • pelo menos 60 GB de armazenamento disponível para provisionamento de volumes privados

Restrições de segurança e/ou restrições

O Kubernetes funciona como ao criar Pods, cada Pod possui um endereço IP na rede virtual interna do cluster. Criar ou destruir pods são processos dinâmicos, portanto, não é recomendável vincular seus pods a endereços IP específicos atribuídos para comunicação entre pods. Isso pode causar problemas à medida que as coisas mudam ao longo do tempo como resultado do dimensionamento do cluster, erros inadvertidos,  interrupção ou desastres de CC, ou manutenção periódica etc. Nesse caso, o operador recomenda estritamente que você se conecte ao Percona Server para MongoDB por meio do Kubernetes interno Nomes DNS em URI (por exemplo, mongodb+srv://userAdmin:[email protected]-rs0..svc.cluster.local/admin?replicaSet=rs0&ssl=false).

Este operador PSMDB Kubernetes também usa afinidade/antiafinidade que fornece restrições para que seus pods possam ser agendados para execução ou iniciados em um nó específico. A afinidade define pods qualificados que podem ser agendados no nó que já possui pods com rótulos específicos. A antiafinidade define os pods que não são qualificados. Essa abordagem reduz custos, garantindo que vários pods com troca intensiva de dados ocupem a mesma zona de disponibilidade ou mesmo o mesmo nó ou, pelo contrário, distribuam os pods em diferentes nós ou até diferentes zonas de disponibilidade para fins de alta disponibilidade e balanceamento. Embora o operador encoraje você a definir afinidade/anti-afinidade, isso tem limitações ao usar o Minikube.

Ao usar o Minikube, ele tem as seguintes limitações específicas da plataforma. O Minikube não oferece suporte a configurações de cluster de vários nós devido à sua natureza local, que está em conflito com os requisitos de afinidade padrão do Operador. Para fazer isso, a instrução Instalar Servidor Percona para MongoDB no Minikube inclui uma etapa adicional que desativa o requisito de não ter menos de três nós.

Na seção a seguir deste blog, configuraremos o PMSDB Kubernetes Operator usando o Minikube e seguiremos a antiafinidade definida para fazê-lo funcionar. Como isso difere do uso de antiafinidade, se você alterar o AntiAffinity, estará aumentando os riscos de disponibilidade do cluster. Digamos que, se seu objetivo principal de implantar seu PSMDB em um ambiente em contêiner é espalhar e ter maior disponibilidade e escalabilidade, isso pode anular o objetivo. No entanto, é possível usar o Minikube especialmente no local e testar sua configuração do PSMDB, mas para cargas de trabalho de produção, você certamente deseja executar nós em hosts separados ou em uma configuração de ambiente que, de certa forma, seja improvável que ocorra uma falha simultânea de vários pods.

Dados em trânsito/dados em repouso

Para segurança de dados com PSMDB, a operadora oferece TLS/SSL para trânsito e também oferece criptografia quando os dados estão em repouso. Para em trânsito, as opções que você pode escolher são usar o cert-manager ou gerar seu próprio certificado manualmente. Claro, você pode usar opcionalmente o PSMDB sem TLS para este operador. Confira a documentação deles com relação ao uso do TLS.

Para dados em repouso, ele requer alterações em seu PSMDB Kubernetes Operator após o download da ramificação do github e, em seguida, aplique as alterações no arquivo deploy/cr.yaml. Para habilitar isso, faça o seguinte, conforme sugerido pela documentação:

  • A chave security.enableEncryption deve ser definida como true (o valor padrão).
  • A chave security.encryptionCipherMode deve especificar o modo de codificação adequado para descriptografia. O valor pode ser uma das duas variantes a seguir:
    • AES256-CBC (o padrão para o Operador e o Servidor Percona para MongoDB)
    • AES256-GCM
security.encryptionKeySecret should specify a secret object with the encryption key:

mongod:

  ...

  security:

    ...

    encryptionKeySecret: my-cluster-name-mongodb-encryption-key

O segredo da chave de criptografia será criado automaticamente se não existir. Se você quiser criá-lo você mesmo, leve em consideração que a chave deve ser uma string de 32 caracteres codificada em base64.

Armazenando informações confidenciais

O PSMDB Kubernetes Operator usa Kubernetes Secrets para armazenar e gerenciar informações confidenciais. Os segredos do Kubernetes permitem armazenar e gerenciar informações confidenciais, como senhas, tokens OAuth e chaves ssh. Armazenar informações confidenciais em um segredo é mais seguro e flexível do que colocá-las literalmente em uma definição de pod ou em uma imagem de contêiner.

Para este operador, o usuário e as senhas geradas para seus pods são armazenados e podem ser obtidos usando kubectl get secrets -o yaml definido em seu deploy/cr.yaml .

Para este blog, minha configuração de exemplo atinge o seguinte com o resultado base64 decodificado.

 kubectl get secrets mongodb-cluster-s9s-secrets -o yaml | egrep '^\s+MONGODB.*'|cut -d ':' -f2 | xargs -I% sh -c "echo % | base64 -d; echo "

WrDry6bexkCPOY5iQ

backup

gAWBKkmIQsovnImuKyl

clusterAdmin

qHskMMseNqU8DGbo4We

clusterMonitor

TQBEV7rtE15quFl5

userAdmin

Cada entrada para backup, usuário de cluster, usuário de monitor de cluster e usuário para uso administrativo mostra com base no resultado acima.

Outra coisa também é que, o PSMDB Kubernetes Operator armazena também o acesso AWS S3 e as chaves secretas através do Kubernetes Secrets.

Backups

Este operador suporta backups, que é um recurso muito bacana. Ele suporta backup sob demanda (manual) e backup agendado e usa a ferramenta de backup Percona Backup for MongoDB. Observe que os backups são armazenados apenas no AWS S3 ou em qualquer armazenamento compatível com S3.

Os backups agendados podem ser definidos por meio do arquivo deploy/cr.yaml, enquanto o backup manual pode ser feito a qualquer momento, sempre que a demanda for necessária. Para acesso S3 e chaves secretas, ele deve ser definido no arquivo deploy/backup-s3.yaml e usa Kubernetes Secrets para armazenar as informações a seguir, conforme mencionamos anteriormente.

Todas as ações com suporte para este PSMDB Kubernetes Operator são as seguintes:

  • Fazer backups agendados
  • Fazer backup sob demanda
  • Restaure o cluster de um backup salvo anteriormente
  • Excluir o backup desnecessário

Usando o operador PSMDB Kubernetes com o Minikube

Nesta seção, manteremos uma configuração simples usando Kubernetes com Minikube, que você pode usar no local sem a necessidade de um provedor de nuvem. Para configuração nativa da nuvem, especialmente para um ambiente mais corporativo e de nível de produção, você pode fazer o check-out da documentação.

Antes de prosseguirmos com as etapas, lembre-se de que, conforme mencionado acima, houve uma limitação conhecida com o Minikube, pois ele não suporta configuração de cluster de vários nós que está em conflito com os requisitos de afinidade padrão do operador. Vamos mencionar isso sobre como lidar com isso nas etapas a seguir.

Para este blog, o sistema operacional host onde nosso Minikube será instalado é o Ubuntu 18.04 (Bionic Beaver).

Vamos instalar o Minikube

$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb

$ sudo dpkg -i minikube_latest_amd64.deb

Opcionalmente, você pode seguir as etapas aqui se estiver em sistemas Linux diferentes.

Vamos adicionar a chave necessária para autenticar nossos pacotes Kubernetes e configurar o repositório
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

$ cat <<eof > /etc/apt/sources.list.d/kubernetes.list

deb https://apt.kubernetes.io/ kubernetes-xenial main

deb https://apt.kubernetes.io/ kubernetes-yakkety main

eof

Agora vamos instalar os pacotes necessários
$ sudo apt-get update

$ sudo apt-get install kubelet kubeadm kubectl

Inicie o Minikube definindo a memória, o número de CPUs e o CIDR para os quais meus nós devem ser atribuídos,
$ minikube start --memory=4096 --cpus=3 --extra-config=kubeadm.pod-network-cidr=192.168.0.0/16

Os resultados do exemplo mostram como,
minikube v1.14.2 on Ubuntu 18.04

Automatically selected the docker driver

docker is currently using the aufs storage driver, consider switching to overlay2 for better performance

Starting control plane node minikube in cluster minikube

Creating docker container (CPUs=3, Memory=4096MB) ...

Preparing Kubernetes v1.19.2 on Docker 19.03.8 ...

kubeadm.pod-network-cidr=192.168.0.0/16

 > kubeadm.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s

 > kubectl.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s

 > kubelet.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s

 > kubeadm: 37.30 MiB / 37.30 MiB [---------------] 100.00% 1.46 MiB p/s 26s

 > kubectl: 41.01 MiB / 41.01 MiB [---------------] 100.00% 1.37 MiB p/s 30s

 > kubelet: 104.88 MiB / 104.88 MiB [------------] 100.00% 1.53 MiB p/s 1m9s

Verifying Kubernetes components...

Enabled addons: default-storageclass, storage-provisioner

Done! kubectl is now configured to use "minikube" by default

Como você notou, ele também instala as ferramentas utilitárias para gerenciar e administrar seus nós ou pods.

Agora, vamos verificar os nós e pods executando os seguintes comandos,
$ kubectl get pods -A

NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE

kube-system   coredns-f9fd979d6-gwngd            1/1     Running   0          45s

kube-system   etcd-minikube                      0/1     Running   0          53s

kube-system   kube-apiserver-minikube            1/1     Running   0          53s

kube-system   kube-controller-manager-minikube   0/1     Running   0          53s

kube-system   kube-proxy-m25hm                   1/1     Running   0          45s

kube-system   kube-scheduler-minikube            0/1     Running   0          53s

kube-system   storage-provisioner                1/1     Running   1          57s

$ kubectl get nodes -owide

NAME       STATUS   ROLES    AGE    VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION      CONTAINER-RUNTIME

minikube   Ready    master   2d4h   v1.19.2   192.168.49.2   <none>        Ubuntu 20.04 LTS   4.15.0-20-generic   docker://19.3.8

Agora, baixe o PSMDB Kubernetes Operator,
$ git clone -b v1.5.0 https://github.com/percona/percona-server-mongodb-operator

$ cd percona-server-mongodb-operator

Agora estamos prontos para implantar o operador,
$ kubectl apply -f deploy/bundle.yaml

Como mencionado anteriormente, as limitações do Minikube requerem ajustes para que as coisas funcionem conforme o esperado. Vamos fazer o seguinte:

  • Dependendo da sua capacidade atual de hardware, você pode alterar o seguinte conforme sugerido pela documentação. Como o minikube é executado localmente, o arquivo deploy/cr.yaml padrão deve ser editado para adaptar o Operator para a instalação local com recursos limitados. Altere as seguintes chaves na seção de replsets:
    • comente as chaves resources.requests.memory e resources.requests.cpu (isso se ajustará ao operador nas limitações padrão do minikube)
    • defina a chave de afinidade.antiAffinityTopologyKey como "none" (o operador não poderá espalhar o cluster em vários nós)
  • Além disso, alterne a chave allowUnsafeConfigurations para true (esta opção desativa o controle do operador sobre a configuração do cluster, tornando possível implantar o Percona Server para MongoDB como um cluster de um nó).

Agora, estamos prontos para aplicar as alterações feitas no arquivo deploy/cr.yaml.

$ kubectl apply -f deploy/cr.yaml

Neste ponto, você poderá verificar o status dos pods e observará o seguinte progresso, como abaixo,
$ kubectl get pods

NAME                                              READY   STATUS              RESTARTS   AGE

percona-server-mongodb-operator-588db759d-qjv29   0/1     ContainerCreating   0          15s



$ kubectl get pods

NAME                                              READY   STATUS     RESTARTS   AGE

mongodb-cluster-s9s-rs0-0                         0/2     Init:0/1   0          4s

percona-server-mongodb-operator-588db759d-qjv29   1/1     Running    0          34s



$ kubectl get pods

NAME                                              READY   STATUS            RESTARTS   AGE

mongodb-cluster-s9s-rs0-0                         0/2     PodInitializing   0          119s

percona-server-mongodb-operator-588db759d-qjv29   1/1     Running           0          2m29s



kubectl get pods

NAME                                              READY   STATUS            RESTARTS   AGE

mongodb-cluster-s9s-rs0-0                         0/2     PodInitializing   0          2m1s

percona-server-mongodb-operator-588db759d-qjv29   1/1     Running           0          2m31s



kubectl get pods

NAME                                              READY   STATUS    RESTARTS   AGE

mongodb-cluster-s9s-rs0-0                         2/2     Running   0          33m

mongodb-cluster-s9s-rs0-1                         2/2     Running   1          31m

mongodb-cluster-s9s-rs0-2                         2/2     Running   0          30m

percona-server-mongodb-operator-588db759d-qjv29   1/1     Running   0          33m

Agora que estamos quase lá. Obteremos os segredos gerados pelo operador para que possamos nos conectar aos pods PSMDB criados. Para fazer isso, você precisa listar os objetos secretos primeiro e, em seguida, obter o valor do yaml para obter a combinação de usuário/senha. Por outro lado, você pode usar o comando combinado abaixo com o formato nome de usuário:senha. Veja o exemplo abaixo,
$ kubectl get secrets

NAME                                          TYPE                                  DATA   AGE

default-token-c8frr                           kubernetes.io/service-account-token   3      2d4h

internal-mongodb-cluster-s9s-users            Opaque                                8      2d4h

mongodb-cluster-s9s-mongodb-encryption-key    Opaque                                1      2d4h

mongodb-cluster-s9s-mongodb-keyfile           Opaque                                1      2d4h

mongodb-cluster-s9s-secrets                   Opaque                                8      2d4h

percona-server-mongodb-operator-token-rbzbc   kubernetes.io/service-account-token   3      2d4h



$ kubectl get secrets mongodb-cluster-s9s-secrets -o yaml | egrep '^\s+MONGODB.*'|cut -d ':' -f2 | xargs -I% sh -c "echo % | base64 -d; echo" |sed 'N; s/\(.*\)\n\(.*\)/

\2:\1/'

backup:WrDry6bexkCPOY5iQ

clusterAdmin:gAWBKkmIQsovnImuKyl

clusterMonitor:qHskMMseNqU8DGbo4We

userAdmin:TQBEV7rtE15quFl5

Agora, você pode basear o formato nome de usuário:senha e salvá-lo em algum lugar seguro.

Como não podemos nos conectar diretamente aos nós do Percona Server for MongoDB, precisamos criar um novo pod que tenha o cliente mongodb,
$ kubectl run -i --rm --tty percona-client --image=percona/percona-server-mongodb:4.2.8-8 --restart=Never -- bash -il

Por fim, agora estamos prontos para nos conectar aos nossos nós PSMDB agora,
bash-4.2$ mongo "mongodb+srv://userAdmin:[email protected]/admin?replicaSet=rs0&ssl=false"

Como alternativa, você pode se conectar aos nós individuais e verificar sua integridade. Por exemplo,
bash-4.2$ mongo --host "mongodb://clusterAdmin:[email protected]:27017/?authSource=admin&ssl=false"

Percona Server for MongoDB shell version v4.2.8-8

connecting to: mongodb://mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb&ssl=false

Implicit session: session { "id" : UUID("9b29b9b3-4f82-438d-9857-eff145be0ee6") }

Percona Server for MongoDB server version: v4.2.8-8

Welcome to the Percona Server for MongoDB shell.

For interactive help, type "help".

For more comprehensive documentation, see

        https://www.percona.com/doc/percona-server-for-mongodb

Questions? Try the support group

        https://www.percona.com/forums/questions-discussions/percona-server-for-mongodb

2020-11-09T07:41:59.172+0000 I  STORAGE  [main] In File::open(), ::open for '/home/mongodb/.mongorc.js' failed with No such file or directory

Server has startup warnings:

2020-11-09T06:41:16.838+0000 I  CONTROL  [initandlisten] ** WARNING: While invalid X509 certificates may be used to

2020-11-09T06:41:16.838+0000 I  CONTROL  [initandlisten] **          connect to this server, they will not be considered

2020-11-09T06:41:16.838+0000 I  CONTROL  [initandlisten] **          permissible for authentication.

2020-11-09T06:41:16.838+0000 I  CONTROL  [initandlisten]

rs0:SECONDARY> rs.status()

{

        "set" : "rs0",

        "date" : ISODate("2020-11-09T07:42:04.984Z"),

        "myState" : 2,

        "term" : NumberLong(5),

        "syncingTo" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",

        "syncSourceHost" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",

        "syncSourceId" : 0,

        "heartbeatIntervalMillis" : NumberLong(2000),

        "majorityVoteCount" : 2,

        "writeMajorityCount" : 2,

        "optimes" : {

                "lastCommittedOpTime" : {

                        "ts" : Timestamp(1604907723, 4),

                        "t" : NumberLong(5)

                },

                "lastCommittedWallTime" : ISODate("2020-11-09T07:42:03.395Z"),

                "readConcernMajorityOpTime" : {

                        "ts" : Timestamp(1604907723, 4),

                        "t" : NumberLong(5)

                },

                "readConcernMajorityWallTime" : ISODate("2020-11-09T07:42:03.395Z"),

                "appliedOpTime" : {

                        "ts" : Timestamp(1604907723, 4),

                        "t" : NumberLong(5)

                },

                "durableOpTime" : {

                        "ts" : Timestamp(1604907723, 4),

                        "t" : NumberLong(5)

                },

                "lastAppliedWallTime" : ISODate("2020-11-09T07:42:03.395Z"),

                "lastDurableWallTime" : ISODate("2020-11-09T07:42:03.395Z")

        },

        "lastStableRecoveryTimestamp" : Timestamp(1604907678, 3),

        "lastStableCheckpointTimestamp" : Timestamp(1604907678, 3),

        "members" : [

                {

                        "_id" : 0,

                        "name" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",

                        "health" : 1,

                        "state" : 1,

                        "stateStr" : "PRIMARY",

                        "uptime" : 3632,

                        "optime" : {

                                "ts" : Timestamp(1604907723, 4),

                                "t" : NumberLong(5)

                        },

                        "optimeDurable" : {

                                "ts" : Timestamp(1604907723, 4),

                                "t" : NumberLong(5)

                        },

                       "optimeDate" : ISODate("2020-11-09T07:42:03Z"),

                        "optimeDurableDate" : ISODate("2020-11-09T07:42:03Z"),

                        "lastHeartbeat" : ISODate("2020-11-09T07:42:04.246Z"),

                        "lastHeartbeatRecv" : ISODate("2020-11-09T07:42:03.162Z"),

                        "pingMs" : NumberLong(0),

                        "lastHeartbeatMessage" : "",

                        "syncingTo" : "",

                        "syncSourceHost" : "",

                        "syncSourceId" : -1,

                        "infoMessage" : "",

                        "electionTime" : Timestamp(1604904092, 1),

                        "electionDate" : ISODate("2020-11-09T06:41:32Z"),

                        "configVersion" : 3

                },

                {

                        "_id" : 1,

                        "name" : "mongodb-cluster-s9s-rs0-1.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" : "SECONDARY",

                        "uptime" : 3632,

                        "optime" : {

                                "ts" : Timestamp(1604907723, 4),

                                "t" : NumberLong(5)

                        },

                        "optimeDurable" : {

                                "ts" : Timestamp(1604907723, 4),

                                "t" : NumberLong(5)

                        },

                        "optimeDate" : ISODate("2020-11-09T07:42:03Z"),

                        "optimeDurableDate" : ISODate("2020-11-09T07:42:03Z"),

                        "lastHeartbeat" : ISODate("2020-11-09T07:42:04.244Z"),

                        "lastHeartbeatRecv" : ISODate("2020-11-09T07:42:04.752Z"),

                        "pingMs" : NumberLong(0),

                        "lastHeartbeatMessage" : "",

                        "syncingTo" : "mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",

                        "syncSourceHost" : "mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",

                        "syncSourceId" : 2,

                        "infoMessage" : "",

                        "configVersion" : 3

                },

                {

                        "_id" : 2,

                        "name" : "mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" : "SECONDARY",

                        "uptime" : 3651,

                        "optime" : {

                                "ts" : Timestamp(1604907723, 4),

                                "t" : NumberLong(5)

                        },

                        "optimeDate" : ISODate("2020-11-09T07:42:03Z"),

                        "syncingTo" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",

                        "syncSourceHost" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",

                        "syncSourceId" : 0,

                        "infoMessage" : "",

                        "configVersion" : 3,

                        "self" : true,

                        "lastHeartbeatMessage" : ""

                }

        ],

        "ok" : 1,

        "$clusterTime" : {

                "clusterTime" : Timestamp(1604907723, 4),

                "signature" : {

                        "hash" : BinData(0,"HYC0i49c+kYdC9M8KMHgBdQW1ac="),

                        "keyId" : NumberLong("6892206918371115011")

                }

        },

        "operationTime" : Timestamp(1604907723, 4)

}

Uma vez que o operador gerencia a consistência do cluster, sempre que uma falha ou digamos que um pod foi excluído. O operador iniciará automaticamente um novo. Por exemplo,
$ kubectl get po

NAME                                              READY   STATUS    RESTARTS   AGE

mongodb-cluster-s9s-rs0-0                         2/2     Running   0          2d5h

mongodb-cluster-s9s-rs0-1                         2/2     Running   0          2d5h

mongodb-cluster-s9s-rs0-2                         2/2     Running   0          2d5h

percona-client                                    1/1     Running   0          3m7s

percona-server-mongodb-operator-588db759d-qjv29   1/1     Running   0          2d5h

$ kubectl delete po mongodb-cluster-s9s-rs0-1

pod "mongodb-cluster-s9s-rs0-1" deleted

$ kubectl get po

NAME                                              READY   STATUS     RESTARTS   AGE

mongodb-cluster-s9s-rs0-0                         2/2     Running    0          2d5h

mongodb-cluster-s9s-rs0-1                         0/2     Init:0/1   0          3s

mongodb-cluster-s9s-rs0-2                         2/2     Running    0          2d5h

percona-client                                    1/1     Running    0          3m29s

percona-server-mongodb-operator-588db759d-qjv29   1/1     Running    0          2d5h

$ kubectl get po

NAME                                              READY   STATUS            RESTARTS   AGE

mongodb-cluster-s9s-rs0-0                         2/2     Running           0          2d5h

mongodb-cluster-s9s-rs0-1                         0/2     PodInitializing   0          10s

mongodb-cluster-s9s-rs0-2                         2/2     Running           0          2d5h

percona-client                                    1/1     Running           0          3m36s

percona-server-mongodb-operator-588db759d-qjv29   1/1     Running           0          2d5h

$ kubectl get po

NAME                                              READY   STATUS    RESTARTS   AGE

mongodb-cluster-s9s-rs0-0                         2/2     Running   0          2d5h

mongodb-cluster-s9s-rs0-1                         2/2     Running   0          26s

mongodb-cluster-s9s-rs0-2                         2/2     Running   0          2d5h

percona-client                                    1/1     Running   0          3m52s

percona-server-mongodb-operator-588db759d-qjv29   1/1     Running   0          2d5h

Agora que estamos todos prontos. Claro, pode ser necessário expor a porta para que você precise lidar com ajustes em deploy/cr.yaml. Você pode consultar aqui para lidar com isso.

Conclusão

O Operador Percona Kubernetes para PSMDB pode ser sua solução completa especialmente para ambientes em contêiner para sua configuração do Percona Server para MongoDB. É uma solução quase completa, pois possui redundância integrada para seu conjunto de réplicas, mas o operador oferece suporte a backup, escalabilidade, alta disponibilidade e segurança.