Zookeeper with StorageOS
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.
Using StorageOS persistent volumes with Apache Zookeeper means that if a pod fails, the cluster is only in a degraded state for as long as it takes Kubernetes to restart the pod. When the pod comes back up, the pod data is immediately available. Should Kubernetes schedule the Zookeeper pod on a new node, StorageOS allows for the data to be available to the pod, irrespective of whether or not the original StorageOS master volume is located on the same node.
As Zookeeper has features to allow it to handle replication, and as such careful consideration of whether to allow StorageOS or Zookeeper to handle replication is required.
Before you start, ensure you have StorageOS installed and ready on a Kubernetes cluster. See our guide on how to install StorageOS on Kubernetes for more information.
Deploying Zookeeper on Kubernetes
Pre-requisites
- StorageOS is assumed to have been installed; please check for the latest available version here.
Helm
To simplify the deployment of Zookeeper, we’ve used this Zookeeper helm chart
(incubator)
(version 1.2.2
, app version 3.4.10
) and rendered it into the example
deployment files you can find in our GitHub
repo.
Deployment
Clone the use cases repo
You can find the latest files in the StorageOS use cases repository in
/zookeeper/
git clone https://github.com/storageos/use-cases.git storageos-usecases
StatefulSet defintion
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: zookeeper
...
spec:
replicas: 3 # <--- number of zookeeper pods
...
containers:
- name: zookeeper
image: "gcr.io/google_samples/k8szk:v3"
imagePullPolicy: IfNotPresent
...
volumeMounts:
- name: data
mountPath: /var/lib/zookeeper
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes:
- "ReadWriteOnce"
storageClassName: "fast" # <--- the StorageClass to use
resources:
requests:
storage: "5Gi" # <--- storage requested per pod
This excerpt is from the StatefulSet definition (10-statefulset.yaml
).
The file contains the PersistentVolumeClaim template that will dynamically
provision the necessary storage, using the StorageOS storage class. Dynamic
provisioning occurs as a volumeMount has been declared with the same name
as a VolumeClaimTemplate.
Create the kubernetes objects
cd storageos-usecases
kubectl apply -f ./zookeeper/
Confirm Zookeeper is up and running
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
zookeeper-0 1/1 Running 0 2m30s
zookeeper-1 1/1 Running 0 112s
zookeeper-2 1/1 Running 0 56s
zookeeper-test-client 1/1 Running 0 2m30s
Connect to Zookeeper
Connect to the zookeeper client pod and list existing topics using the service endpoint
kubectl exec -it zookeeper-test-client /bin/bash
and issue a command to the zookeeper service
zkCli.sh -server zookeeper ls /zookeeper