This guide walks you through upgrading a ZooKeeper cluster to a newer minor version managed by KubeBlocks.
KubeBlocks performs a rolling upgrade: followers are upgraded one by one first, and the leader is upgraded last. This ensures the ensemble maintains quorum and client connections are not interrupted during the upgrade.
Before proceeding, verify your environment meets these requirements:
kubectl v1.21+ installed and configured with cluster accesskubectl get componentversion zookeeper
NAME VERSIONS STATUS AGE
zookeeper 3.9.4,3.9.2,3.8.4,3.7.2,3.6.4,3.4.14 Available 6h
kubectl get cluster zookeeper-cluster -n demo \
-o jsonpath='{.spec.componentSpecs[0].serviceVersion}' && echo ""
3.9.2
Check the current pod roles:
kubectl get pods -n demo -l app.kubernetes.io/instance=zookeeper-cluster -L kubeblocks.io/role
NAME READY STATUS RESTARTS AGE ROLE
zookeeper-cluster-zookeeper-0 2/2 Running 0 12m follower
zookeeper-cluster-zookeeper-1 2/2 Running 0 13m follower
zookeeper-cluster-zookeeper-2 2/2 Running 0 14m leader
Upgrade from 3.9.2 to 3.9.4:
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: zk-upgrade
namespace: demo
spec:
clusterName: zookeeper-cluster
type: Upgrade
upgrade:
components:
- componentName: zookeeper
serviceVersion: "3.9.4"
Apply it:
kubectl apply -f https://raw.githubusercontent.com/apecloud/kubeblocks-addons/refs/heads/main/examples/zookeeper/upgrade.yaml
Monitor the progress:
kubectl get ops zk-upgrade -n demo -w
NAME TYPE CLUSTER STATUS PROGRESS AGE
zk-upgrade Upgrade zookeeper-cluster Running 0/3 6s
zk-upgrade Upgrade zookeeper-cluster Running 1/3 74s
zk-upgrade Upgrade zookeeper-cluster Running 2/3 2m25s
zk-upgrade Upgrade zookeeper-cluster Running 3/3 3m34s
zk-upgrade Upgrade zookeeper-cluster Succeed 3/3 3m34s
Update the serviceVersion field in the Cluster resource:
kubectl patch cluster zookeeper-cluster -n demo --type=json \
-p='[{"op": "replace", "path": "/spec/componentSpecs/0/serviceVersion", "value": "3.9.4"}]'
Monitor the cluster status:
kubectl get cluster zookeeper-cluster -n demo -w
Check that all pods are running with the new version:
kubectl get pods -n demo -l app.kubernetes.io/instance=zookeeper-cluster -L kubeblocks.io/role
NAME READY STATUS RESTARTS AGE ROLE
zookeeper-cluster-zookeeper-0 2/2 Running 0 135m follower
zookeeper-cluster-zookeeper-1 2/2 Running 0 137m leader
zookeeper-cluster-zookeeper-2 2/2 Running 0 138m follower
Confirm the image version:
kubectl get pods -n demo zookeeper-cluster-zookeeper-0 \
-o jsonpath='{.spec.containers[?(@.name=="zookeeper")].image}' && echo ""
docker.io/apecloud/zookeeper:3.9.4
kubectl delete cluster zookeeper-cluster -n demo
kubectl delete ns demo