MongoDB Kubernetesインストールの方法

Kubernetesへのアプリケーションのデプロイは、特にMongoDBのような ステートフル アプリケーションの場合は困難です。デプロイを簡素化するには、MongoDB Kubernetes Operatorを使用して、Kubernetesクラスタ内でステートフルなアプリケーションを自動的にデプロイおよび管理します。

このチュートリアルでは、MongoDB Kubernetes Operatorを使用してMongoDBをKubernetesにデプロイする方法を学びます。

読み進めて、Kubernetesデプロイを自動化しましょう!

前提条件

このチュートリアルはハンズオンデモンストレーションです。操作に従うためには、以下の要件が満たされていることを確認してください:

  • A Kubernetes cluster – This demo uses the Kubernetes cluster v1.23.

MongoDBの名前空間を作成する

アプリケーションをKubernetesに展開する際は、プロジェクトごとに特定の名前空間を作成することが常に推奨されます。

名前空間を使用すると、管理者がKubernetesリソースを管理しやすくなり、名前の衝突を防ぎます。同時に、名前空間を作成することで、Kubernetes環境でのリソースの誤った使用を防ぎます。

ターミナルを開き、以下のkubectl createコマンドを実行して、Kubernetesクラスターにmongodbという名前の新しい名前空間(ns)を作成してください。

kubectl create ns mongodb

次に、以下のkubectl getコマンドを実行して、Kubernetesクラスター上の名前空間のリストを確認してください。

kubectl get ns

以下のように、クラスターにmongodbという新しい名前空間が表示されます。

Creating and Verifying the mongodb Namespace

MongoDB Kubernetesオペレーターのダウンロード

ネームスペースを作成した後、MongoDB Kubernetes Operatorをダウンロードします。MongoDB Kubernetes Operatorは、Kubernetesオペレータのセットです。これらのKubernetesオペレータは、Kubernetes環境でのMongoDB Communityの自動展開、設定、および管理を提供します。

以下のgitコマンドを実行して、MongoDB Kubernetes Operatorプロジェクトをローカルマシンにcloneします。

git clone <https://github.com/mongodb/mongodb-kubernetes-operator.git>

次に、以下の各コマンドを実行して、現在の作業ディレクトリをmongodb-kubernetes-operatorに変更し、利用可能なすべてのファイルとディレクトリをリスト(ls)します。


# 作業ディレクトリをmongodb-kubernetes-operatorに変更

cd mongodb-kubernetes-operator/


# ファイルとディレクトリをリスト

ls

以下のように、~/mongodb-kubernetes-operatorプロジェクトディレクトリ内にconfigという名前のサブディレクトリが表示されます。このconfigサブディレクトリには、MongoDBをKubernetesに展開するためのYAMLファイルの例が含まれています。

Downloading mongodb-kubernetes-operator Source Code

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上の状態を保つアプリケーションをデプロイするポッドコントローラーです。

kubectl apply -f config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
Creating New Kubernetes CRD MongoDB Kubernetes Deployment

2. 次に、次のkubectl getコマンドを実行して、Kubernetesで利用可能なcrdのリストを確認します。

kubectl get crd/mongodbcommunity.mongodbcommunity.mongodb.com

以下に、名前がmongodbcommunity.mongodbcommunity.mongodb.orgであるCRDが表示されます。

Checking List of CRDs

3. MongoDBオペレーター用の新しいカスタムロールベースのアクセス制御(RBAC)を作成し、RBACの実装を名前空間mongodbに指定するには、以下のコマンドを実行します。

このコマンドは、Kubernetesクラスター上でMongoDBオペレーターのための新しいロール、ロールバインディング、およびサービスアカウントを作成します。これらのカスタム権限は、MongoDBを自動的に展開および管理するために必要です。

kubectl apply -k config/rbac/ -n mongodb
Deploying RBAC for MongoDB Deployment

4. 以下の各kubectlコマンドを実行して、MongoDBオペレーターのロール、ロールバインディング、およびサービスアカウントを確認してください。

# ロールのリストを確認
kubectl get role mongodb-kubernetes-operator -n mongodb

# ロールバインディングのリストを確認
kubectl get rolebinding mongodb-kubernetes-operator -n mongodb

# サービスアカウントの確認
kubectl get serviceaccount mongodb-kubernetes-operator -n mongodb

下記の出力は、mongodbネームスペースにmongodb-kubernetes-operatorというロール、ロールバインディング、およびサービスアカウントが作成されたことを示しています。

