Mehrknoten-Apache-Cassandra-Cluster auf Kubernetes mit dem K8ssandra Operator bereitstellen

Apache Cassandra ist eine extrem skalierbare, verteilte NoSQL-Datenbank, die dafür entwickelt wurde, sehr große Datenmengen über viele Standard-Server hinweg zu verarbeiten. Durch die verteilte Architektur werden Single Points of Failure vermieden und eine unkomplizierte horizontale Skalierung ermöglicht. Cassandra ist besonders stark bei schreibintensiven Workloads und liefert hohe Schreib- und Leseperformance, was sie zur idealen Wahl für datenintensive Anwendungen macht. Gleichzeitig erlaubt sie eine fein abstimmbare Konsistenz, sodass sich das Konsistenzniveau an die Anforderungen der Anwendung anpassen lässt.

K8ssandra ist ein Open-Source-Projekt, das die Bereitstellung und den Betrieb von Apache Cassandra auf Kubernetes deutlich vereinfacht. Es umfasst den K8ssandra Operator, der zentrale Aufgaben wie Cluster-Provisionierung, Skalierung, Backups und Reparaturen automatisiert.

Diese Anleitung zeigt, wie du mit dem K8ssandra Operator ein Mehrknoten-Apache-Cassandra-Cluster auf einer Kubernetes Engine ausrollst.

Voraussetzungen

Bevor du loslegst, stelle sicher, dass du:

  • Zugriff auf eine Kubernetes Engine mit mindestens 4 Nodes und mindestens 4 GB RAM pro Node hast.
  • Einen Ubuntu Server als Nicht-Root-User mit sudo-Rechten als Control-Plane-System zur Verfügung hast.
  • Kubectl auf deiner Workstation installiert hast.
  • Den Helm Package Manager auf deiner Workstation installiert hast.
  • Deine Cluster-Kubeconfig-Datei besitzt und kubectl auf deiner Workstation so konfiguriert hast, dass es sich mit dem Cluster verbindet.

Cassandra CLI (cqlsh) installieren

Die Cassandra-CLI cqlsh ist ein Python-basiertes Kommandozeilenwerkzeug, mit dem du mit Cassandra-Datenbanken arbeiten kannst. Folge den Schritten unten, um es zu installieren.

Paketindex des Servers aktualisieren

Python und Pip installieren

$ sudo apt install -y python3 python3-pip python3.12-venv

Installierte Python-Version prüfen

Die Ausgabe sollte etwa so aussehen:

Installierte Pip-Version prüfen

Die Ausgabe sollte etwa so aussehen:

pip 24.2 from /usr/lib/python3/dist-packages/pip (python 3.12)

Python-virtuelle Umgebung erstellen

$ python3 -m venv cassandra

Python-virtuelle Umgebung aktivieren

$ source cassandra/bin/activate

Aktuellste cqlsh-CLI installieren

Installiere die neueste Version der cqlsh-Kommandozeilenschnittstelle:

Installierte cqlsh-Version verifizieren

Die Ausgabe sollte etwa so aussehen:

Cert-Manager installieren

Cert-Manager ist ein Kubernetes-Operator, der TLS/SSL-Zertifikate innerhalb eines Clusters von vertrauenswürdigen Stellen wie Let’s Encrypt ausstellt und verwaltet. K8ssandra nutzt cert-manager, um die Zertifikatsverwaltung in Cassandra-Clustern zu automatisieren. Dazu gehört auch das Erstellen der Java-KeyStores und TrustStores, die Cassandra aus den Zertifikaten benötigt. Folge den Schritten unten, um die für den K8ssandra Operator relevanten cert-manager-Komponenten zu installieren.

Cert-Manager-Helm-Repository hinzufügen

Füge mit Helm das Cert-Manager-Repository zu deinen lokalen Chart-Quellen hinzu.

$ helm repo add jetstack https://charts.jetstack.io

Helm-Chart-Index aktualisieren

Cert-Manager im Cluster installieren

Installiere Cert-Manager in deinem Kubernetes-Engine-Cluster.

$ helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set crds.enabled=true

Prüfen, ob Cert-Manager-Ressourcen laufen

Nach der erfolgreichen Installation überprüfe, ob alle Cert-Manager-Ressourcen im Cluster vorhanden sind.

$ kubectl get all -n cert-manager

Die Ausgabe sollte in etwa wie im folgenden Beispiel aussehen:

NAME                                           READY   STATUS    RESTARTS   AGE
pod/cert-manager-cainjector-686546c9f7-m9gp7   1/1     Running   0          43s
pod/cert-manager-d6746cf45-sjjs6               1/1     Running   0          43s
...
NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)            AGE
service/cert-manager              ClusterIP   10.110.17.176           9402/TCP           44s
...
NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/cert-manager              1/1     1            1           43s
...
NAME                                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/cert-manager-cainjector-686546c9f7   1         1         1       43s
...

