Cassandra cluster sur kubernetes: Déployer un cluster cassandra avec l'opérateur k8ssandra-operator et déployer un cluster K8ssandraCluster hautement disponible
Dans cet article, nous allons explorer comment déployer K8ssandra-operator, une distribution de Apache Cassandra optimisée pour Kubernetes. Nous déploierons un cluster Cassandra et quelques commandes…

Dans cet article, nous allons explorer comment déployer K8ssandra-operator, une distribution de Apache Cassandra optimisée pour Kubernetes. Nous déploierons un cluster Cassandra et quelques commandes de tests.
Introduction à K8ssandra
K8ssandra est une plateforme de gestion de Apache Cassandra dans Kubernetes. Elle offre une solution clé-en-main avec des outils tels que :
- Cassandra : Une base de données distribuée robuste et scalable.
- Stargate : Une API REST et GraphQL pour interagir facilement avec Cassandra.
- Metrics Collector : Pour la supervision.
- Reaper : Pour la réparation automatique des clusters Cassandra.
Prérequis
Avant de commencer, assurez-vous que les éléments suivants sont en place :
- Clusters Kubernetes accessible avec kubectl: un exmple ici
- Helm : Pour installer K8ssandra Operator.
- Espace disque : Minimum 5 Go pour Cassandra, Memoire: 4GB, vCPU: 3
1. Déployer cert-manager
L'opérateur K8ssandra a une dépendance sur cert-manager, qui doit être installé dans le cluster.
- Ajouter le repo helm de cert-manager :
helm repo add jetstack https://charts.jetstack.io
helm repo update
- Installez maintenant le jetstack/cert-manager:
helm upgrade --install cert-manager jetstack/cert-manager --n cert-manager --create-namespace --set installCRDs=true
kubectl get po -n cert-manager
2. Déployer K8ssandra Operator
On peut déployer K8ssandra Operator pour des opérations à l'échelle d'un seul namesapce ou des opérations à l'échelle du cluster (all namespaces).
- Le déploiement de opérateur à l'échelle d’un seul namespace signifie que les futures cluster cassandra seront deployés dans uniquement ce namespace.
- Le déploiement de opérateur à l'échelle cluster signifie que les clusters cassandra pourront être déployés dans des namespaces differents de celui où l'opérateur est déployé.
Dans notre test l'opérateur dera déployé à l'echelle cluster. On aura ainsi un nemaspace pour l'opérateur et un autre pour le cluster cassandra.
- Ajouter le repo helm de l'operateur
helm repo add k8ssandra https://helm.k8ssandra.io/stable
helm repo update
- Installez l'operateur le jetstack/cert-manager: il suffit d'enlever --set global.clusterScoped=true pour restreindre à un seul namespace.
helm upgrade --install k8ssandra-operator k8ssandra/k8ssandra-operator -n cassandra-op --create-namespace --set global.clusterScoped=true
kubectl get po -n cassandra-op

3. Créer le manifeste K8ssandraCluster
Créez un fichier nommé k8ssandra-cluster.yaml pour définir le cluster Cassandra suivant :
apiVersion: k8ssandra.io/v1alpha1
kind: K8ssandraCluster
metadata:
name: cassandra-cluster
spec:
cassandra:
serverVersion: "4.0.1"
datacenters:
- metadata:
name: prod
racks:
- name: logs
size: 3
storageConfig:
cassandraDataVolumeClaimSpec:
storageClassName: local-path
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
config:
jvmOptions:
heapSize: 512M
stargate:
size: 1
heapSize: 256M
Ce manifeste YAML définit un objet Kubernetes de type K8ssandraCluster, utilisé pour configurer et déployer un cluster Apache Cassandra géré par K8ssandra Operator. Voici une explication détaillée des différents champs et leur rôle dans la configuration :
- apiVersion : La version de l'API K8ssandra utilisée.
- kind : Type de ressource, ici un K8ssandraCluster, qui est une abstraction pour déployer et gérer des clusters Cassandra sur Kubernetes.
- metadata.name : Nom de l'objet Kubernetes. Ce nom est utilisé pour identifier le cluster dans Kubernetes.
- spec.cassandra.serverVersion : Version d'Apache Cassandra à déployer. Ici, c'est la version 4.0.1.
- datacenters : Liste des datacenters à configurer dans le cluster Cassandra. Cela permet de deployer des clusters cassandra sur un ensemble de cluster k8s.
- datacenters[0].metadata.name : Nom du datacenter, ici dcie. Ce nom est utilisé pour différencier les datacenters dans un déploiement multi-datacenters.
- racks : Définit les racks physiques ou logiques dans le datacenter Cassandra. Utile pour appluqer des nodeAffinityLabels
- racks[0].name : Nom du rack, ici prod. Les racks permettent une distribution fine des données dans le datacenter, utile pour garantir la tolérance aux pannes.
- size : Nombre de nœuds (pods) Cassandra à déployer dans ce datacenter. Ici, 3 nœuds sont configurés.
- storageConfig.cassandraDataVolumeClaimSpec : Spécifie la configuration de stockage pour les données Cassandra.
- storageClassName : La classe de stockage utilisée, ici local-path.
- accessModes : Mode d'accès au stockage. ReadWriteOnce signifie qu'un seul nœud peut monter le volume en écriture.
- resources.requests.storage : Quantité de stockage demandée par chaque pod Cassandra, ici 1Gi.
- config.jvmOptions.heapSize : Taille de la mémoire allouée à la JVM pour chaque nœud Cassandra, ici 512M.
- stargate : Configure le déploiement de Stargate, une passerelle qui fournit des API REST, GraphQL et DocumentDB pour accéder à Cassandra.
- size : Nombre de pods Stargate à déployer, ici 1.
- heapSize : Taille de la mémoire JVM pour Stargate, ici 256M.
Résumé
Ce CustomResource configure un cluster Cassandra géré par K8ssandra avec les caractéristiques suivantes :
- Un seul datacenter nommé dcie, contenant :
- 3 nœuds Cassandra (pods).
- 1 rack nommé prod.
- Chaque nœud utilise 1 GiB de stockage local.
- Cassandra est configuré avec 512M de heap JVM.
- Un service Stargate est déployé avec 256M de heap JVM, facilitant l'accès aux données via des API modernes.
- Créez le K8ssandraCluster avec kubectl apply dans le namespace cassandra-db:
kubectl create ns cassandra-db
kubectl apply -n k8ssandra-operator -f k8ssandra-cluster.yaml -n cassandra-db
kubectl get po -n cassandra-db -o wide

