Kubernetesへのアプリケーションのデプロイは、特にMongoDBのような ステートフル アプリケーションの場合は困難です。デプロイを簡素化するには、MongoDB Kubernetes Operatorを使用して、Kubernetesクラスタ内でステートフルなアプリケーションを自動的にデプロイおよび管理します。
このチュートリアルでは、MongoDB Kubernetes Operatorを使用してMongoDBをKubernetesにデプロイする方法を学びます。
読み進めて、Kubernetesデプロイを自動化しましょう!
前提条件
このチュートリアルはハンズオンデモンストレーションです。操作に従うためには、以下の要件が満たされていることを確認してください:
- A Kubernetes cluster – This demo uses the Kubernetes cluster v1.23.
- ローカルマシンにKubectlがインストールされていること。
- ローカルマシンにMongoDB Compassがインストールされていること。
- マシンにGitがインストールされていること。
- ローカルマシンにjq JSONパーサーがインストールされていること。
MongoDBの名前空間を作成する
アプリケーションをKubernetesに展開する際は、プロジェクトごとに特定の名前空間を作成することが常に推奨されます。
名前空間を使用すると、管理者がKubernetesリソースを管理しやすくなり、名前の衝突を防ぎます。同時に、名前空間を作成することで、Kubernetes環境でのリソースの誤った使用を防ぎます。
ターミナルを開き、以下のkubectl create
コマンドを実行して、Kubernetesクラスターにmongodb
という名前の新しい名前空間(ns
)を作成してください。
次に、以下のkubectl get
コマンドを実行して、Kubernetesクラスター上の名前空間のリストを確認してください。
以下のように、クラスターにmongodbという新しい名前空間が表示されます。

MongoDB Kubernetesオペレーターのダウンロード
ネームスペースを作成した後、MongoDB Kubernetes Operatorをダウンロードします。MongoDB Kubernetes Operatorは、Kubernetesオペレータのセットです。これらのKubernetesオペレータは、Kubernetes環境でのMongoDB Communityの自動展開、設定、および管理を提供します。
以下のgit
コマンドを実行して、MongoDB Kubernetes Operatorプロジェクトをローカルマシンにclone
します。
次に、以下の各コマンドを実行して、現在の作業ディレクトリをmongodb-kubernetes-operator
に変更し、利用可能なすべてのファイルとディレクトリをリスト(ls
)します。
以下のように、~/mongodb-kubernetes-operatorプロジェクトディレクトリ内にconfig
という名前のサブディレクトリが表示されます。このconfigサブディレクトリには、MongoDBをKubernetesに展開するためのYAMLファイルの例が含まれています。

MongoDB Operatorの展開
カスタムネームスペースとMongoDB Kubernetes Operatorが設定されたので、MongoDB OperatorをKubernetesクラスタに展開する準備が整いました。どうやって展開するのでしょうか?configディレクトリ内の設定を使用します。
MongoDB Operatorは、Kubernetesクラスタ上でのMongoDB展開のライフサイクルを処理します。オペレータは自動的にMongoDB展開の状態を作成、管理、およびスケーリングします。
MongoDBオペレーターをデプロイするには、Kubernetesのカスタムリソース定義(CRD)とコントローラーを作成する必要があります。 KubernetesのCRDはKubernetes APIに拡張可能であり、Kubernetesでカスタムリソースを作成できます。
1. MongoDBデプロイメント用の新しいKubernetes CRDを作成するには、以下のkubectl apply
コマンドを実行します。
The Kubernetesオペレーター は、Kubernetes上でアプリケーションをデプロイするためのすべての人間の対話を置き換えました。オペレーターは、自動的に状態を管理してKubernetes上の状態を保つアプリケーションをデプロイするポッドコントローラーです。

2. 次に、次のkubectl get
コマンドを実行して、Kubernetesで利用可能なcrd
のリストを確認します。
以下に、名前がmongodbcommunity.mongodbcommunity.mongodb.orgであるCRDが表示されます。

3. MongoDBオペレーター用の新しいカスタムロールベースのアクセス制御(RBAC)を作成し、RBACの実装を名前空間mongodbに指定するには、以下のコマンドを実行します。
このコマンドは、Kubernetesクラスター上でMongoDBオペレーターのための新しいロール、ロールバインディング、およびサービスアカウントを作成します。これらのカスタム権限は、MongoDBを自動的に展開および管理するために必要です。