K8ssandra Operator installieren

Um Apache-Cassandra-Cluster auf Kubernetes zu betreiben, installiere den K8ssandra Operator mit Helm. Folge den Schritten unten, um den Operator bereitzustellen.

K8ssandra-Helm-Repository hinzufügen

Füge das Repository des K8ssandra Operators zu deinen Helm-Quellen hinzu.

$ helm repo add k8ssandra https://helm.k8ssandra.io/stable

K8ssandra Operator installieren

Installiere den K8ssandra Operator in deinem Cluster.

$ helm install k8ssandra-operator k8ssandra/k8ssandra-operator \
  --namespace k8ssandra-operator \
  --create-namespace

Operator-Deployment überprüfen

Überprüfe nach einigen Minuten das Deployment, um sicherzugehen, dass der K8ssandra Operator verfügbar ist.

$ kubectl -n k8ssandra-operator get deployment

Die Ausgabe sollte etwa so aussehen:

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
k8ssandra-operator                 1/1     1            1           20s
k8ssandra-operator-cass-operator   1/1     1            1           20s

Sicherstellen, dass die Operator-Pods laufen

Stelle sicher, dass die Pods des K8ssandra Operators bereit sind und den Status „Running“ haben.

$ kubectl get pods -n k8ssandra-operator

Die Ausgabe sollte etwa so aussehen:

NAME                                                READY   STATUS    RESTARTS   AGE
k8ssandra-operator-65b9c7c9c-km28b                  1/1     Running   0          46s
k8ssandra-operator-cass-operator-54845bc4f6-hsqds   1/1     Running   0

Mehrknoten-Apache-Cassandra-Cluster auf Kubernetes Engine einrichten

Setze mit dem K8ssandra Operator ein hochverfügbares Cassandra-Cluster auf einer Kubernetes Engine auf. Nutze die nachfolgenden Schritte, um ein Apache-Cassandra-Cluster zu erstellen und in Betrieb zu nehmen.

StorageClasses im Cluster prüfen

Liste zuerst die StorageClasses auf, die in deinem Cluster verfügbar sind.

 

 

$ kubectl get storageclass

Deine Ausgabe sollte dem folgenden Beispiel ähneln:

NAME                             PROVISIONER           RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
centron-block-storage (default)  block.csi.centron.de  Delete          Immediate           true                   6m24s
centron-block-storage-hdd        block.csi.centron.de  Delete          Immediate           true                   6m25s
centron-block-storage-hdd-retain block.csi.centron.de  Retain          Immediate           true                   6m25s
...

Cassandra-Cluster-Manifest erstellen

Erstelle mit einem Texteditor wie nano eine neue Manifest-Datei namens cluster.yaml.

Füge den folgenden Inhalt in die Datei ein. Ersetze centron-block-storage durch die StorageClass, die in deinem Cluster vorhanden ist (wie im vorherigen Schritt angezeigt).

apiVersion: k8ssandra.io/v1alpha1
kind: K8ssandraCluster
metadata:
  name: demo
spec:
  cassandra:
    serverVersion: "4.0.1"
    datacenters:
      - metadata:
          name: dc1
        size: 3
        storageConfig:
          cassandraDataVolumeClaimSpec:
            storageClassName: centron-block-storage
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 10Gi
        config:
          jvmOptions:
            heapSize: 512M
        stargate:
          size: 1
          heapSize: 256M

Speichere die Datei und schließe den Editor.

Dieses Manifest legt den Cassandra-Cluster mit folgenden Einstellungen fest:

  • Cassandra-Version: 4.0.1
  • Drei Worker-Nodes im Cluster.
  • Die StorageClass centron-block-storage mit je 10 GB persistentem Volume pro Node.
  • JVM-Heap-Größe pro Cassandra-Node auf 512 MB gesetzt.
  • JVM-Heap-Größe für Stargate auf 256 MB festgelegt.

Hinweis
Wenn du dies auf der Kubernetes Engine von centron betreibst, stelle sicher, dass der centron-CSI-Treiber vor dem Deployment mit den notwendigen Zugangsdaten konfiguriert ist. Dadurch ist die dynamische Bereitstellung von Block-Storage-Volumes möglich. Sieh in der centron-CSI-Dokumentation nach, um die vollständigen Einrichtungsschritte zu erhalten.

Cluster-Deployment anwenden

Wende das Manifest in deinem Cluster an.

$ kubectl apply -n k8ssandra-operator -f cluster.yaml

