MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Présentation de l'opérateur Percona MongoDB Kubernetes

MongoDB et Kubernetes forment une excellente combinaison, en particulier en ce qui concerne la complexité. Pourtant, MongoDB (PSMDB) de Percona offre plus de flexibilité pour la base de données NoSQL, et il est également livré avec des outils efficaces pour la productivité d'aujourd'hui; non seulement sur site, mais également disponible pour les natifs du cloud.

Le taux d'adoption de Kubernetes augmente régulièrement. Il est raisonnable qu'une technologie doive avoir un opérateur pour faire ce qui suit :création, modification et suppression d'éléments Percona Server pour l'environnement MongoDB. L'opérateur Percona MongoDB Kubernetes contient les paramètres k8s nécessaires pour maintenir un serveur Percona cohérent pour une instance MongoDB. Comme option alternative, vous pouvez comparer cela à https://github.com/kubedb/mongodb mais KubeDB pour MongoDB offre des options très limitées à offrir, en particulier sur les systèmes de niveau de production.

Les opérateurs Percona Kubernetes bénéficiant de sa configuration sont basés et suivent les meilleures pratiques pour la configuration du jeu de réplicas PSMDB. Ce qui compte le plus, l'opérateur pour MongoDB lui-même offre de nombreux avantages mais le gain de temps, un environnement cohérent sont les plus importants. Dans ce blog, nous allons donner un aperçu de la façon dont cela est bénéfique, en particulier dans un environnement conteneurisé.

Que peut offrir cet opérateur ?

Cet opérateur est utile pour PSMDB utilisant un jeu de répliques. Cela signifie que l'architecture de conception de votre base de données doit être conforme au schéma ci-dessous

Image empruntée à l'aperçu de la conception de la documentation de Percona

Image empruntée à l'aperçu de la conception de la documentation de Percona

Actuellement, les plates-formes prises en charge disponibles pour cet opérateur sont :

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

D'autres plates-formes Kubernetes peuvent également fonctionner mais n'ont pas été testées.

Limites des ressources

Un cluster exécutant une plate-forme officiellement prise en charge contient au moins trois nœuds, avec les ressources suivantes :

  • 2 Go de RAM
  • 2 threads CPU par nœud pour le provisionnement des pods
  • au moins 60 Go de stockage disponible pour le provisionnement des volumes privés

Contraintes de sécurité et/ou restrictions