4. 以下の各kubectl
コマンドを実行して、MongoDBオペレーターのロール、ロールバインディング、およびサービスアカウントを確認してください。
下記の出力は、mongodbネームスペースにmongodb-kubernetes-operatorというロール、ロールバインディング、およびサービスアカウントが作成されたことを示しています。

5. 検証が完了したら、以下のkubectl
コマンドを実行してMongoDBオペレーターをmongodbネームスペースに展開してください。
このコマンドは、ベースのDockerイメージ(quay.io/mongodb/mongodb-kubernetes-operator)を使用して新しいポッド(mongodb-kubernetes-operator)を作成します。このポッドは、Kubernetesクラスター上でMongoDB ReplicaSetを自動的に展開するためのコントローラーとして機能します。
以下に、MongoDBオペレーターの展開が作成されていることが示されていますが、ポッドはまだ初期化中です。

6. 最後に、以下のコマンドを実行して、mongodbネームスペース上の展開とポッドを確認してください。
以下のように、MongoDBオペレーターのポッドが実行されていることがわかります。

KubernetesへのMongoDB ReplicaSetの展開
MongoDBの展開後、高可用性と冗長性を提供するために、MongoDB ReplicaSetをKubernetesに展開します。展開中にダウンタイムが発生しないようにします。
MongoDB Kubernetes Operatorを使用したMongoDB ReplicaSetsの展開は、ユーザーのSCRAM認証を使用してデフォルトでセキュアです。同時に、ユーザーやアプリケーションの接続にはTLSセキュア接続を使用し、監視リソースのためにPrometheusメトリクスを公開することができます。
関連記事: Grafana&Prometheus Kubernetesクラスターモニタリングのはじめ方
config/samples/ディレクトリ内には、ReplicaSetの展開に使用できる複数のYAMLファイルのサンプルがあります。各ファイルは異なる展開シナリオで使用できますが、デフォルトのReplicaSet展開ファイルはmongodb.com_v1_mongodbcommunity_cr.yamlです。
1. 好みのエディタを使用して展開のためのYAMLファイルを編集します。このデモでは、ローカル展開のために/mongodb.com_v1_hostpath.yamlファイルを使用します。このYAMLファイルはconfig/samples/arbitrary_statefulset_configuration/ディレクトリにあります。
もしGKEやAKSなどのクラウドサービス上でMongoDB Kubernetes Operatorを展開する場合、YAMLファイルmongodb.com_v1_mongodbcommunity_cr.yamlを使用してください。しかし、KindやMinikube内で展開する場合は、カスタムYAMLファイル(arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml)を使用できます。このファイルは、MongoDB ReplicaSetのためにカスタムPVとPVCを自動的に作成します。
以下では、環境に応じて展開するレプリカセットの数(members)を変更してください。デフォルトは3ですが、このチュートリアルでは、レプリカセットの数は2に設定されています。
<your-password-here>を強力なパスワードに置き換えてください。このパスワードはMongoDBデータベースにログインするために使用され、デフォルトではSCRAM認証が使用されます。
パスワードが設定されたら、変更を保存しエディタを閉じてください。
2. 次に、以下のkubectl
コマンドを実行して、mongodb.com_v1_hostpath.yaml
を使用してMongoDB ReplicaSetをmongodbネームスペースに展開(apply
)します。
このコマンドは以下を作成します:
- A new custom resource (MongoDBCommunity) with the name mdb0 under the
mongodbcommunity.mongodb.com/v1
CRD
- MongoDBユーザーパスワードを保存するためのKubernetesシークレット。同時に、MongoDB Replica Set用の
hostPath
タイプの一部のPVとPVC。
デプロイメントには、作成する ReplicaSets のサイズと Kubernetes クラスタ自体によって時間がかかります。

3. デプロイメント後、以下の各コマンドを実行して、mongodb
ネームスペース上のカスタムリソースとポッドを確認します。
以下の出力は、次の内容を示しています:
- 名前が mdb0 のカスタムリソース MongoDBCommunity が MongoDB v4.4.0 で実行されています。
- 2 つの MongoDB ReplicaSet ポッドの名前が mdb0-0 と mdb0-1 で実行されています。各ポッドには、mongod と mongodb-agent の 2 つの異なるコンテナが含まれています。

4. 最後に、別の kubectl
コマンドを実行して、mongodb
ネームスペース上の pv
と pvc
を確認します。
以下の出力は、MongoDB ReplicaSet ポッドで使用される一部の pv と pvc を示しています。