Warte mindestens 15 Minuten und beobachte anschließend die Cluster-Pods.

$ kubectl get pods -n k8ssandra-operator --watch

Stelle sicher, dass alle Pods bereit sind und laufen, ähnlich wie hier:

NAME                                                    READY   STATUS    RESTARTS   AGE
demo-dc1-default-stargate-deployment-64747477d7-hfck9   1/1     Running   0          78s
demo-dc1-default-sts-0                                  2/2     Running   0          6m5s
demo-dc1-default-sts-1                                  2/2     Running   0          6m5s
demo-dc1-default-sts-2                                  2/2     Running   0          6m5s
k8ssandra-operator-65b9c7c9c-km28b                      1/1     Running   0          17m
k8ssandra-operator-cass-operator-54845bc4f6-hsqds       1/1     Running   0          17m

Sobald alle Cassandra-Datenbank-Pods gesund sind, beginnen die Stargate-Pods mit der Initialisierung. Stargate dient als Daten-Gateway und stellt REST-, GraphQL- und Document-APIs vor Cassandra bereit. Der Stargate-Pod-Name sollte einem Muster wie demo-dc1-default-stargate-deployment-xxxxxxxxx-xxxxx folgen.

Verknüpfte Block-Storage-PVCs für dauerhafte Cassandra-Daten prüfen

Der K8ssandra Operator deployt Cassandra-Pods als StatefulSets, damit stabile Netzwerkidentitäten und persistenter Speicher gewährleistet sind. Jedes StatefulSet steht für einen Cassandra-Node und verwendet eine Persistent Volume Claim (PVC), um Daten zuverlässig zu speichern. Dieser Abschnitt zeigt, wie du bestätigst, dass die PVCs über den Block-Storage-Dienst deiner Kubernetes Engine angelegt werden.

Bereitschaft der StatefulSets prüfen

Überprüfe, dass die StatefulSets vorhanden und bereit sind.

$ kubectl get statefulset -n k8ssandra-operator

Deine Ausgabe sollte dem folgenden Beispiel entsprechen:

NAME                   READY   AGE
demo-dc1-default-sts   3/3     7m14s

Diese Ausgabe bestätigt, dass alle drei Cassandra-Nodes laufen und das StatefulSet aktiv ist.

StorageClass verifizieren

Prüfe die StorageClass, die die Volumes deines Clusters bereitstellt.

$ kubectl get sc centron-block-storage

Deine Ausgabe sollte dem folgenden Beispiel ähneln:

NAME                             PROVISIONER           RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
centron-block-storage (default)  block.csi.centron.de  Delete          Immediate           true                   24m

PVCs über alle Namespaces auflisten

Liste alle PVCs in sämtlichen Namespaces auf, um sicherzustellen, dass sie korrekt gebunden sind.

$ kubectl get pvc --all-namespaces

Deine Ausgabe sollte dem folgenden Beispiel ähneln:

NAMESPACE            NAME                                 STATUS   VOLUME                 CAPACITY   ACCESS MODES   STORAGECLASS           VOLUMEATTRIBUTESCLASS   AGE
k8ssandra-operator   server-data-demo-dc1-default-sts-0   Bound    pvc-a62852bae9d24dad   10Gi       RWO            centron-block-storage                   13m
k8ssandra-operator   server-data-demo-dc1-default-sts-1   Bound    pvc-cfb279b19d0c4a55   10Gi       RWO            centron-block-storage                   13m
k8ssandra-operator   server-data-demo-dc1-default-sts-2   Bound    pvc-b09e184f4d7741f6   10Gi       RWO            centron-block-storage                   13m

Kubernetes-Service erstellen, um auf den Cassandra-Cluster zuzugreifen

Damit der Cassandra-Cluster von außen erreichbar ist und Verbindungen über das native Cassandra-Protokoll (CQL) auf Port 9042 akzeptiert, brauchst du einen Kubernetes Service vom Typ LoadBalancer. Dadurch wird über die Load-Balancer-Integration eine öffentliche IP zugewiesen.

Service-Manifest erstellen

Erstelle eine neue Service-Datei namens service.yaml.

Füge den folgenden Inhalt in die Datei ein.

apiVersion: v1
kind: Service
metadata:
  name: cassandra
  labels:
    app: cassandra
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
    - port: 9042
      targetPort: 9042
  selector:
    app.kubernetes.io/name: cassandra

Speichere die Datei und schließe den Editor.

Diese Konfiguration definiert einen LoadBalancer-Service, der den Cassandra-Cluster auf Port 9042 nach außen freigibt.

Service anwenden

Wende den Service im Namespace k8ssandra-operator an.

