Helm Operator
Helm Operator - Cockroachdb
Let’s begin my creating a new project called myproject
:
oc new-project myproject
If the project already exits, make sure we are currently scoped to it:
oc project myproject
CockroachDB is a database so let’s ensure we have accessible persistent storage by adding some current PersistentVolumes
to a StorageClass
called local storage
:
for num in {1..4}; do oc apply -f https://exe-workshops.s3.amazonaws.com/pv$num.yaml; done;
Let’s now create a new directory for our project:
mkdir -p $HOME/projects/cockroachdb-operator
Navigate to the directory:
cd $HOME/projects/cockroachdb-operator
Create a new Helm-based Operator SDK project for the CockroachDB Operator:
operator-sdk init --plugins=helm --domain example.com
Automatically fetch the Cockroachdb Helm Chart and generate the CRD/API:
operator-sdk create api --helm-chart=cockroachdb --helm-chart-repo=https://charts.helm.sh/stable --helm-chart-version=3.0.7
The watches.yaml
file maps a Group, Version, and Kind to a specific Helm Chart. Observe the contents of the watches.yaml
:
cat watches.yaml
Create the Cockroach DB CRD:
oc apply -f config/crd/bases/charts.example.com_cockroachdbs.yaml
Once running, the command will block the current session. You can continue interacting with the OpenShift cluster by opening a new terminal window. You can quit the session by pressing CTRL + C
.
WATCH_NAMESPACE=myproject make run
Open a new terminal window.
Navigate to the cockroachdb-operator
top-level directory
cd $HOME/projects/cockroachdb-operator
Before applying the CockroachDB Custom Resource, observe the CockroachDB Helm Chart values.yaml
:
CockroachDB Helm Chart Values.yaml file
Update the CockroachDB Custom Resource at config/samples/charts_v1alpha1_cockroachdb.yaml
with the following values:
spec.statefulset.replicas: 1
spec.storage.persistentVolume.size: 1Gi
spec.storage.persistentVolume.storageClass: local-storage
apiVersion: charts.example.com/v1alpha1
kind: Cockroachdb
metadata:
name: cockroachdb-sample
spec:
statefulset:
replicas: 1
storage:
persistentVolume:
size: 1Gi
storageClass: local-storage
You can easily update this file by running the following command:
\cp /tmp/charts_v1alpha1_cockroachdb.yaml config/samples/charts_v1alpha1_cockroachdb.yaml
After updating the CockroachDB Custom Resource with our desired spec, apply it to the cluster. Ensure you are currently scoped to the myproject
Namespace:
oc project myproject
oc apply -f config/samples/charts_v1alpha1_cockroachdb.yaml
Confirm that the Custom Resource was created:
oc get cockroachdb
It may take some time for the environment to pull down the CockroachDB container image. Confirm that the Stateful Set was created:
oc get statefulset
Confirm that the Stateful Set’s pod is currently running:
oc get pods -l app.kubernetes.io/component=cockroachdb
Confirm that the CockroachDB “internal” and “public” ClusterIP Service were created:
oc get services
Verify that you can access the CockroachDB Web UI by first exposing the CockroachDB Service as a publicly accessible OpenShift Route:
COCKROACHDB_PUBLIC_SERVICE=`oc get svc -o jsonpath={$.items[1].metadata.name}`
oc expose --port=http svc $COCKROACHDB_PUBLIC_SERVICE
Fetch the OpenShift Route URL and copy/paste it into your browser:
COCKROACHDB_UI_URL=`oc get route -o jsonpath={$.items[0].spec.host}`
echo $COCKROACHDB_UI_URL
oc run -it --rm cockroach-client --image=cockroachdb/cockroach --restart=Never --command -- ./cockroach sql --insecure --host $COCKROACHDB_PUBLIC_SERVICE
Once you see the SQL prompt, run the following to show the default databases:
SHOW DATABASES;
Create a new database called bank
and populate a table with arbitrary values:
CREATE DATABASE bank;
CREATE TABLE bank.accounts (id INT PRIMARY KEY, balance DECIMAL);
INSERT INTO bank.accounts VALUES (1234, 10000.50);
Verify the table and values were successfully created:
SELECT * FROM bank.accounts;
Exit the SQL prompt:
\q
Increase the number of CockroachDB replicas by patching the the CockroachDB Custom Resource:
oc patch cockroachdb cockroachdb-sample --type='json' -p '[{"op": "replace", "path": "/spec/statefulset/replicas", "value":3}]'
Verify that the CockroachDB Stateful Set is creating two additional pods:
oc get pods -l app.kubernetes.io/component=cockroachdb
The CockroachDB UI should now reflect these additional nodes as well. If any CockroachDB member fails it gets restarted or recreated automatically by the Kubernetes infrastructure, and will rejoin the cluster automatically when it comes back up. You can test this scenario by killing any of the pods:
oc delete pods -l app.kubernetes.io/component=cockroachdb
Watch the pods respawn:
oc get pods -l app.kubernetes.io/component=cockroachdb
Confirm that the contents of the database still persist by connecting to the database cluster:
COCKROACHDB_PUBLIC_SERVICE=`oc get svc -o jsonpath={$.items[1].metadata.name}`
oc run -it --rm cockroach-client --image=cockroachdb/cockroach --restart=Never --command -- ./cockroach sql --insecure --host $COCKROACHDB_PUBLIC_SERVICE
Once you see the SQL prompt, run the following to confirm the database contents are still present:
SELECT * FROM bank.accounts;
Exit the SQL prompt:
\q
Delete the CockroachDB cluster and all associated resources by deleting the example
Custom Resource:
oc delete cockroachdb cockroachdb-sample
Verify that the Stateful Set, pods, and services are removed:
oc get statefulset
oc get pods
oc get services