sql >> データベース >  >> NoSQL >> MongoDB

PerconaMongoDBKubernetesオペレーターの概要

    MongoDBとKubernetesは、特に複雑さの点で優れた組み合わせです。それでも、PerconaのMongoDB(PSMDB)は、NoSQLデータベースの柔軟性を高め、今日の生産性を高めるための効率的なツールも備えています。オンプレミスだけでなく、クラウドネイティブでも利用できます。

    Kubernetesの採用率は着実に増加しています。テクノロジーには、次のことを行うためのオペレーターが必要であることが合理的です:MongoDB環境用のPercona Serverのアイテムの作成、変更、および削除。 Percona MongoDB Kubernetes Operatorには、MongoDBインスタンスの一貫したPerconaサーバーを維持するために必要なk8s設定が含まれています。別のオプションとして、これをhttps://github.com/kubedb/mongodbと比較することもできますが、KubeDB for MongoDBは、特に実稼働グレードのシステムで提供できるオプションが非常に限られています。

    その構成を誇るPerconaKubernetesオペレーターは、PSMDBレプリカセットの構成のベストプラクティスに基づいており、それに従っています。最も重要なことは、MongoDB自体のオペレーターには多くの利点がありますが、時間を節約するために、一貫した環境が最も重要です。このブログでは、これが特にコンテナ化された環境でどのように役立つかについて概要を説明します。

    このオペレーターは何を提供できますか?

    この演算子は、レプリカセットを使用するPSMDBに役立ちます。つまり、データベース設計アーキテクチャは、以下の図に準拠している必要があります

    Perconaのドキュメントデザインの概要から借用した画像Perconaのドキュメントデザインの概要から借用した画像

    現在、このオペレーターがサポートしているプラ​​ットフォームは次のとおりです。

    • 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タンズ

    他のKubernetesプラットフォームも機能する可能性がありますが、テストされていません。

    リソースの制限

    公式にサポートされているプラ​​ットフォームを実行しているクラスターには、次のリソースを備えた少なくとも3つのノードが含まれています。

    • 2GBのRAM
    • ポッドプロビジョニング用のノードごとに2つのCPUスレッド プライベートボリュームのプロビジョニングに使用できる少なくとも60GBのストレージ
    セキュリティおよび/または制限の制約

    Kubernetesはポッドを作成するときと同じように機能し、各ポッドはクラスターの内部仮想ネットワークにIPアドレスを持っています。ポッドの作成または破棄はどちらも動的なプロセスであるため、ポッド間の通信に割り当てられた特定のIPアドレスにポッドをバインドすることはお勧めしません。これにより、クラスターのスケーリング、不注意によるミス、DCの停止や災害、定期的なメンテナンスなどの結果として、時間の経過とともに状況が変化するため、問題が発生する可能性があります。その場合、オペレーターは、Kubernetes内部経由でMongoDB用のPerconaサーバーに接続することを強くお勧めします。 URI内のDNS名(例:mongodb + srv:// userAdmin:[email protected]-rs0。.svc.cluster.local/ admin?replicaSet =rs0&ssl =false)。

    このPSMDBKubernetesオペレーターは、特定のノードでポッドを実行または開始するようにスケジュールできる制約を提供するアフィニティ/非アフィニティも使用します。アフィニティは、特定のラベルを持つポッドがすでにあるノードでスケジュールできる適格なポッドを定義します。反親和性は、適格ではないポッドを定義します。このアプローチは、集中的なデータ交換を行う複数のポッドが同じアベイラビリティーゾーンまたは同じノードを占有するようにするか、逆に、高可用性とバランシングの目的でポッドを異なるノードまたは異なるアベイラビリティーゾーンに分散させることでコストを削減します。オペレーターはアフィニティ/アンチアフィニティを設定するように勧めていますが、Minikubeを使用する場合はこれに制限があります。

    Minikubeを使用する場合、プラットフォーム固有の次の制限があります。 Minikubeは、Operatorのデフォルトのアフィニティ要件と衝突するローカルな性質のため、マルチノードクラスタ構成をサポートしていません。これを調整するために、MinikubeでのMongoDB用のPerconaサーバーのインストール手順には、3つ以上のノードを持つという要件をオフにする追加の手順が含まれています。

    このブログの次のセクションでは、Minikubeを使用してPMSDB Kubernetes Operatorをセットアップし、それを機能させるために設定された非アフィニティ性に従います。これは、アンチアフィニティを使用する場合とどのように異なりますか。アンチアフィニティを変更すると、クラスタの可用性のリスクが高まります。たとえば、PSMDBをコンテナ化された環境にデプロイする主な目的が、分散し、より高い可用性とスケーラビリティを実現することである場合、これは目的を損なう可能性があります。ただし、Minikubeを特にオンプレミスで使用し、PSMDBセットアップをテストすることは可能ですが、本番ワークロードの場合は、ノードを別々のホストで実行するか、複数のポッドの同時障害が発生する可能性が低いような環境セットアップで実行する必要があります。

    転送中のデータ/保存中のデータ

    PSMDBを使用したデータセキュリティのために、オペレーターは転送中のTLS / SSLを提供し、データが保存されているときに暗号化も提供します。転送中の場合、選択できるオプションは、cert-managerを使用するか、独自の証明書を手動で生成することです。もちろん、オプションで、このオペレーターにTLSなしでPSMDBを使用できます。 TLSの使用に関するドキュメントを確認してください。

    保存データの場合、githubブランチをダウンロードした後、PSMDB Kubernetesオペレーター内で変更を加え、deploy/cr.yamlファイルに変更を適用する必要があります。これを有効にするには、ドキュメントで提案されているように次の手順を実行します。

    • security.enableEncryptionキーはtrue(デフォルト値)に設定する必要があります。
    • security.encryptionCipherModeキーは、復号化に適切な暗号モードを指定する必要があります。値は、次の2つのバリアントのいずれかになります。
      • AES256-CBC(MongoDBのOperatorおよびPercona Serverのデフォルト)
      • AES256-GCM
    security.encryptionKeySecret should specify a secret object with the encryption key:
    
    mongod:
    
      ...
    
      security:
    
        ...
    
        encryptionKeySecret: my-cluster-name-mongodb-encryption-key

    暗号化キーシークレットが存在しない場合は、自動的に作成されます。自分で作成する場合は、キーがbase64でエンコードされた32文字の文字列である必要があることを考慮してください。

    機密情報の保存

    PSMDB Kubernetesオペレーターは、Kubernetesシークレットを使用して機密情報を保存および管理します。 Kubernetesシークレットを使用すると、パスワード、OAuthトークン、sshキーなどの機密情報を保存および管理できます。シークレットに機密情報を保存する方が、ポッド定義やコンテナイメージにそのまま保存するよりも安全で柔軟性があります。

    このオペレーターの場合、ポッド用に生成されたユーザーとパスワードが保存され、kubectl get secrets -o yaml set in your deploy/cr.yamlを使用して取得できます。 。

    このブログの場合、セットアップ例では、デコードされた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

    バックアップ、クラスターユーザー、クラスターモニターユーザー、および管理用ユーザーの各エントリは、上記の結果に基づいて表示されます。

    もう1つ、PSMDB Kubernetes Operatorは、Kubernetesシークレットを介してAWSS3アクセスキーとシークレットキーも保存します。

    バックアップ

    この演算子は、非常に優れた機能であるバックアップをサポートします。オンデマンド(手動)バックアップとスケジュールバックアップをサポートし、MongoDB用のバックアップツールPerconaBackupを使用します。バックアップはAWSS3またはS3互換のストレージにのみ保存されることに注意してください。

    スケジュールされたバックアップは、deploy / cr.yamlファイルを介して定義できますが、手動バックアップの作成は、必要なときにいつでも実行できます。 S3アクセスとシークレットキーの場合、ファイルdeploy / backup-s3.yamlファイルで定義され、前述のようにKubernetesシークレットを使用して次の情報を保存します。

    このPSMDBKubernetesオペレーターでサポートされているすべてのアクションは次のとおりです。

      スケジュールされたバックアップの作成 オンデマンドバックアップの作成 以前に保存したバックアップからクラスターを復元する 不要なバックアップを削除する

    MinikubeでPSMDBKubernetes演算子を使用する

    このセクションでは、KubernetesとMinikubeを使用した簡単なセットアップを維持します。これは、クラウドプロバイダーを必要とせずにオンプレミスで使用できます。特にエンタープライズグレードおよびプロダクショングレードの環境向けのクラウドネイティブセットアップの場合は、ドキュメントを確認してください。

    手順を進める前に、前述のように、Minikubeはオペレーターのデフォルトのアフィニティ要件と競合するマルチノードクラスター構成をサポートしていないため、既知の制限があることに注意してください。これについては、以下の手順で処理する方法について説明します。

    このブログでは、MinikubeがインストールされるホストOSはUbuntu 18.04(Bionic Beaver)です。

    Minikubeをインストールしましょう

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

    オプションで、異なるLinuxシステムを使用している場合は、ここの手順に従うことができます。

    Kubernetesパッケージを認証し、リポジトリをセットアップするために必要なキーを追加しましょう

    $ 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

    それでは、必要なパッケージをインストールしましょう

    $ sudo apt-get update
    
    $ sudo apt-get install kubelet kubeadm kubectl

    Minikubeを起動して、メモリ、CPUの数、およびノー​​ドを割り当てるCIDRを定義します。

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

    結果の例は次のようになります。

    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

    お気づきのとおり、ノードまたはポッドを管理するためのユーティリティツールもインストールされます。

    それでは、次のコマンドを実行してノードとポッドを確認しましょう。

    $ 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

    次に、PSMDBKubernetesオペレーターをダウンロードします

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

    これで、オペレーターをデプロイする準備が整いました。

    $ kubectl apply -f deploy/bundle.yaml

    前述のように、Minikubeの制限により、期待どおりに動作するように調整する必要があります。次のことをしましょう:

    • 現在のハードウェア容量に応じて、ドキュメントで提案されているように、以下を変更する場合があります。 minikubeはローカルで実行されるため、デフォルトのdeploy / cr.yamlファイルを編集して、限られたリソースでのローカルインストールにOperatorを適合させる必要があります。 replsetsセクションで次のキーを変更します。
      • resources.requests.memoryキーとresources.requests.cpuキーにコメントします(これは、minikubeのデフォルトの制限でOperatorに適合します)
      • アフィニティ.antiAffinityTopologyKeyキーを「none」に設定します(オペレーターはクラスターを複数のノードに分散できなくなります)
    • また、allowUnsafeConfigurationsキーをtrueに切り替えます(このオプションは、クラスター構成に対するオペレーターの制御をオフにし、Percona Server for MongoDBを1ノードクラスターとしてデプロイできるようにします)。

    これで、deploy/cr.yamlファイルに加えられた変更を適用する準備が整いました。

    $ kubectl apply -f deploy/cr.yaml

    この時点で、ポッドのステータスを確認できる可能性があり、次のような進行状況に気付くでしょう。

    $ 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

    もうすぐです。作成されたPSMDBポッドに接続できるように、オペレーターによって生成されたシークレットを取得します。これを行うには、最初にシークレットオブジェクトを一覧表示してから、yamlの値を取得して、ユーザーとパスワードの組み合わせを取得できるようにする必要があります。一方、以下の組み合わせコマンドは、username:password形式で使用できます。以下の例を参照してください

    $ 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

    これで、username:password形式を基にして、安全な場所に保存できます。

    MongoDBノードのPerconaサーバーに直接接続できないため、mongodbクライアントを含む新しいポッドを作成する必要があります。

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

    これで、PSMDBノードに接続する準備が整いました。

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

    または、個々のノードに接続して、その状態を確認することもできます。たとえば、

    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)
    
    }

    オペレーターがクラスターの整合性を管理するため、障害が発生した場合、またはポッドが削除された場合はいつでも。オペレーターは自動的に新しいものを開始します。たとえば、

    $ 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

    これですべての設定が完了しました。もちろん、ポートを公開する必要があるかもしれないので、deploy/cr.yamlで調整を処理する必要があるかもしれません。ここを参照して対処できます。

    結論

    PSMDBのPerconaKubernetesオペレーターは、特にMongoDBセットアップ用のPerconaサーバーのコンテナー化された環境の完全なソリューションになります。レプリカセットに冗長性が組み込まれているにもかかわらず、オペレーターがバックアップ、スケーラビリティ、高可用性、およびセキュリティをサポートしているため、ほぼ完全なソリューションです。


    1. insertManyは重複エラーを処理します

    2. Redisとのセッションを保存するのはどのくらい安全ですか?

    3. redisキーを保存するための最良の方法

    4. Pythonを使用して複雑なネストされたJSONをRedisに保存する方法