Illustration Image

Cassandra.Link

The best knowledge base on Apache Cassandra®

Helping platform leaders, architects, engineers, and operators build scalable real time data platforms.

5/24/2019

Reading time:6 min

Orange-OpenSource/cassandra-k8s-operator

by John Doe

Project overviewThe CassKop Cassandra Kubernetes operator makes it easy to run Apache Cassandra on Kubernetes. Apache Cassandra is a popular,free, open-source, distributed wide column store, NoSQL database management system.The operator allows to easily create and manage racks and data centers aware Cassandra clusters.The Cassandra operator is based on the CoreOSoperator-sdk tools and APIs.NOTE: This is an alpha-status project. We do regular tests on the code and functionality, but we can not assure aproduction-ready stability at this time.Our goal is to make it run in production as quickly as possible.CassKop creates/configures/manages Cassandra clusters atop Kubernetes and is by default space-scoped which meansthat :CassKop is able to manage X Cassandra clusters in one Kubernetes namespace.You need X instances of CassKop to manage Y Cassandra clusters in X different namespaces (1 instance of CassKopper namespace).This adds security between namespaces with a better isolation, and less work for each operator.TL;DR - CassKop presentationWe have some slides for a CassKop demoCassKop featuresAt this time of the project, the goal is to deploy a Cassandra cluster in 1 Kubernetes datacenter, but this willchange in next versions to deal with Kubernetes in multi-datacenters.The following features are supported by CassKop: Deployment of a C* cluster (rack or AZ aware) Scaling up the cluster (with cleanup) Scaling down the cluster (with decommission prior to Kubernetes scale down) Pods operations (removenode, upgradesstable, cleanup, rebuild..) Adding a Cassandra DC Removing a Cassandra DC Setting and modifying configuration files Setting and modifying configuration parameters Update of the Cassandra docker image Rolling update of a Cassandra cluster Update of Cassandra version (including upgradesstable in case of major upgrade) Update of JVM Update of configuration Rolling restart of a Cassandra rack Stopping a Kubernetes node for maintenance Process a remove node (and create new Cassandra node on another Kubernetes node) Process a replace address (of the old Cassandra node on another Kubernetes node) Manage operations on pods through CassKop plugin (cleanup, rebuild, upgradesstable, removenode..) Monitoring (using Instaclustr Prometheus exporter to Prometheus/Grafana) Performing live backup of Cassandra datas (using Instaclustr sidecar) Performing live restore of datas (using Instaclustr sidecar) Performing live Cassandra repairs through the use of Cassandra reaper Pause/Restart operations through CassKoP plugin.CassKop doesn't use nodetool but invokes operations through authenticated JMX/Jolokia callPre-requisitesFor developersOperator SDK is part of the operator framework provided by RedHat & CoreOS. The goalis to provide high-level abstractions that simplifies creating Kubernetes operators.The quick start guide walks through the process of building the Cassandra operatorusing the SDK CLI, setting up the RBAC, deploying the operator and creating aCassandra cluster.You can find this in the Developer sectionFor usersUsers should only need Kubectl & helm clikubectl version v1.13.3+.Helm version v2.12.2+.Access to a Kubernetes v1.13.3+ cluster.Cassandra needs fast local storage (we have tested with local storageprovisioner, GKE ssd storage, and Rancher local-path-provisioner)Install CassKop kubectl pluginYou can install the plugin by copying the file into your PATH.Build pipelinesWe uses CircleCI as our CI tool to build and test the operator.Build imageTo accelerate build phases we have created a custom build-image used by the CircleCI pipeline:https://cloud.docker.com/u/orangeopensource/repository/docker/orangeopensource/casskop-buildYou can find more info in the developer SectionCassandra operatorThe Cassandra operator image is automatically built and stored on Docker HubAssociated Cassandra imageThe operator works with specific Docker Cassandra image which is build in the repository:https://github.com/Orange-OpenSource/cassandra-imageThis table shows compatibility between CassKop and associated Cassandra imageOperatorCassandra-k8s0.3.1-release>= 3.11.4-8u212-0.3.1docker image: orangeopensource/cassandra-image:3.11.4-8u212-0.3.1Deploy the Cassandra operator in the clusterFirst, we need to create a Kubernetes namespace in order to host our operator & clusterkubectl create namespace cassandraFirst deploy the CassandraCluster CRD definitionBefore deploying the operator, we need to create the CRD (CassandraCluster Custom Resource Definition).Deploy RBAC and CassKop custom resource definitionkubectl apply -f deploy/crds/db_v1alpha1_cassandracluster_crd.yamlCheck that CRD is deployed$ kubectl get crdNAME AGE...cassandraclusters.db.orange.com 1h...With HelmTo ease the use of the Cassandra operator, a Helm charts has beencreatedWe are looking where to store our helm in the futureDeploy CassKop:$ helm install --name casskop ./helm/cassandra-k8s-operator  15:34:24 NAME: casskopLAST DEPLOYED: Thu May 23 15:34:27 2019NAMESPACE: cassandra-demoSTATUS: DEPLOYEDRESOURCES:==> v1/ServiceAccountNAME SECRETS AGEcassandra-k8s-operator 1 0s==> v1beta1/RoleNAME AGEcassandra-k8s-operator 0s==> v1/RoleBindingNAME AGEcassandra-k8s-operator 0s==> v1/DeploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEcasskop-cassandra-k8s-operator 1 1 1 0 0s==> v1/Pod(related)NAME READY STATUS RESTARTS AGEcasskop-cassandra-k8s-operator-78786b9bf-cjggg 0/1 ContainerCreating 00sYou can find more information in the Cassandra operator Helm readmeThis creates a Kubernetes Deployment for the operator, with RBAC settings.Once deployed, you may find the Pods created by the Charts. If you deploy a releasenamed casskop, then your pod will have a name similar to :$ kubectl get podNAME READY STATUS RESTARTS AGEcasskop-cassandra-k8s-operator-78786b9bf-cjggg 1/1 Running 0 1hYou can view the CassKop logs using$ kubectl logs -f cassandra-cassandra-k8s-operator-78786b9bf-cjgggDeploy a Cassandra clusterFrom local yaml specOnce the operator is deployed inside a Kubernetes cluster, a new API will be accessible, soyou'll be able to create, update and delete cassandraclusters.In order to deploy a new cassandra cluster a specificationhas to be created:For example :kubectl apply -f samples/cassandracluster.yamlsee pods coming into life :kubectl get pods -wYou can watch the status updates in real time on your CassandraCluster object :watch 'kubectl describe cassandracluster cassandra-demo | tail -20'Cassandra cluster statusYou can find mode information on the CassandraCluster.status in this sectionMake operation on the clusterYou can do a lot of operations on your Cassandra cluster.Cassandra operator recoveryIf the Cassandra operator restarts, it can recover its previous state thanks to the CRD objectsCassandraClusters which stored directly in Kubernetes, description and state of the Cassandra cluster.CleanupIf you want to delete the operator from your Kubernetes cluster, the operator deploymentshould be deleted.Also, the CRD has to be deleted too:kubectl delete crd cassandraclusters.dfy.orange.com!!!!!!!!WARNING!!!!!!!!If you delete the CRD then !!!!!!WAAAARRRRNNIIIIINNG!!!!!!It will delete ALL Clusters that has been created using this CRD!!!Please never delete a CRD without very very good careOperator SDKCassKop is build using operator SDK:MonitoringWe can quickly setup monitoring for our deployed Cassandra nodes usingPrometheus operator.Deploy PrometheusYou can deploy the CoreOs Prometheus operator on your cluster:You can find example helm value.yaml to configure the Prometheus operator:$ kubectl create namespace monitoring$ helm install --namespace monitoring --name prometheus stable/prometheus-operatorAdd ServiceMonitor for CassandraThen you have to define a ServiceMonitor object to monitorcluster deployed by your cassandra operator (one time), update this to specify which namespace to monitor.cassandra-service-monitor.ymlapiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata: name: kube-prometheus-cassandra-k8s-jmx labels: k8s-apps: cassandra-k8s-jmx prometheus: kube-prometheus component: cassandra release: prometheus spec: jobLabel: kube-prometheus-cassandra-k8s-jmx selector: matchLabels: k8s-app: exporter-cassandra-jmx namespaceSelector: matchNames: - cassandra - default endpoints: - port: http-promcassjmx interval: 15sYour namespace need to be listed in the namespaceSelector section.Add Grafana dashboard for CassandraYou can import this dashboard to retrieve metrics about your Cassandra cluster.

