GNU/Linux >> Linux の 問題 >  >> Linux

KubernetesでMongoDBを実行する方法

はじめに

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デプロイメントがセットアップされ、操作できるようになりました。


Linux
  1. 最初のポッドをKubernetesクラスターにデプロイする方法

  2. Gitタグを作成する方法

  3. スクリプトを実行する方法??

  1. MongoDBでデータベースとコレクションを作成する方法

  2. Kubernetesポッドを再起動する方法

  3. KubernetesでKafkaを設定して実行する方法

  1. Linuxでファイルを作成する方法

  2. TarGzファイルを作成する方法

  3. Terraformモジュールを作成する方法