image Apache 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 avaliable. Should Kubernetes schedule the Zookeeper pod on a new node, StorageOS allows for the data to be avaliable to the pod, irrespective of whether or not a 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


  • StorageOS is assumed to have been installed; please check for the latest available version here


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.


Clone the example deployment repo

You can find the latest files in the StorageOS example deployment repostiory in k8s/examples/zookeeper/

git clone storageos

StatefulSet defintion

apiVersion: apps/v1beta1
kind: StatefulSet
  name: zookeeper
  replicas: 3                             # <--- number of zookeeper pods
        - name: zookeeper
          image: ""
          imagePullPolicy: IfNotPresent
            - name: data
              mountPath: /var/lib/zookeeper
    - metadata:
        name: data
          - "ReadWriteOnce"
        storageClassName: "fast"          # <--- the StorageClass to use
            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

kubectl apply -f storageos/k8s/examples/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 -server zookeeper ls /zookeeper