4. Quelques opérations d'admin
- Vérifier K8ssandraClusterle déploiement
kubectl get k8cs -n cassandra-db
kubectl describe k8cs cassandra-cluster -n cassandra-db
- Extraire les informations d'identification
CASS_USERNAME=$(kubectl get secret cassandra-cluster-superuser -n cassandra-db -o=jsonpath='{.data.username}' | base64 --decode)
echo $CASS_USERNAME
CASS_PASSWORD=$(kubectl get secret cassandra-cluster-superuser -n cassandra-db -o=jsonpath='{.data.password}' | base64 --decode)
echo $CASS_PASSWORD
- Vérifier l'état du cluster
- Tous les nœuds doivent avoir le statut UN, qui signifie « Up Normal ».
kubectl exec -it cassandra-cluster-prod-logs-sts-0 -n cassandra-db -c cassandra -- nodetool -u $CASS_USERNAME -pw $CASS_PASSWORD status

- Test de queleques opérations
- Créez un KEYSPACE dans la base de données Cassandra: logs_data
kubectl exec -it cassandra-cluster-prod-logs-sts-0 -n cassandra-db -c cassandra -- cqlsh -u $CASS_USERNAME -p $CASS_PASSWORD -e "CREATE KEYSPACE logs_data WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};"
-
- Créez une logs_data.userstable dans la base de données Cassandra déployée :
kubectl exec -it cassandra-cluster-prod-logs-sts-0 -n cassandra-db -c cassandra -- cqlsh -u $CASS_USERNAME -p $CASS_PASSWORD -e "CREATE TABLE logs_data.users (email text primary key, name text, state text);"
- Insérer quelques données dans le tableau :
kubectl exec -it cassandra-cluster-prod-logs-sts-0 -n cassandra-db -c cassandra -- cqlsh -u $CASS_USERNAME -p $CASS_PASSWORD -e "insert into logs_data.users (email, name, state) values ('john@gamil.com', 'John Smith', 'NC');"
kubectl exec -it cassandra-cluster-prod-logs-sts-0 -n cassandra-db -c cassandra -- cqlsh -u $CASS_USERNAME -p $CASS_PASSWORD -e "insert into logs_data.users (email, name, state) values ('joe@gamil.com', 'Joe Jones', 'VA');"
kubectl exec -it cassandra-cluster-prod-logs-sts-0 -n cassandra-db -c cassandra -- cqlsh -u $CASS_USERNAME -p $CASS_PASSWORD -e "insert into logs_data.users (email, name, state) values ('sue@help.com', 'Sue Sas', 'CA');"
kubectl exec -it cassandra-cluster-prod-logs-sts-0 -n cassandra-db -c cassandra -- cqlsh -u $CASS_USERNAME -p $CASS_PASSWORD -e "insert into logs_data.users (email, name, state) values ('tom@yes.com', 'Tom and Jerry', 'NV');"
- Sélectionnez les données du tableau :
kubectl exec -it cassandra-cluster-prod-logs-sts-0 -n cassandra-db -c cassandra -- cqlsh -u $CASS_USERNAME -p $CASS_PASSWORD -e "select * from logs_data.users;"

- Testez une opération via l'API open source Stargate. Ouvrir un shell sur le un pod par exemple:
kubectl exec -it cassandra-cluster-prod-logs-sts-0 -n cassandra-db -- /bin/bash
- Connexion sur l'api stargate. Rceuperer le user CASS_USERNAME et le mot de passe CASS_PASSWORD
cqlsh -u cassandra-cluster-superuser -p zeW7YMUcIrQGyCDktpKF cassandra-cluster-prod-stargate-service

DESCRIBE KEYSPACES;
DESCRIBE KEYSPACE logs_data;
use logs_data;
select * from users;

Conclusion
Avec K8ssandra Operator, déployer et gérer Cassandra dans Kubernetes devient plus simple et plus performant.Il est possible désormais exploiter toute la puissance de Cassandra dans vos applications Kubernetes.
Liens de la documentation officielle:
https://docs.k8ssandra.io/reference/crd/cass-operator-crds-latest/
https://docs.k8ssandra.io/install/local/multi-cluster-helm/
https://docs.k8ssandra.io/quickstarts/samples/
https://github.com/k8ssandra/k8ssandra-operator
https://github.com/k8ssandra/k8ssandra-operator/tree/main/charts/k8ssandra-operator
N'hésitez pas à laisser des commentaires si vous avez des questions ou des suggestions !
Commentaires
Aucun commentaire pour le moment.