Illustration Image

CircleCI

Project overview

The CassKop Cassandra Kubernetes operator makes it easy to run Apache Cassandra on Kubernetes. Apache Cassandra is a popular, free, open-source, distributed wide column store, NoSQL database management system. The operator allows to easily create and manage racks and data centers aware Cassandra clusters.

The Cassandra operator is based on the CoreOS operator-sdk tools and APIs.

NOTE: This is an alpha-status project. We do regular tests on the code and functionality, but we can not assure a production-ready stability at this time. Our goal is to make it run in production as quickly as possible.

CassKop creates/configures/manages Cassandra clusters atop Kubernetes and is by default space-scoped which means that :

  • CassKop is able to manage X Cassandra clusters in one Kubernetes namespace.
  • You need X instances of CassKop to manage Y Cassandra clusters in X different namespaces (1 instance of CassKop per namespace).

This adds security between namespaces with a better isolation, and less work for each operator.

TL;DR - CassKop presentation

We have some slides for a CassKop demo

CassKop features

At this time of the project, the goal is to deploy a Cassandra cluster in 1 Kubernetes datacenter, but this will change in next versions to deal with Kubernetes in multi-datacenters.

The following features are supported by CassKop:

  • Deployment of a C* cluster (rack or AZ aware)
  • Scaling up the cluster (with cleanup)
  • Scaling down the cluster (with decommission prior to Kubernetes scale down)
  • Pods operations (removenode, upgradesstable, cleanup, rebuild..)
  • Adding a Cassandra DC
  • Removing a Cassandra DC
  • Setting and modifying configuration files
  • Setting and modifying configuration parameters
  • Update of the Cassandra docker image
  • Rolling update of a Cassandra cluster
    • Update of Cassandra version (including upgradesstable in case of major upgrade)
    • Update of JVM
    • Update of configuration
  • Rolling restart of a Cassandra rack
  • Stopping a Kubernetes node for maintenance
    • Process a remove node (and create new Cassandra node on another Kubernetes node)
    • Process a replace address (of the old Cassandra node on another Kubernetes node)
  • Manage operations on pods through CassKop plugin (cleanup, rebuild, upgradesstable, removenode..)
  • Monitoring (using Instaclustr Prometheus exporter to Prometheus/Grafana)
  • Performing live backup of Cassandra datas (using Instaclustr sidecar)
  • Performing live restore of datas (using Instaclustr sidecar)
  • Performing live Cassandra repairs through the use of Cassandra reaper
  • Pause/Restart operations through CassKoP plugin.

