はじめに
MongoDBは、汎用のドキュメントベースのNoSQLデータベースプログラムです。他の非リレーショナルデータベース管理システムと同様に、MongoDBはスケーラビリティとクエリの速度に重点を置いています。
KubernetesはMongoDBと相乗効果を発揮して、拡張性と移植性に優れたデータベースデプロイメントを作成します。これらのデプロイメントは、大量のデータと高負荷を処理する場合に役立ちます。
このチュートリアルでは、KubernetesにMongoDBをデプロイする方法を説明します。このガイドには、スタンドアロンのMongoDBインスタンスとレプリカセットを実行する手順が含まれています。
要件
- kubectlを使用したKubernetesクラスター。
- システムへの管理アクセス。
スタンドアロンのMongoDBインスタンスをデプロイする
MongoDBは、スタンドアロンインスタンスとしてKubernetesにデプロイできます。この展開は本番環境での使用には適していませんが、テストや開発のいくつかの側面には適しています。
以下の手順に従って、スタンドアロンのMongoDBインスタンスをデプロイします。
ステップ1:ノードにラベルを付ける
MongoDBデプロイメントに使用されるノードにラベルを付けます。このラベルは、後でポッドを特定のノードに割り当てるために使用されます。
そのためには:
1.クラスター上のノードを一覧表示します:
kubectl get nodes
2.コマンド出力のリストからデプロイメントノードを選択します。
3. kubectlを使用して、ノードにキーと値のペアのラベルを付けます。
kubectl label nodes <node> <key>=<value>
出力は、ラベルが正常に追加されたことを確認します。
ステップ2:StorageClassを作成する
StorageClassは、ポッドがノードで永続的なボリュームクレームをプロビジョニングするのに役立ちます。 StorageClassを作成するには:
1.テキストエディタを使用して、ストレージクラス構成を保存するYAMLファイルを作成します。
nano StorageClass.yaml
2.ファイルでストレージクラスの構成を指定します。以下の例では、 mongodb-storageclass
を定義しています。 :
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: mongodb-storageclass
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
3.変更を保存して、エディターを終了します。
ステップ3:永続ストレージを作成する
永続ボリュームと永続ボリュームクレームを作成して、MongoDBデプロイメント用のストレージをプロビジョニングします。
1.永続的なボリューム構成用のYAMLファイルを作成します。
nano PersistentVolume.yaml
2.ファイルで、前の手順で定義したストレージクラスに属するストレージを割り当てます。 nodeAffinity
でポッドのデプロイに使用するノードを指定します セクション。ノードは、ステップ1で作成されたラベルを使用して識別されます 。
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv
spec:
capacity:
storage: 2Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: mongodb-storageclass
local:
path: /mnt/data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In
values:
- large
3.永続ボリュームクレームの構成用に別のYAMLを作成します:
nano PersistentVolumeClaim.yaml
4. mongodb-pvc
という名前のクレームを定義します mongodb-storageclass
に属するボリュームを要求するようにKubernetesに指示します 。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mongodb-pvc
spec:
storageClassName: mongodb-storageclass
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 1Gi
ステップ4:ConfigMapを作成する
ConfigMapファイルには、ポッドで使用される暗号化されていない構成情報が格納されています。
1.デプロイメント構成を保存するYAMLファイルを作成します:
nano ConfigMap.yaml
2.ファイルを使用して、システムパス、ユーザー、およびロールに関する情報を保存します。以下は、ConfigMapファイルの例です。
apiVersion: v1
kind: ConfigMap
metadata:
name: mongodb-configmap
data:
mongo.conf: |
storage:
dbPath: /data/db
ensure-users.js: |
const targetDbStr = 'test';
const rootUser = cat('/etc/k8-test/admin/MONGO_ROOT_USERNAME');
const rootPass = cat('/etc/k8-test/admin/MONGO_ROOT_PASSWORD');
const usersStr = cat('/etc/k8-test/MONGO_USERS_LIST');
const adminDb = db.getSiblingDB('admin');
adminDb.auth(rootUser, rootPass);
print('Successfully authenticated admin user');
const targetDb = db.getSiblingDB(targetDbStr);
const customRoles = adminDb
.getRoles({rolesInfo: 1, showBuiltinRoles: false})
.map(role => role.role)
.filter(Boolean);
usersStr
.trim()
.split(';')
.map(s => s.split(':'))
.forEach(user => {
const username = user[0];
const rolesStr = user[1];
const password = user[2];
if (!rolesStr || !password) {
return;
}
const roles = rolesStr.split(',');
const userDoc = {
user: username,
pwd: password,
};
userDoc.roles = roles.map(role => {
if (!~customRoles.indexOf(role)) {
return role;
}
return {role: role, db: 'admin'};
});
try {
targetDb.createUser(userDoc);
} catch (err) {
if (!~err.message.toLowerCase().indexOf('duplicate')) {
throw err;
}
}
});
ステップ5:StatefulSetを作成する
StatefulSet ステートフルアプリのデプロイに使用されるKubernetesコントローラーです。ステートフルアプリポッドは、他のポッドと通信するため、一意のIDが必要です。
StatefulSetを作成するには :
1.テキストエディタを使用してYAMLファイルを作成します:
nano StatefulSet.yaml
2.使用するMongoDBDockerイメージなど、デプロイメント情報をファイルに挿入します。このファイルは、以前に作成された ConfigMap
も参照します。 およびPersistentVolumeClaim
:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb-test
spec:
serviceName: mongodb-test
replicas: 1
selector:
matchLabels:
app: database
template:
metadata:
labels:
app: database
selector: mongodb-test
spec:
containers:
- name: mongodb-test
image: mongo:4.0.8
env:
- name: MONGO_INITDB_ROOT_USERNAME_FILE
value: /etc/k8-test/admin/MONGO_ROOT_USERNAME
- name: MONGO_INITDB_ROOT_PASSWORD_FILE
value: /etc/k8-test/admin/MONGO_ROOT_PASSWORD
volumeMounts:
- name: k8-test
mountPath: /etc/k8-test
readOnly: true
- name: mongodb-scripts
mountPath: /docker-entrypoint-initdb.d
readOnly: true
- name: mongodb-configmap
mountPath: /config
readOnly: true
- name: mongodb-data
mountPath: /data/db
nodeSelector:
size: large
volumes:
- name: k8-test
secret:
secretName: mongodb-secret
items:
- key: MONGO_ROOT_USERNAME
path: admin/MONGO_ROOT_USERNAME
mode: 0444
- key: MONGO_ROOT_PASSWORD
path: admin/MONGO_ROOT_PASSWORD
mode: 0444
- key: MONGO_USERNAME
path: MONGO_USERNAME
mode: 0444
- key: MONGO_PASSWORD
path: MONGO_PASSWORD
mode: 0444
- key: MONGO_USERS_LIST
path: MONGO_USERS_LIST
mode: 0444
- name: mongodb-scripts
configMap:
name: mongodb-configmap
items:
- key: ensure-users.js
path: ensure-users.js
- name: mongodb-configmap
configMap:
name: mongodb-configmap
items:
- key: mongo.conf
path: mongo.conf
- name: mongodb-data
persistentVolumeClaim:
claimName: mongodb-pvc
ステップ6:シークレットを作成する
Secretオブジェクトは、デプロイメントに関する機密情報を格納するために使用されます。
1.テキストエディタでシークレットYAMLを作成します。
nano Secret.yaml
2.MongoDBデータベースにアクセスするための情報を提供します。
apiVersion: v1
kind: Secret
metadata:
name: mongodb-secret
type: Opaque
data:
MONGO_ROOT_USERNAME: YWRtaW4K
MONGO_ROOT_PASSWORD: cGFzc3dvcmQK
MONGO_USERNAME: dGVzdAo=
MONGO_PASSWORD: cGFzc3dvcmQK
MONGO_USERS_LIST: dGVzdDpkYkFkbWluLHJlYWRXcml0ZTpwYXNzd29yZAo=
3.変更を保存して終了します。
ステップ7:MongoDBサービスを作成する
MongoDBサービスを作成するには:
1.ヘッドレスサービスオブジェクトを作成します。
nano Service.yaml
ヘッドレスサービスにより、ユーザーはポッドに直接接続できます。
2.サービス名と定義をYAMLファイルに追加します。
apiVersion: v1
kind: Service
metadata:
name: mongodb-test
labels:
app: database
spec:
clusterIP: None
selector:
app: database
3.変更を保存して、ファイルを終了します。
ステップ8:Kustomizeを使用してMongoDB構成を適用する
Kustomizeを使用して、MongoDB構成ファイルを簡単に適用します。
1. kustomization.yaml
を作成します ファイル:
nano kustomization.yaml
2.resources
内 セクションで、前の手順で作成されたすべてのYAMLファイルを一覧表示します:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ConfigMap.yaml
- PersistentVolumeClaim.yaml
- PersistentVolume.yaml
- Secret.yaml
- Service.yaml
- StatefulSet.yaml
- StorageClass.yaml
他のファイルと同じディレクトリにファイルを保存します。
3.次のコマンドを使用してMongoDBをデプロイします。
kubectl apply -k .
4. kubectlを使用して、ポッドの準備ができているかどうかを確認します。
kubectl get pod
ポッドに1/1
が表示されたとき READY
で 列、次のステップに進みます。
ステップ9:MongoDBスタンドアロンインスタンスに接続する
1.次のkubectlコマンドを使用して、MongoDBポッドに接続します。
kubectl exec -it mongodb-test-0 -- sh
2. #
の場合 プロンプトが表示されたら、次のように入力します:
mongo
MongoDBシェルが読み込まれます。
3.テストデータベースに切り替えます:
use test
4.次のコマンドで認証します:
db.auth('[username]','[password]')
番号1
出力で、認証が成功したことを確認します。
レプリカセットをデプロイする
MongoDBをReplicaSetとしてデプロイする 指定された数のポッドが常に実行されていることを確認します。本番環境では、ReplicaSetのデプロイメントをお勧めします。
ステップ1:役割ベースのアクセス制御(RBAC)を設定する
ロールベースのアクセス制御を有効にすることは、Kubernetesのセキュリティのベストプラクティスの1つです。 RBACは、必要以上の権限を持つユーザーがいないことを保証します。
RBACを設定するには:
1.テキストエディタでYAMLファイルを作成します。
nano rbac.yaml
2.MongoDBデプロイメントのアクセスルールを提供します。以下の例は、RBACYAMLファイルを示しています。
apiVersion: v1
kind: ServiceAccount
metadata:
name: mongo-account
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: mongo-role
rules:
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["*"]
- apiGroups: [""]
resources: ["deployments"]
verbs: ["list", "watch"]
- apiGroups: [""]
resources: ["services"]
verbs: ["*"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["get","list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: mongo_role_binding
subjects:
- kind: ServiceAccount
name: mongo-account
namespace: default
roleRef:
kind: ClusterRole
name: mongo-role
apiGroup: rbac.authorization.k8s.io
3.ファイルを保存し、kubectlを使用して適用します:
kubectl apply -f rbac.yaml
ステップ2:StatefulSetデプロイメントを作成する
1. StatefulSetデプロイメントYAMLを作成します:
nano StatefulSet.yaml
2.ファイル内のレプリカの数、使用するMongoDB Dockerイメージを指定し、動的ボリュームプロビジョニング用のボリュームクレームテンプレートを提供します。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb-replica
namespace: default
spec:
serviceName: mongo
replicas: 2
selector:
matchLabels:
app: mongo
template:
metadata:
labels:
app: mongo
selector: mongo
spec:
terminationGracePeriodSeconds: 30
serviceAccount: mongo-account
containers:
- name: mongodb
image: docker.io/mongo:4.2
env:
command: ["/bin/sh"]
args: ["-c", "mongod --replSet=rs0 --bind_ip_all"]
resources:
limits:
cpu: 1
memory: 1500Mi
requests:
cpu: 1
memory: 1000Mi
ports:
- name: mongo-port
containerPort: 27017
volumeMounts:
- name: mongo-data
mountPath: /data/db
volumeClaimTemplates:
- metadata:
name: mongo-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
3.ファイルを保存し、kubectlapplyを使用してデプロイメントを作成します。
kubectl apply -f StatefulSet.yaml
ステップ3:ヘッドレスサービスを作成する
ヘッドレスサービスを作成するには:
1.サービスYAMLファイルを作成します:
nano Service.yaml
2.ポッドとの直接通信を可能にするサービスを定義します。
apiVersion: v1
kind: Service
metadata:
name: mongo
namespace: default
labels:
name: mongo
spec:
ports:
- port: 27017
targetPort: 27017
clusterIP: None
selector:
app: mongo
3.kubectlを使用してYAMLを適用します。
kubectl apply -f Service.yaml
ステップ4:レプリケーションホストを設定する
ポッドレプリケーションを設定するには:
1. kubectl exec
を使用してポッドに入ります :
kubectl exec -it mongodb-replica-0 -n default -- mongo
MongoDBシェルのウェルカムメッセージが表示されます。
2. MongoDBシェルプロンプトで次のコマンドを入力して、レプリケーションを開始します。
rs.initiate()
"ok" : 1
行は、開始が成功したことを示しています。
3. cfg
という変数を定義します 。変数はrs.conf()
を実行します 。
var cfg = rs.conf()
4.変数を使用して、プライマリサーバーを構成に追加します。
cfg.members[0].host="mongodb-replica-0.mongo:27017"
出力には、プライマリサーバーの名前が表示されます。
5.次のコマンドを実行して、構成を確認します。
rs.reconfig(cfg)
"ok" : 1
行は、構成が成功したことを確認します。
6. rs.add()
を使用します 構成に別のポッドを追加するコマンド。
rs.add("mongodb-replica-1.mongo:27017")
出力には、レプリカが追加されたことが示されます。
7.次のように入力して、システムのステータスを確認します。
rs.status()
"members"
セクションには2つのレプリカが表示されます。プライマリレプリカは、出力の上部に一覧表示されます。
セカンダリレプリカはプライマリレプリカの下にあります。
MongoDBのReplicaSetデプロイメントがセットアップされ、操作できるようになりました。