sql >> Base de Datos >  >> NoSQL >> MongoDB

Una descripción general del operador Percona MongoDB Kubernetes

MongoDB y Kubernetes es una gran combinación, especialmente en lo que respecta a la complejidad. Sin embargo, MongoDB (PSMDB) de Percona ofrece más flexibilidad para la base de datos NoSQL y también viene con herramientas que son eficientes para la productividad actual; no solo local, sino también disponible para nativos de la nube.

La tasa de adopción de Kubernetes aumenta constantemente. Es razonable que una tecnología deba tener un operador para hacer lo siguiente:creación, modificación y eliminación de elementos Percona Server para ambiente MongoDB. El operador Kubernetes de Percona MongoDB contiene la configuración necesaria de k8s para mantener un servidor Percona coherente para una instancia de MongoDB. Como opción alternativa, puede comparar esto con https://github.com/kubedb/mongodb, pero KubeDB para MongoDB ofrece opciones muy limitadas para ofrecer, especialmente en sistemas de grado de producción.

Los operadores de Percona Kubernetes que cuentan con su configuración se basan y siguen las mejores prácticas para la configuración del conjunto de réplicas de PSMDB. Lo que más importa, el propio operador de MongoDB proporciona muchos beneficios, pero el ahorro de tiempo y un entorno coherente son los más importantes. En este blog, veremos una descripción general de cómo esto es beneficioso, especialmente en un entorno en contenedores.

¿Qué puede ofrecer este operador?

Este operador es útil para PSMDB que utiliza un conjunto de réplicas. Esto significa que la arquitectura de diseño de su base de datos debe cumplir con el siguiente diagrama a continuación

Imagen tomada de Percona's Documentation Design Overview

Imagen tomada de Percona's Documentation Design Overview

Actualmente, las plataformas compatibles disponibles para este operador son:

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

Otras plataformas de Kubernetes también pueden funcionar, pero no se han probado.

Límites de recursos

Un clúster que ejecuta una plataforma compatible oficialmente contiene al menos tres nodos, con los siguientes recursos:

  • 2 GB de RAM
  • 2 subprocesos de CPU por nodo para el aprovisionamiento de pods
  • al menos 60 GB de almacenamiento disponible para el aprovisionamiento de volúmenes privados

Seguridad y/o Restricciones Restricciones