MongoDB デプロイメントの新規ユーザーとデータベースの作成
これで、Kubernetes クラスタに MongoDB オペレーターと ReplicaSets をデプロイしました。次のステップは、アプリケーション用の新しい MongoDB データベースとユーザーを作成することです。
新しいユーザーのために新しい Kubernetes シークレットを作成し、ReplicaSet デプロイメントのカスタムリソースを編集し、ReplicaSet をクラスタに更新します。
1. お好きなエディタを使用して、新しいYAMLファイルを作成し、以下のKubernetesシークレットを記入してください。YAMLファイルの名前は自由につけることができますが、このチュートリアルではファイル名をnew-user.yamlとします。
このYAMLファイルは、名前をmyappdata、パスワードをmyapppasswordとする新しいKubernetesシークレットを作成します。
2. 次に、以下のkubectl
コマンドを実行して、new-user.yaml
の設定を実行します。
このコマンドは、新しいKubernetesシークレットをクラスタに作成し(apply)、このシークレットをmongodbの名前空間に適用します。

3. ReplicaSet CRD構成のYAMLファイル(mongodb.com_v1_hostpath.yaml)をconfig/samples/arbitrary_statefulset_configurationディレクトリで編集します。
次の構成をmongodb.com_v1_hostpath.yamlファイルに追加して、MongoDBのデータベースとユーザを作成します。
scram-secret-myappをご自身のscramの資格情報で置き換えて、ファイルの変更を保存し、エディタを閉じてください。
4. 以下のコマンドを実行して、ステップ3で行ったmongodb.com_v1_hostpath.yaml
ファイルの変更を適用します。

5. 最後に、以下の各コマンドを実行して、アプリケーションの詳細なMongoDB接続を生成します。これらのコマンドは、JSON形式の詳細なMongoDB接続を生成し、出力をjq
コマンドラインで解析します。
以下のように環境の詳細を入力して、mdb0-admin-mongoadmin
を置き換えます:
-
mdb0
– MongoDBリソースのメタデータ名です。
-
admin
– 認証するデータベースです。
-
mongoadmin
– 認証に使用するユーザーです。
以下の出力では、標準および標準Srv接続を使用してMongoDBに接続できることが示されています。また、MongoDBデプロイメントのユーザー名とパスワードも表示されます。

MongoDBデプロイメントへの接続
MongoDB Kubernetesオペレーターを使用してKubernetesクラスターにMongoDBを展開する作業が完了しました。ただし、展開が正常に機能するかどうかをどのように確認しますか?ローカルマシンのデータベースとMongoDBへのユーザー接続をKubernetesクラスター内で確認します。
MongoDBデプロイメントへの接続を確認するために、ポートフォワーディングを使用します。Kubernetesのポートフォワーディングを使用すると、Kubernetesサービスからローカルポートへの転送ポートを作成できます。
1. 以下は、kubectl
コマンドを実行して、mongodb
ネームスペース(-n
)のサービス(svc
)のリストをget
する方法です。
下には、mdb0-svcというサービスが表示され、これはMongoDBのデフォルトポートであるポート27017を公開しています。

2. 次に、以下のコマンドを実行して、Kubernetesクラスターへのポートフォワーディングを作成します。
このコマンドは、新しいポートフォワーディングをKubernetesサービス(mdb0-svc)に作成し、ローカルポート27017をKubernetesサービスポート27017に転送します。

3. 最後に、ローカルマシンでMongoDB Compassアプリケーションを開き、以下の形式で新しい接続を追加し、「Connect」をクリックしてMongoDBに接続します。
ユーザー名とパスワードのフィールドをMongoDBのユーザーとパスワードに置き換えてください。


接続が成功すると、KubernetesへのMongoDBのデプロイが正常に機能していることを確認するための次のウィンドウが表示されます。
mongoadminユーザーの場合、デフォルトのデータベース(local、config、admin)が表示されます。

appuserの場合、appdb1という一つの特権データベースしか表示されません。

結論
このチュートリアルでは、MongoDB Kubernetes Operatorを使用してMongoDBをKubernetesクラスターにデプロイする方法を学びました。また、Kubernetesオペレーターの基本的な使用方法に触れました。そして今では、アプリケーションをKubernetesに自動的にデプロイおよび管理するための堅実な知識を既に持っています。
なぜこの新たな知識を基にして、MongoDBデプロイメントにTLS接続を設定しないのですか? TLS接続はレプリカセット間の接続を保護し、MongoDBへのクライアントまたはアプリケーションの接続を確保します。