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

0 件のコメント

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

概要

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

  • PersistentVolume
  • PersistentVolumeClaim
  • Secret
  • Pod

PersistentVolume

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

  1. マニュフェスト作成

    pv0001.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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. リソース作成

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

    1
    kubectl get pv

PersistentVolumeClaim

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

  1. マニュフェスト作成

    nfs-pvc1.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nfs-pvc1
    spec:
      storageClassName: slow
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 3Gi

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

  2. リソース作成

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

    1
    kubectl get pvc

Secret

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

  1. リソース作成

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

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

    1
    kubectl get secrets

Pod

  1. マニュフェスト作成

    mongodb.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    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. リソース作成

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

    1
    kubectl get po

動作確認

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

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

    1
    2
    3
    4
    [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   <none>           <none>
    </none></none>
  2. デバッグ用のPodを作成

    1
    2
    3
    4
    [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 へ接続

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 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データベースにスイッチ

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

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

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

    1
    exit

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

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