El Kubernetes funciona como al crear Pods, cada Pod tiene una dirección IP en la red virtual interna del clúster. Tanto la creación como la destrucción de pods son procesos dinámicos, por lo que no es recomendable vincular sus pods a direcciones IP específicas asignadas para la comunicación entre pods. Esto puede causar problemas a medida que las cosas cambian con el tiempo como resultado de la escala del clúster, errores involuntarios, cortes de CC o desastres, o mantenimiento periódico, etc. En ese caso, el operador recomienda estrictamente que se conecte a Percona Server para MongoDB a través de Kubernetes interno. Nombres DNS en URI (por ejemplo, mongodb+srv://userAdmin:[email protected]-rs0..svc.cluster.local/admin?replicaSet=rs0&ssl=false).

Este operador de Kubernetes de PSMDB también utiliza afinidad/antiafinidad, lo que proporciona restricciones según las cuales sus pods pueden programarse para ejecutarse o iniciarse en un nodo específico. Affinity define pods elegibles que se pueden programar en el nodo que ya tiene pods con etiquetas específicas. La antiafinidad define los pods que no son elegibles. Este enfoque reduce los costos al garantizar que varios pods con un intercambio intensivo de datos ocupen la misma zona de disponibilidad o incluso el mismo nodo o, por el contrario, distribuir los pods en diferentes nodos o incluso en diferentes zonas de disponibilidad para fines de alta disponibilidad y equilibrio. Aunque el operador lo alienta a establecer afinidad/antiafinidad, esto tiene limitaciones cuando se usa Minikube.

Al usar Minikube, tiene las siguientes limitaciones específicas de la plataforma. Minikube no admite configuraciones de clúster de varios nodos debido a su naturaleza local, que choca con los requisitos de afinidad predeterminados del operador. Para arreglar esto, la instrucción Install Percona Server for MongoDB on Minikube incluye un paso adicional que desactiva el requisito de tener no menos de tres nodos.

En la siguiente sección de este blog, configuraremos el operador Kubernetes de PMSDB usando Minikube y seguiremos la configuración anti-afinidad para que funcione. ¿En qué se diferencia esto del uso de antiafinidad? Si cambia AntiAffinity, aumenta los riesgos para la disponibilidad del clúster. Digamos que si su propósito principal de implementar su PSMDB en un entorno en contenedores es expandirse y tener una mayor disponibilidad pero escalabilidad, entonces esto podría frustrar el propósito. Sin embargo, usar Minikube especialmente en las instalaciones y para probar su configuración de PSMDB es factible, pero para las cargas de trabajo de producción seguramente querrá ejecutar nodos en hosts separados, o en una configuración de entorno tal que, de alguna manera, es poco probable que ocurra una falla simultánea de varios pods.

Datos en tránsito/Datos en reposo

Para la seguridad de los datos con PSMDB, el operador ofrece TLS/SSL en tránsito, luego también ofrece cifrado cuando los datos están en reposo. En tránsito, las opciones que puede elegir son usar cert-manager o generar su propio certificado manualmente. Por supuesto, opcionalmente puede usar PSMDB sin TLS para este operador. Consulte su documentación con respecto al uso de TLS.

Para los datos en reposo, requiere cambios dentro de su Operador de Kubernetes de PSMDB después de descargar la rama de github y luego aplicar los cambios en el archivo deployment/cr.yaml. Para habilitar esto, haga lo siguiente como se sugiere en la documentación:

  • La clave security.enableEncryption debe establecerse en verdadero (el valor predeterminado).
  • La clave security.encryptionCipherMode debe especificar el modo de cifrado adecuado para el descifrado. El valor puede ser una de las siguientes dos variantes:
    • AES256-CBC (el predeterminado para el Operador y el 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

El secreto de la clave de cifrado se creará automáticamente si no existe. Si quieres crearlo tú mismo, ten en cuenta que la clave debe ser una cadena de 32 caracteres codificada en base64.

Almacenamiento de información confidencial

El operador de Kubernetes de PSMDB utiliza secretos de Kubernetes para almacenar y administrar información confidencial. Los secretos de Kubernetes le permiten almacenar y administrar información confidencial, como contraseñas, tokens de OAuth y claves ssh. Almacenar información confidencial en un secreto es más seguro y más flexible que ponerla palabra por palabra en una definición de pod o en una imagen de contenedor.

Para este operador, el usuario y las contraseñas generadas para sus pods se almacenan y se pueden obtener utilizando kubectl get secrets -o yaml establecido en su deployment/cr.yaml .

Para este blog, mi configuración de ejemplo logra lo siguiente con el 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 copia de seguridad, usuario de clúster, usuario de monitor de clúster y usuario para uso administrativo se muestra según el resultado anterior.

Otra cosa también es que, PSMDB Kubernetes Operator almacena también las claves secretas y de acceso de AWS S3 a través de Kubernetes Secrets.

Copias de seguridad

Este operador admite copias de seguridad, lo cual es una característica muy ingeniosa. Admite copias de seguridad bajo demanda (manuales) y copias de seguridad programadas y utiliza la herramienta de copia de seguridad Percona Backup para MongoDB. Tenga en cuenta que las copias de seguridad solo se almacenan en AWS S3 o en cualquier almacenamiento compatible con S3.

Las copias de seguridad programadas se pueden definir a través del archivo deployment/cr.yaml, mientras que se puede realizar una copia de seguridad manual en cualquier momento cuando sea necesario. Para las claves secretas y de acceso de S3, debe definirse en el archivo deployment/backup-s3.yaml y utiliza Kubernetes Secrets para almacenar la siguiente información, como mencionamos anteriormente.

Todas las acciones compatibles con este operador de Kubernetes de PSMDB son las siguientes:

  • Realización de copias de seguridad programadas
  • Realización de copias de seguridad a pedido
  • Restaurar el clúster a partir de una copia de seguridad guardada previamente
  • Eliminar la copia de seguridad innecesaria

Uso del operador Kubernetes de PSMDB con Minikube

En esta sección, mantendremos una configuración simple usando Kubernetes con Minikube, que puede usar localmente sin necesidad de un proveedor de nube. Para la configuración nativa de la nube, especialmente para un entorno más empresarial y de grado de producción, puede consultar su documentación.

Antes de continuar con los pasos, tenga en cuenta que, como se mencionó anteriormente, ha habido una limitación conocida con Minikube, ya que no es compatible con la configuración de clúster de varios nodos, lo que choca con los requisitos de afinidad predeterminados del operador. Mencionaremos esto sobre cómo manejarlo en los siguientes pasos a continuación.

Para este blog, el sistema operativo host donde se instalará nuestro Minikube es Ubuntu 18.04 (Bionic Beaver).

Instalemos Minikube

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

$ sudo dpkg -i minikube_latest_amd64.deb

Opcionalmente, puede seguir los pasos aquí si está en diferentes sistemas Linux.

Agreguemos la clave requerida para autenticar nuestros paquetes de Kubernetes y configurar el repositorio

$ 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

Ahora instalemos los paquetes necesarios

$ sudo apt-get update

$ sudo apt-get install kubelet kubeadm kubectl

Inicie el Minikube definiendo la memoria, el número de CPU y el CIDR para el que se asignarán mis nodos,

$ minikube start --memory=4096 --cpus=3 --extra-config=kubeadm.pod-network-cidr=192.168.0.0/16

Los resultados del ejemplo muestran 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 notó, también instala las herramientas de utilidad para administrar y administrar sus nodos o pods.

Ahora, verifiquemos los nodos y los pods ejecutando los siguientes 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

Ahora, descargue el operador PSMDB Kubernetes,

$ git clone -b v1.5.0 https://github.com/percona/percona-server-mongodb-operator

$ cd percona-server-mongodb-operator

Ahora estamos listos para implementar el operador,

$ kubectl apply -f deploy/bundle.yaml

Como se mencionó anteriormente, las limitaciones de Minikube requieren ajustes para que las cosas funcionen como se espera. Hagamos lo siguiente:

  • Dependiendo de la capacidad de su hardware actual, puede cambiar lo siguiente como se sugiere en la documentación. Dado que minikube se ejecuta localmente, el archivo deployment/cr.yaml predeterminado debe editarse para adaptar el Operador para la instalación local con recursos limitados. Cambie las siguientes claves en la sección replsets:
    • comente las claves resources.requests.memory y resources.requests.cpu (esto se ajustará al operador en las limitaciones predeterminadas de minikube)
    • establezca la clave affinity.antiAffinityTopologyKey en "ninguno" (el operador no podrá distribuir el clúster en varios nodos)
  • Además, cambie la clave allowUnsafeConfigurations a verdadero (esta opción desactiva el control del operador sobre la configuración del clúster, lo que hace posible implementar Percona Server para MongoDB como un clúster de un nodo).

Ahora, estamos listos para aplicar los cambios realizados en el archivo deployment/cr.yaml.

$ kubectl apply -f deploy/cr.yaml

En este punto, es posible que pueda verificar el estado de los pods y notará el siguiente progreso como se muestra a continuación:

$ 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

Ahora que ya casi llegamos. Obtendremos los secretos generados por el operador para que podamos conectarnos a los pods de PSMDB creados. Para hacer eso, primero debe enumerar los objetos secretos, luego obtener el valor del yaml para que pueda obtener la combinación de usuario/contraseña. Por otro lado, puede usar el comando combinado a continuación con el formato de nombre de usuario:contraseña. Vea el ejemplo a continuación,

$ 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

Ahora, puede basar el nombre de usuario:formato de contraseña y guardarlo en algún lugar seguro.

Dado que no podemos conectarnos directamente al servidor Percona para los nodos MongoDB, necesitamos crear un nuevo pod que tenga el cliente mongodb,

$ kubectl run -i --rm --tty percona-client --image=percona/percona-server-mongodb:4.2.8-8 --restart=Never -- bash -il

Por último, ahora estamos listos para conectarnos a nuestros nodos PSMDB ahora,

bash-4.2$ mongo "mongodb+srv://userAdmin:[email protected]/admin?replicaSet=rs0&ssl=false"

Alternativamente, puede conectarse a los nodos individuales y verificar su salud. Por ejemplo,

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)

}

Dado que el operador administra la consistencia del clúster, cada vez que se elimina una falla o, digamos, un pod. El operador iniciará automáticamente uno nuevo. Por ejemplo,

$ 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

Ahora que estamos listos. Por supuesto, es posible que deba exponer el puerto, por lo que es posible que tenga que lidiar con los ajustes en deployment/cr.yaml. Puede consultar aquí para solucionarlo.

Conclusión

Percona Kubernetes Operator para PSMDB puede ser su solución completa, especialmente para entornos en contenedores para su configuración de Percona Server para MongoDB. Es casi una solución completa, ya que tiene redundancia integrada para su conjunto de réplicas, pero el operador admite copias de seguridad, escalabilidad, alta disponibilidad y seguridad.