$ kubectl apply -n k8ssandra-operator -f service.yaml

Warte ungefähr 5 Minuten, bis der LoadBalancer erstellt ist, und prüfe dann den Cassandra-Service.

$ kubectl get svc/cassandra -n k8ssandra-operator

Sieh dir das Feld External-IP an und notiere die IP-Adresse für den Zugriff auf den Cluster.

NAME        TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
cassandra   LoadBalancer   10.103.92.169   192.0.2.1     9042:32444/TCP   2m12s

Hinweis
Wenn bei EXTERNAL-IP der Wert <pending> steht, warte etwas länger und führe den Befehl erneut aus. Sobald eine IP zugewiesen wurde, kannst du dich damit über einen CQL-Client wie cqlsh mit Cassandra verbinden.

Apache-Cassandra-Cluster testen

cqlsh ist ein Kommandozeilenwerkzeug, um eine Verbindung zu Cassandra herzustellen. Die Schritte unten zeigen, wie du CQL-Befehle (Cassandra Query Language) ausführst und Aktionen wie das Erstellen, Aktualisieren und Abfragen von Daten durchführst.

LoadBalancer-IP exportieren

Lege die LoadBalancer-IP deines Cassandra-Services in der Variablen CASS_IP ab.

$ CASS_IP=$(kubectl get svc cassandra -n k8ssandra-operator -o jsonpath="{.status.loadBalancer.ingress[*].ip}")

Gib die zugewiesene Cassandra-IP aus.

Cluster-Benutzernamen exportieren

Schreibe den Zugriffs-Benutzernamen des Clusters in die Variable CASS_USERNAME.

$ CASS_USERNAME=$(kubectl get secret demo-superuser -n k8ssandra-operator -o=jsonpath='{.data.username}' | base64 --decode)

Gib den Cassandra-Benutzernamen aus.

Cluster-Passwort exportieren

Schreibe das Cluster-Passwort in die Variable CASS_PASSWORD.

$ CASS_PASSWORD=$(kubectl get secret demo-superuser -n k8ssandra-operator -o=jsonpath='{.data.password}' | base64 --decode)

Gib das Cassandra-Passwort aus.

Mit cqlsh anmelden

Verbinde dich mit cqlsh anhand der gesetzten Variablen mit dem Cassandra-Cluster.

$ cqlsh -u $CASS_USERNAME -p $CASS_PASSWORD $CASS_IP 9042

Keyspace erstellen

Lege einen neuen Keyspace mit dem Namen demo an.

demo-superuser@cqlsh> CREATE KEYSPACE demo WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};

Tabelle erstellen

Erstelle im Keyspace demo eine Tabelle namens users.

demo-superuser@cqlsh> CREATE TABLE demo.users (id text primary key, name text, country text);

Datensätze einfügen

Füge Beispiel-Datensätze in die users-Tabelle ein.

demo-superuser@cqlsh> BEGIN BATCH
                         INSERT INTO demo.users (id, name, country) VALUES ('42', 'John Doe', 'UK');
                         INSERT INTO demo.users (id, name, country) VALUES ('43', 'Joe Smith', 'US');
                      APPLY BATCH;

Daten abfragen

Frage die Tabelle ab, um die gespeicherten Werte anzuzeigen.

demo-superuser@cqlsh> SELECT * FROM demo.users;

Deine Ausgabe sollte in etwa so aussehen:

 id | country | name
----+---------+-----------
 43 |      US | Joe Smith
 42 |      UK |  John Doe

(2 rows)

Fazit

Du hast mit dem Open-Source-K8ssandra Operator erfolgreich ein Apache-Cassandra-Cluster auf einer Kubernetes-Engine-Umgebung eingerichtet. Persistenter Speicher wurde über Block Storage aktiviert und der Zugriff auf den Cassandra-Cluster erfolgte über die cqlsh-CLI. Für weiterführende Konfigurationsmöglichkeiten und komplexere Anwendungsfälle solltest du die offizielle Cassandra-Dokumentation zu Rate ziehen.

Quelle: vultr.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren:

Moderne Hosting Services mit Cloud Server, Managed Server und skalierbarem Cloud Hosting für professionelle IT-Infrastrukturen

TensorRT und ONNX: High-Performance-ML auf NVIDIA-GPUs

AI/ML, Tutorial
Vijonavor 23 mins Machine-Learning-Frameworks, Modell-Tools und Deployment-Strategien in der ML-Pipeline Machine-Learning-Frameworks, spezialisierte Modell-Tools und Deployment-Lösungen übernehmen jeweils unterschiedliche Aufgaben innerhalb eines Machine-Learning-(ML)-Workflows. In jeder Phase – von der Modellerstellung über…