Kubernetes 上に 単独 MongoDB サーバー を構築する方法

0 件のコメント

今回は「Kubernetes 上に 単独 MongoDB サーバー を構築する方法」についてまとめます。

概要

Kubernetes上に 単一 の MongoDB サーバー を構築します。 あまり凝ったことはせずシンプルな構成にしました。 作成するリースは以下の通りです。

  • PersistentVolume
  • PersistentVolumeClaim
  • Secret
  • Pod

PersistentVolume

永続データの保存先を作成します。 今回は NFS サーバー に保存するように設定しています。

  1. マニュフェスト作成

    pv0001.yml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv0001
      labels:
        type: nfs
    spec:
      storageClassName: slow
      accessModes:
        - ReadWriteMany
      capacity:
        storage: 3Gi
      persistentVolumeReclaimPolicy: Retain
      nfs:
        server: 10.51.1.103
        path: /var/share/pv0001
    

    spec.nfs にNFSサーバーへの接続情報を設定します。

  2. リソース作成

    kubectl apply -f pv0001.yml
    
  3. 作成確認

    kubectl get pv
    

PersistentVolumeClaim

1段抽象化された永続データ保存先情報を作成します。 今回は上で作成したNFSサーバーを要求するリソースを作成しています。

  1. マニュフェスト作成

    nfs-pvc1.yml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nfs-pvc1
    spec:
      storageClassName: slow
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 3Gi
    

    storageClassNameaccessModes は完全一致、 storage は PersistentVolume 以下になっていることに注意して設定します。

  2. リソース作成

    kubectl apply -f nfs-pvc1.yml
    
  3. 作成確認

    kubectl get pvc
    

Secret

マニュフェストファイルはGitHubなどリポジトリにコミットするものですが、機微情報はだれでも閲覧できる場所に保存することはできません。 そんな状況で利用できるのがこの「Secret」リソースです。 機微情報は外だししてPodで参照利用するようにします。

  1. リソース作成

    以下のコマンドを実行して「Secret」リソースを作成します。

    kubectl create secret generic mongo-secret \
      --from-literal=root_username=admin \
      --from-literal=root_password=Passw0rd
    
  2. 作成確認

    kubectl get secrets
    

Pod

  1. マニュフェスト作成

    mongodb.yml

    apiVersion: v1
    kind: Pod
    metadata:
      name: mongodb
      namespace: default
      labels:
        app: mongodb
        ver: "0.0.1"
        env: staging
    spec:
      containers:
        - name: mongodb
          image: mongo:4.1.13-bionic
          ports:
            - containerPort: 27017
          args:
            - "mongod"
            - "--auth"
            - "--bind_ip_all"
          env:
            - name: "MONGO_INITDB_ROOT_USERNAME"
              valueFrom:
                secretKeyRef:
                  name: mongo-secret
                  key: root_username
            - name: "MONGO_INITDB_ROOT_PASSWORD"
              valueFrom:
                secretKeyRef:
                  name: mongo-secret
                  key: root_password
            - name: "MONGO_INITDB_DATABASE"
              value: "admin"
          volumeMounts:
            - mountPath: /data/db
              name: nfs-storage
      volumes:
        - name: nfs-storage
          persistentVolumeClaim:
            claimName: nfs-pvc1
    

    command で Docker イメージの CMD を上書きしたくなりますが、実際はマッピングが異なるので args で CMD を上書きすることになります。 MongoDBの Dockerfile を見ると初期化シェルスクリプト (docker-entrypoint.sh) が ENTRYPOINT に定義されているので、 args だけ上書きします。

      Docker Kubernetes
    コンテナの初期化処理 ENTRYPOINT command
    コンテナ実行時に渡されるコマンド CMD args

    MongoDBの初期化処理時にユーザーアカウント作成したい場合、以下の環境変数を定義しておくことでデフォルトユーザーを作成できます。

    • MONGO_INITDB_ROOT_USERNAME
    • MONGO_INITDB_ROOT_PASSWORD
    • MONGO_INITDB_DATABASE
  2. リソース作成

    kubectl apply -f mongodb.yml
    
  3. 作成確認

    kubectl get po
    

動作確認

前述までの作業が終わっていればMongoDBサーバーが起動しているはずなので、動作確認をしてみます。

  1. 起動した MongoDB の Pod ネットワーク アドレス を確認

    [root@k8s-master ~]# kubectl get po -o wide
    NAME      READY   STATUS    RESTARTS   AGE    IP            NODE         NOMINATED NODE   READINESS GATES
    mongodb   1/1     Running   0          55s    10.244.1.48   k8s-node02              
    
  2. デバッグ用のPodを作成

    [root@k8s-master ~]# kubectl run mongo-debug -it --rm=true --restart=Never --image=mongo:4.1 -- sh
    If you don't see a command prompt, try pressing enter.
    
    #
    
  3. 起動している MongoDB へ接続

    # mongo 10.244.1.48
    MongoDB shell version v4.1.13
    connecting to: mongodb://10.244.1.48:27017/test?compressors=disabled&gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("02b3159d-a585-417a-8f55-5811a40861e4") }
    MongoDB server version: 4.1.13
    Welcome to the MongoDB shell.
    For interactive help, type "help".
    For more comprehensive documentation, see
            http://docs.mongodb.org/
    Questions? Try the support group
            http://groups.google.com/group/mongodb-user
    >
    
  4. adminデータベースにスイッチ

    use admin
    
  5. 設定したID/PASSWORDでログイン

    db.auth("admin", "Passw0rd")
    
  6. データベース一覧が表示できることを確認

    show dbs
    
  7. 動作確認が終わったら exit で終了

    exit
    

今回は「Kubernetes 上に 単独 MongoDB サーバー を構築する方法」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!