CassKop doesn't use nodetool but invokes operations through authenticated JMX/Jolokia call

Pre-requisites

For developers

Operator SDK is part of the operator framework provided by RedHat & CoreOS. The goal is to provide high-level abstractions that simplifies creating Kubernetes operators.

The quick start guide walks through the process of building the Cassandra operator using the SDK CLI, setting up the RBAC, deploying the operator and creating a Cassandra cluster.

You can find this in the Developer section

For users

Users should only need Kubectl & helm cli

  • kubectl version v1.13.3+.
  • Helm version v2.12.2+.
  • Access to a Kubernetes v1.13.3+ cluster.
  • Cassandra needs fast local storage (we have tested with local storage provisioner, GKE ssd storage, and Rancher local-path-provisioner)

Install CassKop kubectl plugin

You can install the plugin by copying the file into your PATH.

Build pipelines

We uses CircleCI as our CI tool to build and test the operator.

Build image

To accelerate build phases we have created a custom build-image used by the CircleCI pipeline:

https://cloud.docker.com/u/orangeopensource/repository/docker/orangeopensource/casskop-build

You can find more info in the developer Section

Cassandra operator

The Cassandra operator image is automatically built and stored on Docker Hub

CircleCI

Associated Cassandra image

The operator works with specific Docker Cassandra image which is build in the repository: https://github.com/Orange-OpenSource/cassandra-image

This table shows compatibility between CassKop and associated Cassandra image

Operator Cassandra-k8s
0.3.1-release >= 3.11.4-8u212-0.3.1

docker image: orangeopensource/cassandra-image:3.11.4-8u212-0.3.1

Deploy the Cassandra operator in the cluster

First, we need to create a Kubernetes namespace in order to host our operator & cluster

kubectl create namespace cassandra

First deploy the CassandraCluster CRD definition

Before deploying the operator, we need to create the CRD (CassandraCluster Custom Resource Definition).

Deploy RBAC and CassKop custom resource definition

kubectl apply -f deploy/crds/db_v1alpha1_cassandracluster_crd.yaml

Check that CRD is deployed

$ kubectl get crd
NAME                              AGE
...
cassandraclusters.db.orange.com   1h
...

With Helm

To ease the use of the Cassandra operator, a Helm charts has been created

We are looking where to store our helm in the future

Deploy CassKop:

$ helm install --name casskop ./helm/cassandra-k8s-operator                                                                                                                                15:34:24 
NAME:   casskop
LAST DEPLOYED: Thu May 23 15:34:27 2019
NAMESPACE: cassandra-demo
STATUS: DEPLOYED
RESOURCES:
==> v1/ServiceAccount
NAME                    SECRETS  AGE
cassandra-k8s-operator  1        0s
==> v1beta1/Role
NAME                    AGE
cassandra-k8s-operator  0s
==> v1/RoleBinding
NAME                    AGE
cassandra-k8s-operator  0s
==> v1/Deployment
NAME                            DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
casskop-cassandra-k8s-operator  1        1        1           0          0s
==> v1/Pod(related)
NAME                                            READY  STATUS             RESTARTS  AGE
casskop-cassandra-k8s-operator-78786b9bf-cjggg  0/1    ContainerCreating  0
0s

You can find more information in the Cassandra operator Helm readme

This creates a Kubernetes Deployment for the operator, with RBAC settings.

Once deployed, you may find the Pods created by the Charts. If you deploy a release named casskop, then your pod will have a name similar to :

$ kubectl get pod
NAME                                 READY     STATUS    RESTARTS   AGE
casskop-cassandra-k8s-operator-78786b9bf-cjggg   1/1       Running   0          1h

You can view the CassKop logs using

$ kubectl logs -f cassandra-cassandra-k8s-operator-78786b9bf-cjggg

Deploy a Cassandra cluster

From local yaml spec

Once the operator is deployed inside a Kubernetes cluster, a new API will be accessible, so you'll be able to create, update and delete cassandraclusters.

In order to deploy a new cassandra cluster a specification has to be created:

For example :

kubectl apply -f samples/cassandracluster.yaml

see pods coming into life :

kubectl get pods -w

You can watch the status updates in real time on your CassandraCluster object :

watch 'kubectl describe cassandracluster cassandra-demo | tail -20'

Cassandra cluster status

You can find mode information on the CassandraCluster.status in this section

Make operation on the cluster

You can do a lot of operations on your Cassandra cluster.

Cassandra operator recovery

If the Cassandra operator restarts, it can recover its previous state thanks to the CRD objects CassandraClusters which stored directly in Kubernetes, description and state of the Cassandra cluster.

Cleanup

If you want to delete the operator from your Kubernetes cluster, the operator deployment should be deleted.

Also, the CRD has to be deleted too:

kubectl delete crd cassandraclusters.dfy.orange.com

!!!!!!!!WARNING!!!!!!!!

If you delete the CRD then !!!!!!WAAAARRRRNNIIIIINNG!!!!!!

It will delete ALL Clusters that has been created using this CRD!!!

Please never delete a CRD without very very good care

Operator SDK

CassKop is build using operator SDK:

Monitoring

We can quickly setup monitoring for our deployed Cassandra nodes using Prometheus operator.

Deploy Prometheus

You can deploy the CoreOs Prometheus operator on your cluster: You can find example helm value.yaml to configure the Prometheus operator:

$ kubectl create namespace monitoring
$ helm install --namespace monitoring --name prometheus stable/prometheus-operator

Add ServiceMonitor for Cassandra

Then you have to define a ServiceMonitor object to monitor cluster deployed by your cassandra operator (one time), update this to specify which namespace to monitor.

cassandra-service-monitor.yml

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kube-prometheus-cassandra-k8s-jmx
  labels:
    k8s-apps: cassandra-k8s-jmx
    prometheus: kube-prometheus
    component: cassandra
    release: prometheus    
spec:
  jobLabel: kube-prometheus-cassandra-k8s-jmx
  selector:
    matchLabels:
      k8s-app: exporter-cassandra-jmx
  namespaceSelector:
      matchNames:
      - cassandra
      - default
  endpoints:
  - port: http-promcassjmx
    interval: 15s

Your namespace need to be listed in the namespaceSelector section.

Add Grafana dashboard for Cassandra

You can import this dashboard to retrieve metrics about your Cassandra cluster.

Related Articles

migration
cassandra
kubernetes

How to Migrate Your Cassandra Database to Kubernetes with Zero Downtime

DataStax

11/15/2023

cassandra
kubernetes

Checkout Planet Cassandra

Claim Your Free Planet Cassandra Contributor T-shirt!

Make your contribution and score a FREE Planet Cassandra Contributor T-Shirt! 
We value our incredible Cassandra community, and we want to express our gratitude by sending an exclusive Planet Cassandra Contributor T-Shirt you can wear with pride.

Join Our Newsletter!

Sign up below to receive email updates and see what's going on with our company

Explore Related Topics

AllKafkaSparkScyllaSStableKubernetesApiGithubGraphQl

Explore Further

cassandra