今回は「Kubernetes 上に 単独 MongoDB サーバー を構築する方法」についてまとめます。
概要
Kubernetes上に 単一 の MongoDB サーバー を構築します。 あまり凝ったことはせずシンプルな構成にしました。 作成するリースは以下の通りです。
- PersistentVolume
- PersistentVolumeClaim
- Secret
- Pod
PersistentVolume
永続データの保存先を作成します。 今回は NFS サーバー に保存するように設定しています。
-
マニュフェスト作成
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サーバーへの接続情報を設定します。 -
リソース作成
kubectl apply -f pv0001.yml
-
作成確認
kubectl get pv
PersistentVolumeClaim
1段抽象化された永続データ保存先情報を作成します。 今回は上で作成したNFSサーバーを要求するリソースを作成しています。
-
マニュフェスト作成
nfs-pvc1.yml
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc1 spec: storageClassName: slow accessModes: - ReadWriteMany resources: requests: storage: 3Gi
storageClassName
、accessModes
は完全一致、storage
は PersistentVolume 以下になっていることに注意して設定します。 -
リソース作成
kubectl apply -f nfs-pvc1.yml
-
作成確認
kubectl get pvc
Secret
マニュフェストファイルはGitHubなどリポジトリにコミットするものですが、機微情報はだれでも閲覧できる場所に保存することはできません。 そんな状況で利用できるのがこの「Secret」リソースです。 機微情報は外だししてPodで参照利用するようにします。
-
リソース作成
以下のコマンドを実行して「Secret」リソースを作成します。
kubectl create secret generic mongo-secret \ --from-literal=root_username=admin \ --from-literal=root_password=Passw0rd
-
作成確認
kubectl get secrets
Pod
-
マニュフェスト作成
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
-
リソース作成
kubectl apply -f mongodb.yml
-
作成確認
kubectl get po
動作確認
前述までの作業が終わっていればMongoDBサーバーが起動しているはずなので、動作確認をしてみます。
-
起動した 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
-
デバッグ用の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. #
-
起動している 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 >
-
adminデータベースにスイッチ
use admin
-
設定したID/PASSWORDでログイン
db.auth("admin", "Passw0rd")
-
データベース一覧が表示できることを確認
show dbs
-
動作確認が終わったら
exit
で終了exit
今回は「Kubernetes 上に 単独 MongoDB サーバー を構築する方法」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!