Run CrateDB with Kubernetes Operator¶
The CrateDB Kubernetes Operator provides a convenient way to run CrateDB clusters inside Kubernetes.
Using the operator we can just deploy a CrateDB
resource without having to
deal with services, persistent volumes, persistent volume claims, and stateful
sets. The only prerequisite is to have a suitable storage class.
Installation¶
Helm must be installed to install the Crate operator chart. Once Helm is set up properly, add the repo as follows:
$ helm repo add crate-operator https://crate.github.io/crate-operator
Install the crate-operator chart:
$ kubectl create namespace crate-operator
$ helm install crate-operator crate-operator/crate-operator --namespace crate-operator --set env.CRATEDB_OPERATOR_DEBUG_VOLUME_STORAGE_CLASS=<YOUR-STORAGE-CLASS>
Note
kubectl get storageclass
gives you an list of the available StorageClasses
on your setup. Be careful with what you choose!
Note
To be able to deploy the custom resource CrateDB
to a Kubernetes cluster,
the API needs to be extended with a Custom Resource Definition (CRD).
It is installed as a dependency of the crate-operator
chart, but it can be
installed separately. See the Crate Operator Chart documentation for
further details.
Run CrateDB¶
A minimal custom resource for a three-node CrateDB cluster may look like this:
dev-cluster.yaml
:
apiVersion: cloud.crate.io/v1
kind: CrateDB
metadata:
name: my-cluster
namespace: dev
spec:
cluster:
imageRegistry: crate
name: crate-dev
version: 5.8.1
nodes:
data:
- name: hot
replicas: 3
resources:
limits:
cpu: 4
memory: 4Gi
disk:
count: 1
size: 128GiB
storageClass: <YOUR-STORAGE-CLASS>
heapRatio: 0.25
Note
The operator imposes an affinity constraint of 1 CrateDB node per Kubernetes node. To deploy a CrateDB cluster with multiple nodes on a single machine for testing purposes, manually deploy a StatefulSet.
Warning
Specifying a cpu number under limits is mandatory.
$ kubectl create namespace dev
$ kubectl --namespace dev create -f dev-cluster.yaml
...
$ kubectl --namespace dev get cratedbs
NAMESPACE NAME AGE
dev my-cluster 36s
We can check the status of the deployment by looking at the latest events:
$ kubectl get events --sort-by='.lastTimestamp' -n dev
and the status of the pods:
$ kubectl get pods --namespace dev
Once we have a pod running for each CrateDB node, the cluster is ready. Congratulations!
The operator created a user named system
for you and a Loadbalancer
to access the cluster.
$ kubectl get secret user-system-my-cluster -o json | jq -r '.data.password' | base64 -d
$ kubectl get service crate-my-cluster -o json | jq -r '.status.loadBalancer.ingress[0].ip'
As an alternative you can access the cluster via kubectl port-forwarding
to port 4200
. Which allows you to authenticate with the crate user.
Note
You can find the Crate Operator features in the Features
section
of CrateDB Kubernetes Operator.