https://github.com/michelderu/k8ssandra-playground
This repository contains a runbook to set up a kind K8s cluster and deploy Cassandra 5 using K8ssandra and cass-operator.
https://github.com/michelderu/k8ssandra-playground
Last synced: 3 months ago
JSON representation
This repository contains a runbook to set up a kind K8s cluster and deploy Cassandra 5 using K8ssandra and cass-operator.
- Host: GitHub
- URL: https://github.com/michelderu/k8ssandra-playground
- Owner: michelderu
- Created: 2024-11-19T12:23:51.000Z (7 months ago)
- Default Branch: main
- Last Pushed: 2024-11-19T18:32:19.000Z (7 months ago)
- Last Synced: 2025-01-26T03:12:55.615Z (5 months ago)
- Homepage:
- Size: 4.88 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Using K8ssandra to run Cassandra 5
This repository contains a runbook to set up a kind K8s cluster and deploy Cassandra 5 using K8ssandra and cass-operator.## Add the K8ssandra helm repo
```bash
helm repo add k8ssandra https://helm.k8ssandra.io/stable
helm repo update
```## Clone the K8ssandra operator and setup a local kind cluster (1 control plane and 4 worker nodes)
```bash
git clone https://github.com/k8ssandra/k8ssandra-operator.git
cd k8ssandra-operator
scripts/setup-kind-multicluster.sh --clusters 1 --kind-worker-nodes 4
```### List the nodes in the cluster
```bash
kubectl get nodes
```Output:
```text
NAME STATUS ROLES AGE VERSION
k8ssandra-0-control-plane Ready control-plane,master 80s v1.22.4
k8ssandra-0-worker Ready 42s v1.22.4
k8ssandra-0-worker2 Ready 42s v1.22.4
k8ssandra-0-worker3 Ready 42s v1.22.4
k8ssandra-0-worker4 Ready 42s v1.22.4
```## Add the cert-manager helm repo
```bash
helm repo add jetstack https://charts.jetstack.io
helm repo update
```## Use the control plane context
```bash
kubectl config use-context kind-k8ssandra-0
```## Install cert-manager
```bash
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set installCRDs=true
```### List the pods in the cert-manager namespace
```bash
kubectl get pods --namespace cert-manager
```Output:
```text
NAME READY STATUS RESTARTS AGE
cert-manager-5cc5dcf776-bmz4z 1/1 Running 0 31m
cert-manager-cainjector-7dcc56c84f-dm8hf 1/1 Running 0 31m
cert-manager-webhook-5dcf8fd964-kxfbl 1/1 Running 0 31m
```## Deploy the K8ssandra operator in a dedicated namespace
```bash
helm install k8ssandra-operator k8ssandra/k8ssandra-operator -n k8ssandra-operator --create-namespace
```## Verify the operator pods are running
```bash
kubectl get pods -n k8ssandra-operator
```Output:
```text
NAME READY STATUS RESTARTS AGE
k8ssandra-operator-7f76579f94-7s2tw 1/1 Running 0 60s
k8ssandra-operator-cass-operator-794f65d9f4-j9lm5 1/1 Running 0 60s
```## Deploy a K8ssandra cluster 🤩
We use a custom values.yaml file to deploy a 3 node cluster in one datacenter.
`k8c1.yml`:
```yaml
apiVersion: k8ssandra.io/v1alpha1
kind: K8ssandraCluster
metadata:
name: demo
spec:
cassandra:
serverVersion: "5.0.2"
datacenters:
- metadata:
name: dc1
size: 3
storageConfig:
cassandraDataVolumeClaimSpec:
storageClassName: standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
config:
jvmOptions:
heapSize: 512M
stargate:
size: 1
heapSize: 256M
```### Create the K8ssandra cluster
```bash
kubectl apply -n k8ssandra-operator -f ../k8c1.yml
```### Verify pod deployment
```bash
kubectl get pods -n k8ssandra-operator
```Output:
```text
NAME READY STATUS RESTARTS AGE
demo-dc1-default-stargate-deployment-b6f6969d4-kmthp 0/1 CrashLoopBackOff 11 (33s ago) 23m
demo-dc1-default-sts-0 2/2 Running 0 27m
demo-dc1-default-sts-1 2/2 Running 0 27m
demo-dc1-default-sts-2 2/2 Running 0 27m
k8ssandra-operator-6fc9c77c68-j6m8g 1/1 Running 0 31m
k8ssandra-operator-cass-operator-d54556f7c-lg6gs 1/1 Running 0 31m
```### Verify K8ssandraCluster deployment
```bash
kubectl get k8cs -n k8ssandra-operator
```Output:
```text
NAME ERROR
demo None
```### Describe the K8ssandraCluster
```bash
kubectl describe k8cs demo -n k8ssandra-operator
```### Extract credentials from the K8ssandraCluster
```bash
CASS_USERNAME=$(kubectl get secret demo-superuser -n k8ssandra-operator -o=jsonpath='{.data.username}' | base64 --decode)
echo $CASS_USERNAME
```
Output: demo-superuser
```bash
CASS_PASSWORD=$(kubectl get secret demo-superuser -n k8ssandra-operator -o=jsonpath='{.data.password}' | base64 --decode)
echo $CASS_PASSWORD
```
Output: kEFiYwQ-AbWpEumJ5A4H### Verify cluster status
```bash
kubectl exec -it demo-dc1-default-sts-0 -n k8ssandra-operator -c cassandra -- nodetool -u $CASS_USERNAME -pw $CASS_PASSWORD status
```Output:
```text
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 10.244.1.5 150.03 KiB 16 100.0% ed9795cd-665a-41b3-bdd0-85020e2ec88e default
UN 10.244.2.4 114.67 KiB 16 100.0% 2e07f986-2cf0-4b14-a764-d7dc3cdc2610 default
UN 10.244.3.4 114.74 KiB 16 100.0% 622eab4a-6358-4d29-8e7a-1fc397bd3ceb default
```### Open a shell in the cassandra pod and run cqlsh
```bash
kubectl exec -it demo-dc1-default-sts-0 -n k8ssandra-operator -- /bin/bash
nodetool -u demo-superuser -pw kEFiYwQ-AbWpEumJ5A4H status
cqlsh -u demo-superuser -p kEFiYwQ-AbWpEumJ5A4H 10.244.1.5
```Output:
```text
Connected to demo at 10.244.1.5:9042
[cqlsh 6.2.0 | Cassandra 5.0.2 | CQL spec 3.4.7 | Native protocol v5]
Use HELP for help.
```## Tear down the Cassandra cluster
```bash
kubectl delete -n k8ssandra-operator -f k8c1.yml
kubectl get pods -n k8ssandra-operator
```
Output:
```text
NAME READY STATUS RESTARTS AGE
k8ssandra-operator-6fc9c77c68-j6m8g 1/1 Running 0 3h43m
k8ssandra-operator-cass-operator-d54556f7c-lg6gs 1/1 Running 0 3h43m
```# Deploy using Helm Chart
Remove `initContainers` from `k8ssandra-cluster/templates/k8ssandracluster.yaml`
Change `serverVersion` to `5.0.2` in `k8ssandra-cluster/values.yaml````bash
git clone https://github.com/k8ssandra/k8ssandra-cluster.git
helm install k8ssandra-cluster ./k8ssandra-cluster -f ./k8ssandra-cluster/values.yaml
kubectl get pods
kubectl delete pod k8ssandra-cluster-dc1-default-sts-0
```# Prerequisites
## Install kind as a local kubernetes cluster
```bash
brew install kind
```## Install kubectx (Simplifies the management of Kubernetes contexts and namespaces)
```bash
kubectl krew install ctx
kubectl krew install ns
```
Use as: kubectl ctx### Optionally install the bash completion
```bash
sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx
sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubens
```## Install Yq (YAML processing tool)
```bash
brew install yq
```## Install gnu-getopt (Required for kubectl-krew)
```bash
brew install gnu-getopt
echo 'export PATH="/opt/homebrew/opt/gnu-getopt/bin:$PATH"' >> /Users/michel.deru/.zshrc
source ~/.zshrc
```# Helpful debug commands
## Logging
```bash
kubectl describe k8cs demo -n k8ssandra-operator
kubectl logs -n k8ssandra-operator k8ssandra-operator-cass-operator-d54556f7c-lg6gs
kubectl logs -n k8ssandra-operator k8ssandra-operator-7f76579f94-7s2tw
kubectl logs -n k8ssandra-operator k8ssandra-cluster-dc1-default-sts-0 -c cassandra
kubectl logs -n k8ssandra-operator k8ssandra-cluster-dc1-default-sts-0 -c server-system-logger
```## List all pods and containers in all namespaces
```bash
kubectl get pods -A -o jsonpath="{range .items[*]}{.metadata.namespace}{':'}{.metadata.name}{': '}{range .spec.containers[*]}{.name}{' '}{end}{'\n'}{end}"
```## Bash into a specific pod
```bash
kubectl exec -it k8ssandra-cluster-dc1-default-sts-0 -n k8ssandra-operator -- /bin/bash
```## Show CRD definitions
```bash
kubectl get cassandradatacenters
kubectl describe cassandradatacenter dc1
```## Show CRD details
```bash
kubectl get crd
kubectl get crd cassandradatacenters.cassandra.datastax.com -o yaml
```