Le Kubernetes fonctionne comme lors de la création de Pods, chaque Pod a une adresse IP dans le réseau virtuel interne du cluster. La création ou la destruction de pods sont des processus dynamiques, il n'est donc pas recommandé de lier vos pods à des adresses IP spécifiques attribuées pour la communication entre les pods. Cela peut causer des problèmes à mesure que les choses changent avec le temps en raison de la mise à l'échelle du cluster, d'erreurs involontaires, de pannes de courant continu ou de catastrophes, ou d'une maintenance périodique, etc. Dans ce cas, l'opérateur vous recommande strictement de vous connecter à Percona Server pour MongoDB via Kubernetes interne Noms DNS dans l'URI (par exemple, mongodb+srv://userAdmin:[email protected]-rs0..svc.cluster.local/admin?replicaSet=rs0&ssl=false).

Cet opérateur Kubernetes PSMDB utilise également l'affinité/anti-affinité qui fournit des contraintes selon lesquelles vos pods peuvent être programmés pour s'exécuter ou lancés sur un nœud spécifique. L'affinité définit les pods éligibles qui peuvent être planifiés sur le nœud qui a déjà des pods avec des étiquettes spécifiques. L'anti-affinité définit les pods qui ne sont pas éligibles. Cette approche permet de réduire les coûts en s'assurant que plusieurs pods avec des échanges de données intensifs occupent la même zone de disponibilité voire le même nœud ou, au contraire, de répartir les pods sur différents nœuds voire différentes zones de disponibilité à des fins de haute disponibilité et d'équilibrage. Bien que l'opérateur vous encourage à définir l'affinité/anti-affinité, cela a des limites lors de l'utilisation de Minikube.

Lorsque vous utilisez Minikube, il présente les limitations spécifiques à la plate-forme suivantes. Minikube ne prend pas en charge les configurations de cluster multi-nœuds en raison de sa nature locale, qui est en conflit avec les exigences d'affinité par défaut de l'opérateur. Pour organiser cela, l'instruction Installer Percona Server pour MongoDB sur Minikube comprend une étape supplémentaire qui désactive l'exigence d'avoir au moins trois nœuds.

Dans la section suivante de ce blog, nous allons configurer PMSDB Kubernetes Operator à l'aide de Minikube et nous suivrons l'anti-affinité définie pour le faire fonctionner. En quoi cela diffère-t-il de l'utilisation de l'anti-affinité, si vous modifiez AntiAffinity, vous augmentez les risques pour la disponibilité du cluster. Disons que si votre objectif principal de déploiement de votre PSMDB dans un environnement conteneurisé est de se propager et d'avoir une disponibilité plus élevée mais une évolutivité, cela pourrait aller à l'encontre de l'objectif. Pourtant, utiliser Minikube en particulier sur site et pour tester votre configuration PSMDB est faisable, mais pour les charges de travail de production, vous souhaitez sûrement exécuter des nœuds sur des hôtes séparés, ou dans une configuration d'environnement telle qu'une défaillance simultanée de plusieurs pods est peu susceptible de se produire. /P>

Données en transit/Données au repos

Pour la sécurité des données avec PSMDB, l'opérateur propose TLS/SSL pour le transit, puis propose également le chiffrement lorsque les données sont au repos. Pour en transit, les options que vous pouvez choisir sont d'utiliser cert-manager ou de générer votre propre certificat manuellement. Bien sûr, vous pouvez éventuellement utiliser PSMDB sans TLS pour cet opérateur. Consultez leur documentation concernant l'utilisation de TLS.

Pour les données au repos, cela nécessite des modifications dans leur opérateur Kubernetes PSMDB après avoir téléchargé la branche github, puis appliquez les modifications sur le fichier deploy/cr.yaml. Pour l'activer, procédez comme suggéré par la documentation :

  • La clé security.enableEncryption doit être définie sur true (valeur par défaut).
  • La clé security.encryptionCipherMode doit spécifier le mode de chiffrement approprié pour le déchiffrement. La valeur peut être l'une des deux variantes suivantes :
    • AES256-CBC (celui par défaut pour l'opérateur et le serveur Percona pour MongoDB)
    • AES256-GCM
security.encryptionKeySecret should specify a secret object with the encryption key:

mongod:

  ...

  security:

    ...

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

La clé secrète de chiffrement sera créée automatiquement si elle n'existe pas. Si vous souhaitez le créer vous-même, tenez compte du fait que la clé doit être une chaîne de 32 caractères encodée en base64.

Stocker des informations sensibles

L'opérateur Kubernetes PSMDB utilise les secrets Kubernetes pour stocker et gérer les informations sensibles. Les secrets Kubernetes vous permettent de stocker et de gérer des informations sensibles, telles que des mots de passe, des jetons OAuth et des clés ssh. Stocker des informations confidentielles dans un secret est plus sûr et plus flexible que de les mettre textuellement dans une définition de pod ou dans une image de conteneur.

Pour cet opérateur, l'utilisateur et les mots de passe générés pour vos pods sont stockés et peuvent être obtenus à l'aide de kubectl get secrets -o yaml défini dans votre deploy/cr.yaml .

Pour ce blog, mon exemple de configuration réalise ce qui suit avec le résultat décodé en base64.

 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

Chaque entrée pour la sauvegarde, l'utilisateur du cluster, l'utilisateur du moniteur de cluster et l'utilisateur pour l'utilisation administrative s'affiche en fonction du résultat ci-dessus.

Une autre chose est que PSMDB Kubernetes Operator stocke également l'accès AWS S3 et les clés secrètes via Kubernetes Secrets.

Sauvegardes

Cet opérateur prend en charge les sauvegardes, ce qui est une fonctionnalité très intéressante. Il prend en charge la sauvegarde à la demande (manuelle) et la sauvegarde planifiée et utilise l'outil de sauvegarde Percona Backup pour MongoDB. Notez que les sauvegardes ne sont stockées que sur AWS S3 ou tout stockage compatible S3.

Les sauvegardes planifiées peuvent être définies via le fichier deploy/cr.yaml, tandis qu'une sauvegarde manuelle peut être effectuée à tout moment chaque fois que la demande est nécessaire. Pour l'accès S3 et les clés secrètes, elles doivent être définies dans le fichier deploy/backup-s3.yaml et utilisent les secrets Kubernetes pour stocker les informations suivantes, comme nous l'avons mentionné précédemment.

Toutes les actions prises en charge pour cet opérateur Kubernetes PSMDB sont les suivantes :

  • Effectuer des sauvegardes planifiées
  • Effectuer une sauvegarde à la demande
  • Restaurer le cluster à partir d'une sauvegarde précédemment enregistrée
  • Supprimer la sauvegarde inutile

Utilisation de l'opérateur Kubernetes PSMDB avec Minikube

Dans cette section, nous conserverons une configuration simple utilisant Kubernetes avec Minikube, que vous pouvez utiliser sur site sans avoir besoin d'un fournisseur de cloud. Pour une configuration cloud native, en particulier pour un environnement de niveau entreprise et de production, vous pouvez consulter leur documentation.

Avant de poursuivre les étapes, gardez à l'esprit que, comme mentionné ci-dessus, il existe une limitation connue avec Minikube car il ne prend pas en charge la configuration de cluster multi-nœuds qui est en conflit avec les exigences d'affinité par défaut de l'opérateur. Nous le mentionnerons sur la façon de le gérer dans les étapes suivantes ci-dessous.

Pour ce blog, l'OS hôte sur lequel notre Minikube sera installé est sur Ubuntu 18.04 (Bionic Beaver).

Installons Minikube

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

$ sudo dpkg -i minikube_latest_amd64.deb

Vous pouvez éventuellement suivre les étapes ici si vous utilisez différents systèmes Linux.

Ajoutons la clé requise pour authentifier nos packages Kubernetes et configurons le référentiel

$ 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

Installons maintenant les packages requis

$ sudo apt-get update

$ sudo apt-get install kubelet kubeadm kubectl

Démarrer le Minikube en définissant la mémoire, le nombre de CPU et le CIDR pour lesquels mes nœuds seront assignés,

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

Les résultats de l'exemple ressemblent à,

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

Comme vous l'avez remarqué, il installe également les outils utilitaires pour gérer et administrer vos nœuds ou pods.

Maintenant, vérifions les nœuds et les pods en exécutant les commandes suivantes,

$ 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

Maintenant, téléchargez l'opérateur Kubernetes PSMDB,

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

$ cd percona-server-mongodb-operator

Nous sommes maintenant prêts à déployer l'opérateur,

$ kubectl apply -f deploy/bundle.yaml

Comme mentionné précédemment, les limitations de Minikube nécessitent des ajustements pour que les choses fonctionnent comme prévu. Procédons comme suit :

  • En fonction de votre capacité matérielle actuelle, vous pouvez modifier les éléments suivants comme suggéré par la documentation. Étant donné que minikube s'exécute localement, le fichier deploy/cr.yaml par défaut doit être modifié pour adapter l'opérateur à l'installation locale avec des ressources limitées. Modifiez les clés suivantes dans la section replsets :
    • commentez les clés resources.requests.memory et resources.requests.cpu (cela conviendra à l'opérateur dans les limitations par défaut de minikube)
    • définir la clé affinity.antiAffinityTopologyKey sur "none" (l'Opérateur ne pourra pas répartir le cluster sur plusieurs nœuds)
  • En outre, réglez la clé allowUnsafeConfigurations sur true (cette option désactive le contrôle de l'opérateur sur la configuration du cluster, ce qui permet de déployer Percona Server pour MongoDB en tant que cluster à un nœud).

Maintenant, nous sommes prêts à appliquer les modifications apportées au fichier deploy/cr.yaml.

$ kubectl apply -f deploy/cr.yaml

À ce stade, vous pourrez peut-être vérifier l'état des pods et vous remarquerez la progression suivante, comme ci-dessous,

$ 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

Maintenant que nous y sommes presque. Nous obtiendrons les secrets générés par l'opérateur afin de pouvoir nous connecter aux pods PSMDB créés. Pour ce faire, vous devez d'abord lister les objets secrets, puis obtenir la valeur du yaml afin d'obtenir la combinaison utilisateur/mot de passe. D'autre part, vous pouvez utiliser la commande combinée ci-dessous avec le format nom d'utilisateur:mot de passe. Voir l'exemple ci-dessous,

$ 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

Maintenant, vous pouvez baser le format nom d'utilisateur :mot de passe et l'enregistrer quelque part en toute sécurité.

Comme nous ne pouvons pas nous connecter directement au serveur Percona pour les nœuds MongoDB, nous devons créer un nouveau pod qui a le client mongodb,

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

Enfin, nous sommes maintenant prêts à nous connecter à nos nœuds PSMDB maintenant,

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

Alternativement, vous pouvez vous connecter aux nœuds individuels et vérifier leur santé. Par exemple,

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)

}

Puisque l'opérateur gère la cohérence du cluster, chaque fois qu'une panne ou disons qu'un pod a été supprimé. L'opérateur en lancera automatiquement un nouveau. Par exemple,

$ 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

Maintenant que nous sommes prêts. Bien sûr, vous devrez peut-être exposer le port afin de devoir gérer des ajustements dans deploy/cr.yaml. Vous pouvez vous référer ici pour vous en occuper.

Conclusion

L'opérateur Percona Kubernetes pour PSMDB peut être votre solution complète, en particulier pour les environnements conteneurisés pour votre configuration Percona Server pour MongoDB. Il s'agit d'une solution presque complète car elle intègre une redondance pour votre jeu de répliques, mais l'opérateur prend en charge la sauvegarde, l'évolutivité, la haute disponibilité et la sécurité.