GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So führen Sie MongoDB auf Kubernetes aus

Einführung

MongoDB ist ein universelles, dokumentenbasiertes NoSQL-Datenbankprogramm. Wie bei anderen nichtrelationalen Datenbankverwaltungssystemen konzentriert sich MongoDB auf die Skalierbarkeit und die Geschwindigkeit von Abfragen.

Kubernetes arbeitet mit MongoDB zusammen, um hochgradig skalierbare und portable Datenbankbereitstellungen zu erstellen. Diese Bereitstellungen sind nützlich, wenn Sie mit großen Datenmengen und hohen Lasten arbeiten.

In diesem Tutorial erfahren Sie, wie Sie MongoDB auf Kubernetes bereitstellen. Der Leitfaden enthält Schritte zum Ausführen einer eigenständigen MongoDB-Instanz und eines Replikatsatzes.

Anforderungen

  • Ein Kubernetes-Cluster mit kubectl.
  • Administrativer Zugriff auf Ihr System.

Stellen Sie eine eigenständige MongoDB-Instanz bereit

MongoDB kann auf Kubernetes als eigenständige Instanz bereitgestellt werden. Diese Bereitstellung ist für den Produktionseinsatz nicht geeignet, aber für Tests und einige Aspekte der Entwicklung geeignet.

Führen Sie die folgenden Schritte aus, um eine eigenständige MongoDB-Instanz bereitzustellen.

Schritt 1:Beschriften Sie den Knoten

Beschriften Sie den Knoten, der für die MongoDB-Bereitstellung verwendet wird. Das Label wird später verwendet, um Pods einem bestimmten Knoten zuzuweisen.

Dazu:

1. Listen Sie die Knoten in Ihrem Cluster auf:

kubectl get nodes

2. Wählen Sie den Bereitstellungsknoten aus der Liste in der Befehlsausgabe aus.

3. Verwenden Sie kubectl, um den Knoten mit einem Schlüssel-Wert-Paar zu kennzeichnen.

kubectl label nodes <node> <key>=<value>

Die Ausgabe bestätigt, dass das Label erfolgreich hinzugefügt wurde.

Schritt 2:Erstellen Sie eine Speicherklasse

StorageClass unterstützt Pods bei der Bereitstellung persistenter Volume-Ansprüche auf dem Knoten. So erstellen Sie eine StorageClass:

1. Erstellen Sie mit einem Texteditor eine YAML-Datei zum Speichern der Speicherklassenkonfiguration.

nano StorageClass.yaml

2. Geben Sie Ihre Speicherklassenkonfiguration in der Datei an. Das folgende Beispiel definiert die mongodb-storageclass :

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mongodb-storageclass
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

3. Speichern Sie die Änderungen und verlassen Sie den Editor.

Schritt 3:Persistenten Speicher erstellen

Stellen Sie Speicher für die MongoDB-Bereitstellung bereit, indem Sie ein persistentes Volume und einen Anspruch auf persistentes Volume erstellen:

1. Erstellen Sie eine YAML-Datei für die Konfiguration des persistenten Volumes.

nano PersistentVolume.yaml

2. Ordnen Sie in der Datei Speicher zu, der zu der im vorherigen Schritt definierten Speicherklasse gehört. Geben Sie den Knoten an, der bei der Pod-Bereitstellung in nodeAffinity verwendet wird Sektion. Der Knoten wird anhand des in Schritt 1 erstellten Labels identifiziert .

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. Erstellen Sie eine weitere YAML-Datei für die Konfiguration des persistenten Volume-Claims:

nano PersistentVolumeClaim.yaml

4. Definieren Sie den Claim mit dem Namen mongodb-pvc und Kubernetes anweisen, Volumes zu beanspruchen, die zu mongodb-storageclass gehören .

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mongodb-pvc
spec:
  storageClassName: mongodb-storageclass
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi

Schritt 4:Erstellen Sie eine ConfigMap

Die ConfigMap-Datei speichert unverschlüsselte Konfigurationsinformationen, die von Pods verwendet werden.

1. Erstellen Sie eine YAML-Datei zum Speichern der Bereitstellungskonfiguration:

nano ConfigMap.yaml

