# Running KUDO Cassandra in production

Before running KUDO Cassandra in production, please follow this guide to ensure the reliable stability of your production cluster.

Also, please read about Cassandra Anti-Patterns (opens new window) to not to follow any bad practices when running production workload.

# Compute Resources

For production use of KUDO Cassandra we recommend a minimum of 32 GiB of memory and 16 cores of CPU for guaranteed stability.

Refer to Capacity Planning (opens new window) to learn about capacity planning for a Cassandra installation.

# Storage

Verify that there is a storage class installed in the Kubernetes cluster. In this example we will use the aws-ebs-csi-driver as the storage class reference.

$ kubectl get sc
NAME                             PROVISIONER       AGE
awsebscsiprovisioner (default)   ebs.csi.aws.com   2d

# Volume Expansion

Verify that the storage class has the option AllowVolumeExpansion set to true.

$ kubectl describe sc awsebscsiprovisioner
Name:                  awsebscsiprovisioner
IsDefaultClass:        Yes
Annotations:           kubernetes.io/description=AWS EBS CSI provisioner StorageClass,storageclass.kubernetes.io/is-default-class=true
Provisioner:           ebs.csi.aws.com
Parameters:            type=gp2
AllowVolumeExpansion:  true
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     WaitForFirstConsumer
Events:                <none>

⚠️ In case AllowVolumeExpansion is unset or false, make sure to provision enough disk when bootstrapping the KUDO Cassandra cluster. The disk size can be configured using the DISK_SIZE parameter. By default, DISK_SIZE is set to 20Gi and is not ideal for production usage. Users should increase disk size by as much as they deem necessary for reliable stability.

# ReclaimPolicy

Verify the storage class has the option ReclaimPolicy set to Retain.

To read more about the ReclaimPolicy see the official Kubernetes docs on Changing the Reclaim Policy (opens new window)

PersistentVolumes can have various reclaim policies, including “Retain”, “Recycle”, and “Delete”. For dynamically provisioned PersistentVolumes, the default reclaim policy is “Delete”. This means that a dynamically provisioned volume is automatically deleted when a user deletes the corresponding PersistentVolumeClaim. This automatic behavior might be inappropriate if the volume contains precious data. In that case, it is more appropriate to use the “Retain” policy. With the “Retain” policy, if a user deletes a PersistentVolumeClaim, the corresponding PersistentVolume is not be deleted. Instead, it is moved to the Released phase, where all of its data can be manually recovered.

If the StorageClass is to be shared between many users, a common practice is to leave the default ReclaimPolicy as Delete and set ReclaimPolicy: Retain in the PersistentVolume once the cluster is up and running.

Let's see an example of a 3-broker KUDO Cassandra cluster's PersistentVolumes where the StorageClass default ReclaimPolicy is Delete

$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                              STORAGECLASS           REASON   AGE
pvc-6a9e69f4-b807-440f-b190-357c109e8ad9   20Gi       RWO            Delete           Bound    default/var-lib-cassandra-cassandra-instance-node-2                                                                 awsebscsiprovisioner            120m
pvc-8602a698-14a0-4c3d-85e6-67eb6da80a5d   20Gi       RWO            Delete           Bound    default/var-lib-cassandra-cassandra-instance-node-1                                                                 awsebscsiprovisioner            121m
pvc-de527673-8bee-4e38-9e6d-399ec07c2728   20Gi       RWO            Delete           Bound    default/var-lib-cassandra-cassandra-instance-node-0                                                                 awsebscsiprovisioner            123m

We can patch the PersistentVolumes to use the ReclaimPolicy of Retain

$ kubectl patch pv pvc-6a9e69f4-b807-440f-b190-357c109e8ad9 -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
$ kubectl patch pv pvc-8602a698-14a0-4c3d-85e6-67eb6da80a5d -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
$ kubectl patch pv pvc-de527673-8bee-4e38-9e6d-399ec07c2728 -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

persistentvolume/pvc-6a9e69f4-b807-440f-b190-357c109e8ad9 patched
persistentvolume/pvc-8602a698-14a0-4c3d-85e6-67eb6da80a5d patched
persistentvolume/pvc-de527673-8bee-4e38-9e6d-399ec07c2728 patched

Verify the PersistentVolumes ReclaimPolicy has been changed for all brokers:

$ kubectl get pv
pvc-6a9e69f4-b807-440f-b190-357c109e8ad9   5Gi        RWO            Retain           Bound    default/var-lib-cassandra-cassandra-instance-node-2                                 awsebscsiprovisioner            18h
pvc-8602a698-14a0-4c3d-85e6-67eb6da80a5d   5Gi        RWO            Retain           Bound    default/var-lib-cassandra-cassandra-instance-node-1                                 awsebscsiprovisioner            18h
pvc-de527673-8bee-4e38-9e6d-399ec07c2728   5Gi        RWO            Retain           Bound    default/var-lib-cassandra-cassandra-instance-node-0                              awsebscsiprovisioner            18h