Checking role, rolebinding, and serviceaccount on Kubernetes

5. 検証が完了したら、以下のkubectlコマンドを実行してMongoDBオペレーターをmongodbネームスペースに展開してください。

このコマンドは、ベースのDockerイメージ(quay.io/mongodb/mongodb-kubernetes-operator)を使用して新しいポッド(mongodb-kubernetes-operator)を作成します。このポッドは、Kubernetesクラスター上でMongoDB ReplicaSetを自動的に展開するためのコントローラーとして機能します。

kubectl create -f config/manager/manager.yaml -n mongodb

以下に、MongoDBオペレーターの展開が作成されていることが示されていますが、ポッドはまだ初期化中です。

Deploying MongoDB Operator to the mongodb Namespace

6. 最後に、以下のコマンドを実行して、mongodbネームスペース上の展開とポッドを確認してください。

# mongodbネームスペース上の展開を確認
kubectl get deployment.apps -n mongodb

# mongodbネームスペース上のポッドを確認
kubectl get pods -n mongodb

以下のように、MongoDBオペレーターのポッドが実行されていることがわかります。

Verifying MongoDB Operator Deployment and Pod

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に設定されています。

spec:
  members: 2 # 作成するレプリカセットの数
  security:
    authentication:
      modes:
      - SCRAM
  statefulSet:

<your-password-here>を強力なパスワードに置き換えてください。このパスワードはMongoDBデータベースにログインするために使用され、デフォルトではSCRAM認証が使用されます。

パスワードが設定されたら、変更を保存しエディタを閉じてください。

---
apiVersion: v1
kind: Secret
metadata:
  name: my-user-password
type: Opaque
stringData:
  password: <your-password-here> # MongoDB adminのパスワードを設定

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 クラスタ自体によって時間がかかります。

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Deploying MongoDB Replica Sets

3. デプロイメント後、以下の各コマンドを実行して、mongodb ネームスペース上のカスタムリソースとポッドを確認します。

# mongodbcommunity crd の確認
kubectl get mongodbcommunity -n mongodb

# mongodb ネームスペース上のポッドの確認
kubectl get pods -n mongodb

以下の出力は、次の内容を示しています:

  • 名前が mdb0 のカスタムリソース MongoDBCommunity が MongoDB v4.4.0 で実行されています。
  • 2 つの MongoDB ReplicaSet ポッドの名前が mdb0-0 と mdb0-1 で実行されています。各ポッドには、mongod と mongodb-agent の 2 つの異なるコンテナが含まれています。
Verifying MongoDB ReplicaSet Deployment and Pods

4. 最後に、別の kubectl コマンドを実行して、mongodb ネームスペース上の pv と pvc を確認します。

kubectl get pv,pvc -n mongodb

以下の出力は、MongoDB ReplicaSet ポッドで使用される一部の pv と pvc を示しています。

Checking PV and PVC on the mongodb Namespace

MongoDB デプロイメントの新規ユーザーとデータベースの作成

これで、Kubernetes クラスタに MongoDB オペレーターと ReplicaSets をデプロイしました。次のステップは、アプリケーション用の新しい MongoDB データベースとユーザーを作成することです。

新しいユーザーのために新しい Kubernetes シークレットを作成し、ReplicaSet デプロイメントのカスタムリソースを編集し、ReplicaSet をクラスタに更新します。

1. お好きなエディタを使用して、新しいYAMLファイルを作成し、以下のKubernetesシークレットを記入してください。YAMLファイルの名前は自由につけることができますが、このチュートリアルではファイル名をnew-user.yamlとします。

このYAMLファイルは、名前をmyappdata、パスワードをmyapppasswordとする新しいKubernetesシークレットを作成します。

---
apiVersion: v1
kind: Secret
metadata:
  name: myappdata # シークレットの名前
type: Opaque
stringData:
  password: myapppassword # 新しいユーザのパスワード

2. 次に、以下のkubectlコマンドを実行して、new-user.yamlの設定を実行します。

このコマンドは、新しいKubernetesシークレットをクラスタに作成し(apply)、このシークレットをmongodbの名前空間に適用します。

kubectl apply -f new-user.yaml -n mongodb
Creating Secret to Kubernetes Cluster

3. ReplicaSet CRD構成のYAMLファイル(mongodb.com_v1_hostpath.yaml)をconfig/samples/arbitrary_statefulset_configurationディレクトリで編集します。