2. Verwenden Sie die Datei, um Informationen zu Systempfaden, Benutzern und Rollen zu speichern. Das Folgende ist ein Beispiel für eine ConfigMap-Datei:

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;
          }
        }
      });

Schritt 5:Erstellen Sie ein StatefulSet

StatefulSet ist ein Kubernetes-Controller, der zum Bereitstellen von zustandsbehafteten Apps verwendet wird. Zustandsbehaftete App-Pods erfordern eindeutige Identitäten, da sie mit anderen Pods kommunizieren.

So erstellen Sie ein StatefulSet :

1. Verwenden Sie einen Texteditor, um eine YAML-Datei zu erstellen:

nano StatefulSet.yaml

2. Fügen Sie Bereitstellungsinformationen in die Datei ein, einschließlich des zu verwendenden MongoDB-Docker-Images. Die Datei verweist auch auf die zuvor erstellte ConfigMap und 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

Schritt 6:Erstellen Sie ein Geheimnis

Das Secret-Objekt wird verwendet, um vertrauliche Informationen über die Bereitstellung zu speichern.

1. Erstellen Sie mit Ihrem Texteditor eine geheime YAML-Datei.

nano Secret.yaml

2. Geben Sie Informationen für den Zugriff auf die MongoDB-Datenbank an.

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. Speichern Sie die Änderungen und beenden Sie.

Schritt 7:Erstellen Sie einen MongoDB-Dienst

So erstellen Sie einen MongoDB-Dienst:

1. Erstellen Sie ein Headless-Service-Objekt.

nano Service.yaml

Der Headless-Dienst ermöglicht es Benutzern, sich direkt mit Pods zu verbinden.

2. Fügen Sie den Dienstnamen und die Definition in der YAML-Datei hinzu.

apiVersion: v1
kind: Service
metadata:
  name: mongodb-test
  labels:
    app: database
spec:
  clusterIP: None
  selector:
    app: database

3. Speichern Sie die Änderungen und beenden Sie die Datei.

Schritt 8:Wenden Sie die MongoDB-Konfiguration mit Kustomize an

Verwenden Sie Kustomize, um die MongoDB-Konfigurationsdateien einfach anzuwenden:

1. Erstellen Sie eine kustomization.yaml Datei:

nano kustomization.yaml

2. In den resources Listen Sie im Abschnitt alle YAML-Dateien auf, die in den vorherigen Schritten erstellt wurden:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - ConfigMap.yaml
  - PersistentVolumeClaim.yaml
  - PersistentVolume.yaml
  - Secret.yaml
  - Service.yaml
  - StatefulSet.yaml
  - StorageClass.yaml

Speichern Sie die Datei im selben Verzeichnis wie die anderen Dateien.

3. Stellen Sie MongoDB mit dem folgenden Befehl bereit:

kubectl apply -k .

4. Verwenden Sie kubectl, um zu prüfen, ob der Pod bereit ist.

kubectl get pod

Wenn der Pod 1/1 anzeigt in READY Spalte, fahren Sie mit dem nächsten Schritt fort.

Schritt 9:Verbindung zur eigenständigen MongoDB-Instanz herstellen

1. Stellen Sie mit dem folgenden kubectl-Befehl eine Verbindung zum MongoDB-Pod her:

kubectl exec -it mongodb-test-0 -- sh

2. Wenn # Eingabeaufforderung erscheint, geben Sie ein:

mongo

MongoDB-Shell wird geladen.

3. Wechseln Sie zur Testdatenbank:

use test

4. Authentifizieren Sie sich mit dem folgenden Befehl:

db.auth('[username]','[password]')

Zahl 1 in der Ausgabe bestätigt die erfolgreiche Authentifizierung.

Stellen Sie ein ReplicaSet bereit

MongoDB als ReplicaSet bereitstellen stellt sicher, dass die angegebene Anzahl von Pods zu einem bestimmten Zeitpunkt ausgeführt wird. ReplicaSet-Bereitstellungen werden für Produktionsumgebungen empfohlen.

Schritt 1:Rollenbasierte Zugriffskontrolle (RBAC) einrichten

Die Aktivierung der rollenbasierten Zugriffssteuerung ist eine der Best Practices für die Kubernetes-Sicherheit. RBAC stellt sicher, dass kein Benutzer mehr Berechtigungen als nötig hat.

