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