次の構成をmongodb.com_v1_hostpath.yamlファイルに追加して、MongoDBのデータベースとユーザを作成します。

scram-secret-myappをご自身のscramの資格情報で置き換えて、ファイルの変更を保存し、エディタを閉じてください。

    - name: appuser # 新しいユーザappuser
      db: admin # データベースadminへの認証を許可
      passwordSecretRef:
        name: myappdata # Kubernetesシークレット
      roles:
        - name: dbAdmin # ロールdbAdminの設定
          db: appdb1 # appdb1への設定
      scramCredentialsSecretName: scram-secret-myapp

4. 以下のコマンドを実行して、ステップ3で行ったmongodb.com_v1_hostpath.yamlファイルの変更を適用します。

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Creating New MongoDB User and Database on Kubernetes

5. 最後に、以下の各コマンドを実行して、アプリケーションの詳細なMongoDB接続を生成します。これらのコマンドは、JSON形式の詳細なMongoDB接続を生成し、出力をjqコマンドラインで解析します。

以下のように環境の詳細を入力して、mdb0-admin-mongoadminを置き換えます:

  • mdb0 – MongoDBリソースのメタデータ名です。
  • admin – 認証するデータベースです。
  • mongoadmin – 認証に使用するユーザーです。

# adminの認証情報と接続を取得
kubectl get secrets mdb0-admin-mongoadmin -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'


# appuserの認証情報と接続を取得
kubectl get secrets mdb0-admin-appuser -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

以下の出力では、標準および標準Srv接続を使用してMongoDBに接続できることが示されています。また、MongoDBデプロイメントのユーザー名とパスワードも表示されます。

Retrieving Details of MongoDB User and Password, and Connections

MongoDBデプロイメントへの接続

MongoDB Kubernetesオペレーターを使用してKubernetesクラスターにMongoDBを展開する作業が完了しました。ただし、展開が正常に機能するかどうかをどのように確認しますか?ローカルマシンのデータベースとMongoDBへのユーザー接続をKubernetesクラスター内で確認します。

MongoDBデプロイメントへの接続を確認するために、ポートフォワーディングを使用します。Kubernetesのポートフォワーディングを使用すると、Kubernetesサービスからローカルポートへの転送ポートを作成できます。

1. 以下は、kubectlコマンドを実行して、mongodbネームスペース(-n)のサービス(svc)のリストをgetする方法です。

kubectl get svc -n mongodb

下には、mdb0-svcというサービスが表示され、これはMongoDBのデフォルトポートであるポート27017を公開しています。

Listing Services on the mongodb Namespace

2. 次に、以下のコマンドを実行して、Kubernetesクラスターへのポートフォワーディングを作成します。

このコマンドは、新しいポートフォワーディングをKubernetesサービス(mdb0-svc)に作成し、ローカルポート27017をKubernetesサービスポート27017に転送します。

kubectl port-forward service/mdb0-svc -n mongodb 27017:27017
Setting up Port-forward

3. 最後に、ローカルマシンでMongoDB Compassアプリケーションを開き、以下の形式で新しい接続を追加し、「Connect」をクリックしてMongoDBに接続します。

ユーザー名とパスワードのフィールドをMongoDBのユーザーとパスワードに置き換えてください。

# mongoadminとして接続
mongodb://mongoadmin:secretpassword@localhost:27017/admin?ssl=false

# appuserとして接続
mongodb://appuser:myapppassword@localhost:27017/admin?ssl=false
Connecting as mongoadmin user to MongoDB
Connecting as appuser to MongoDB

接続が成功すると、KubernetesへのMongoDBのデプロイが正常に機能していることを確認するための次のウィンドウが表示されます。

mongoadminユーザーの場合、デフォルトのデータベース(local、config、admin)が表示されます。

Verifying Connection to the MongoDB mongoadmin

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

Verifying Connection to the MongoDB as appuser

結論

このチュートリアルでは、MongoDB Kubernetes Operatorを使用してMongoDBをKubernetesクラスターにデプロイする方法を学びました。また、Kubernetesオペレーターの基本的な使用方法に触れました。そして今では、アプリケーションをKubernetesに自動的にデプロイおよび管理するための堅実な知識を既に持っています。

なぜこの新たな知識を基にして、MongoDBデプロイメントにTLS接続を設定しないのですか? TLS接続はレプリカセット間の接続を保護し、MongoDBへのクライアントまたはアプリケーションの接続を確保します。

Source:
https://adamtheautomator.com/mongodb-kubernetes/