So richten Sie RBAC ein:

1. Erstellen Sie eine YAML-Datei mit einem Texteditor.

nano rbac.yaml

2. Geben Sie Zugriffsregeln für Ihre MongoDB-Bereitstellung an. Das folgende Beispiel zeigt eine RBAC-YAML-Datei:

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. Speichern Sie die Datei und wenden Sie sie mit kubectl an:

kubectl apply -f rbac.yaml

Schritt 2:Erstellen Sie eine StatefulSet-Bereitstellung

1. Erstellen Sie eine StatefulSet-Bereitstellungs-YAML:

nano StatefulSet.yaml

2. Geben Sie die Anzahl der Replikate in der Datei und das zu verwendende MongoDB-Docker-Image an und stellen Sie eine Volume-Claim-Vorlage für die Bereitstellung dynamischer Volumes bereit:

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. Speichern Sie die Datei und verwenden Sie kubectl apply, um eine Bereitstellung zu erstellen:

kubectl apply -f StatefulSet.yaml

Schritt 3:Erstellen Sie einen Headless-Dienst

So erstellen Sie einen kopflosen Dienst:

1. Erstellen Sie eine Dienst-YAML-Datei:

nano Service.yaml

2. Definieren Sie einen Dienst, der die direkte Kommunikation mit Pods ermöglicht:

apiVersion: v1
kind: Service
metadata:
  name: mongo
  namespace: default
  labels:
    name: mongo
spec:
  ports:
    - port: 27017
      targetPort: 27017
  clusterIP: None
  selector:
    app: mongo

3. Wenden Sie YAML mit kubectl an.

kubectl apply -f Service.yaml

Schritt 4:Replikationshost einrichten

So richten Sie die Pod-Replikation ein:

1. Geben Sie den Pod mit kubectl exec ein :

kubectl exec -it mongodb-replica-0 -n default -- mongo

Die Willkommensnachricht der MongoDB-Shell wird angezeigt.

2. Starten Sie die Replikation, indem Sie den folgenden Befehl an der Eingabeaufforderung der MongoDB-Shell eingeben:

rs.initiate()

Das "ok" : 1 Linie zeigt an, dass die Initiierung erfolgreich war.

3. Definieren Sie die Variable namens cfg . Die Variable führt rs.conf() aus .

var cfg = rs.conf()

4. Verwenden Sie die Variable, um den primären Server zur Konfiguration hinzuzufügen:

cfg.members[0].host="mongodb-replica-0.mongo:27017"

Die Ausgabe zeigt den Namen des primären Servers.

5. Bestätigen Sie die Konfiguration, indem Sie den folgenden Befehl ausführen:

rs.reconfig(cfg)

Das "ok" : 1 Zeile bestätigt die erfolgreiche Konfiguration.

6. Verwenden Sie rs.add() Befehl, um einen weiteren Pod zur Konfiguration hinzuzufügen.

rs.add("mongodb-replica-1.mongo:27017")

Die Ausgabe zeigt, dass das Replikat hinzugefügt wurde.

7. Überprüfen Sie den Status des Systems, indem Sie Folgendes eingeben:

rs.status()

Die "members" Abschnitt sollte zwei Repliken zeigen. Das primäre Replikat wird oben in der Ausgabe aufgeführt.

Das sekundäre Replikat befindet sich unter dem primären Replikat.

Die ReplicaSet-Bereitstellung von MongoDB ist eingerichtet und betriebsbereit.


Linux
  1. So erstellen Sie eine Datenbank und Sammlung in MongoDB

  2. So starten Sie Kubernetes-Pods neu

  3. So stellen Sie Ihren ersten Pod in einem Kubernetes-Cluster bereit

  4. So erstellen Sie Git-Tags

  5. Wie man ein Skript ausführt??

So erstellen und verwalten Sie Kubernetes-Pods unter Linux

So erstellen und führen Sie eine Ansible Playbook-Datei aus

So erstellen und führen Sie ein Shell-Skript in Debian 10 aus

So erstellen und führen Sie ein Shell-Skript in CentOS 8 aus

So führen Sie ein Bash-Skript aus

So erstellen und führen Sie ein Shell-Skript in Ubuntu 22.04 aus