New to KubeDB? Please start here.
Update Qdrant Version
This guide will show you how to use KubeDB ops-manager operator to update the version of Qdrant cr.
Before You Begin
At first, you need to have a Kubernetes cluster, and the
kubectlcommand-line tool must be configured to communicate with your cluster. If you do not already have a cluster, you can create one by using kind.Install
KubeDBin your cluster following the steps here.You should be familiar with the following
KubeDBconcepts:
To keep everything isolated, we are going to use a separate namespace called demo throughout this tutorial.
$ kubectl create ns demo
namespace/demo created
Note: YAML files used in this tutorial are stored in docs/examples/qdrant/update-version directory of kubedb/docs repository.
Apply Version Updating on Qdrant
Here, we are going to deploy a Qdrant instance using a supported version by KubeDB provisioner. Then we are going to apply update-ops-request on it.
Prepare Qdrant
At first, we are going to deploy a Qdrant instance using a supported Qdrant version. In the next two sections, we are going to find out the supported versions and version update constraints.
Find supported QdrantVersion:
When you have installed KubeDB, it has created QdrantVersion CR for all supported Qdrant versions. Let’s check the supported versions:
$ kubectl get qdrantversion
NAME VERSION DB_IMAGE DEPRECATED AGE
1.15.4 1.15.4 docker.io/qdrant/qdrant:v1.15.4-unprivileged 24d
1.16.2 1.16.2 docker.io/qdrant/qdrant:v1.16.2-unprivileged 24d
1.17.0 1.17.0 docker.io/qdrant/qdrant:v1.17.0-unprivileged 24d
The version above that does not show DEPRECATED true is supported by KubeDB for Qdrant. You can use any non-deprecated version. Now, we are going to select a non-deprecated version from QdrantVersion for the Qdrant instance that we will update from this version to another. In the next section, we are going to verify version update constraints.
Check update Constraints:
Qdrant supports rolling version updates. You can update from any currently running version to a newer patch or minor version. Major version jumps should follow the Qdrant upstream upgrade notes. For example, you can update directly from 1.16.2 to 1.17.0.
Let’s get one of the qdrantversion YAMLs:
$ kubectl get qdrantversion 1.17.0 -o yaml
apiVersion: catalog.kubedb.com/v1alpha1
kind: QdrantVersion
metadata:
labels:
app.kubernetes.io/instance: kubedb
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubedb-catalog
name: "1.17.0"
spec:
db:
image: docker.io/qdrant/qdrant:v1.17.0-unprivileged
version: "1.17.0"
Deploy Qdrant Instance:
In this section, we are going to deploy a Qdrant instance. Then, in the next section, we will update the version of the database using UpdateVersion. Below is the YAML of the Qdrant cr that we are going to create:
apiVersion: kubedb.com/v1alpha2
kind: Qdrant
metadata:
name: qdrant-sample
namespace: demo
spec:
version: "1.16.2"
replicas: 3
storage:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
deletionPolicy: WipeOut
Let’s create the Qdrant cr we have shown above:
$ kubectl create -f https://github.com/kubedb/docs/raw/v2026.4.27/docs/examples/qdrant/update-version/qdrant.yaml
qdrant.kubedb.com/qdrant-sample created
Wait for the database to be ready:
KubeDB operator watches for Qdrant objects using Kubernetes API. When a Qdrant object is created, KubeDB operator will create a new PetSet, Services, and Secrets, etc.
Now, watch Qdrant is going to Running state and also watch PetSet and its pod is created and going to Running state:
$ watch -n 3 kubectl get qdrant -n demo
Every 3.0s: kubectl get qdrant -n demo
NAME VERSION STATUS AGE
qdrant-sample 1.16.2 Ready 3m42s
$ watch -n 3 kubectl get petset -n demo qdrant-sample
Every 3.0s: kubectl get petset -n demo qdrant-sample
NAME READY AGE
qdrant-sample 3/3 4m17s
$ watch -n 3 kubectl get pod -n demo
Every 3.0s: kubectl get pods -n demo
NAME READY STATUS RESTARTS AGE
qdrant-sample-0 1/1 Running 0 4m55s
qdrant-sample-1 1/1 Running 0 4m12s
qdrant-sample-2 1/1 Running 0 3m38s
Let’s verify the Qdrant, the PetSet and its Pod image version:
$ kubectl get qdrant -n demo qdrant-sample -o=jsonpath='{.spec.version}{"\n"}'
1.16.2
$ kubectl get petset -n demo qdrant-sample -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}'
docker.io/qdrant/qdrant:v1.16.2-unprivileged
$ kubectl get pod -n demo qdrant-sample-0 -o=jsonpath='{.spec.containers[0].image}{"\n"}'
docker.io/qdrant/qdrant:v1.16.2-unprivileged
We are ready to apply version updating on this `Qdrant` instance.
### UpdateVersion
Here, we are going to update `Qdrant` from version `1.16.2` to `1.17.0`.
**Create QdrantOpsRequest:**
To update the instance, you have to create a `QdrantOpsRequest` cr with your desired version that is supported by `KubeDB`. Below is the YAML of the `QdrantOpsRequest` cr that we are going to create:
```yaml
apiVersion: ops.kubedb.com/v1alpha1
kind: QdrantOpsRequest
metadata:
name: qdops-update-version
namespace: demo
spec:
type: UpdateVersion
updateVersion:
targetVersion: "1.17.0"
databaseRef:
name: qdrant-sample
timeout: 5m
apply: IfReady
Here,
spec.databaseRef.namespecifies that we are performing operation onqdrant-sampleQdrant database.spec.typespecifies that we are going to performUpdateVersionon our database.spec.updateVersion.targetVersionspecifies the expected version1.17.0after updating.spec.timeoutspecifies the timeout for the operation (learn more here).spec.applyspecifies when to apply the operation (learn more here).
Let’s create the QdrantOpsRequest cr we have shown above:
$ kubectl apply -f https://github.com/kubedb/docs/raw/v2026.4.27/docs/examples/qdrant/update-version/ops-request.yaml
qdrantopsrequest.ops.kubedb.com/qdops-update-version created
Verify Qdrant version updated successfully
If everything goes well, KubeDB ops-manager operator will update the image of Qdrant, PetSet, and its Pod.
At first, we will wait for QdrantOpsRequest to be successful. Run the following command to watch QdrantOpsRequest cr:
$ watch -n 3 kubectl get QdrantOpsRequest -n demo qdops-update-version
Every 3.0s: kubectl get QdrantOpsRequest -n demo qdops-update-version
NAME TYPE STATUS AGE
qdops-update-version UpdateVersion Successful 3m12s
We can see from the above output that the QdrantOpsRequest has succeeded. If we describe the QdrantOpsRequest, we shall see that the Qdrant, PetSet, and its Pod have updated with a new image.
$ kubectl describe QdrantOpsRequest -n demo qdops-update-version
Name: qdops-update-version
Namespace: demo
Labels: <none>
Annotations: <none>
API Version: ops.kubedb.com/v1alpha1
Kind: QdrantOpsRequest
Metadata:
Creation Timestamp: 2026-05-15T05:36:46Z
Generation: 1
Resource Version: 3356440
UID: 156625b9-5f36-465e-aa88-ff0e5452c7ba
Spec:
Apply: IfReady
Database Ref:
Name: qdrant-sample
Max Retries: 1
Timeout: 5m
Type: UpdateVersion
Update Version:
Target Version: 1.17.0
Status:
Conditions:
Last Transition Time: 2026-05-15T05:36:46Z
Message: Qdrant ops-request has started to update version
Observed Generation: 1
Reason: UpdateVersion
Status: True
Type: UpdateVersion
Last Transition Time: 2026-05-15T05:37:01Z
Message: successfully reconciled the Qdrant with updated version
Observed Generation: 1
Reason: UpdatePetSets
Status: True
Type: UpdatePetSets
Last Transition Time: 2026-05-15T05:38:10Z
Message: Successfully Restarted Qdrant nodes
Observed Generation: 1
Reason: RestartPods
Status: True
Type: RestartPods
Last Transition Time: 2026-05-15T05:37:15Z
Message: get pod; ConditionStatus:True; PodName:qdrant-sample-0
Observed Generation: 1
Status: True
Type: GetPod--qdrant-sample-0
Last Transition Time: 2026-05-15T05:37:17Z
Message: evict pod; ConditionStatus:True; PodName:qdrant-sample-0
Observed Generation: 1
Status: True
Type: EvictPod--qdrant-sample-0
Last Transition Time: 2026-05-15T05:37:45Z
Message: running pod; ConditionStatus:True; PodName:qdrant-sample-0
Observed Generation: 1
Status: True
Type: RunningPod--qdrant-sample-0
Last Transition Time: 2026-05-15T05:37:30Z
Message: get pod; ConditionStatus:True; PodName:qdrant-sample-1
Observed Generation: 1
Status: True
Type: GetPod--qdrant-sample-1
Last Transition Time: 2026-05-15T05:37:31Z
Message: evict pod; ConditionStatus:True; PodName:qdrant-sample-1
Observed Generation: 1
Status: True
Type: EvictPod--qdrant-sample-1
Last Transition Time: 2026-05-15T05:37:45Z
Message: running pod; ConditionStatus:True; PodName:qdrant-sample-1
Observed Generation: 1
Status: True
Type: RunningPod--qdrant-sample-1
Last Transition Time: 2026-05-15T05:37:50Z
Message: get pod; ConditionStatus:True; PodName:qdrant-sample-2
Observed Generation: 1
Status: True
Type: GetPod--qdrant-sample-2
Last Transition Time: 2026-05-15T05:37:52Z
Message: evict pod; ConditionStatus:True; PodName:qdrant-sample-2
Observed Generation: 1
Status: True
Type: EvictPod--qdrant-sample-2
Last Transition Time: 2026-05-15T05:38:05Z
Message: running pod; ConditionStatus:True; PodName:qdrant-sample-2
Observed Generation: 1
Status: True
Type: RunningPod--qdrant-sample-2
Last Transition Time: 2026-05-15T05:38:11Z
Message: Successfully updated Qdrant version
Observed Generation: 1
Reason: Successful
Status: True
Type: Successful
Observed Generation: 1
Phase: Successful
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Starting 86s KubeDB Ops-manager Operator Pausing Qdrant database demo/qdrant-sample
Normal Successful 86s KubeDB Ops-manager Operator Successfully paused Qdrant database: demo/qdrant-sample for QdrantOpsRequest: qdops-update-version
Normal UpdatePetSets 74s KubeDB Ops-manager Operator successfully reconciled the Qdrant with updated version
Warning get pod; ConditionStatus:True; PodName:qdrant-sample-0 60s KubeDB Ops-manager Operator get pod; ConditionStatus:True; PodName:qdrant-sample-0
Warning evict pod; ConditionStatus:True; PodName:qdrant-sample-0 58s KubeDB Ops-manager Operator evict pod; ConditionStatus:True; PodName:qdrant-sample-0
Normal RestartPods 5s KubeDB Ops-manager Operator Successfully Restarted Qdrant nodes
Normal Starting 4s KubeDB Ops-manager Operator Resuming Qdrant database: demo/qdrant-sample
Normal Successful 4s KubeDB Ops-manager Operator Successfully resumed Qdrant database: demo/qdrant-sample for QdrantOpsRequest: qdops-update-version
Now, we are going to verify whether the Qdrant, PetSet and its Pod have updated with the new image. Let’s check:
$ kubectl get qdrant -n demo qdrant-sample -o=jsonpath='{.spec.version}{"\n"}'
1.17.0
$ kubectl get petset -n demo qdrant-sample -o=jsonpath='{.spec.template.spec.containers[0].image}{"\n"}'
docker.io/qdrant/qdrant:v1.17.0-unprivileged
$ kubectl get pod -n demo qdrant-sample-0 -o=jsonpath='{.spec.containers[0].image}{"\n"}'
docker.io/qdrant/qdrant:v1.17.0-unprivileged
You can see above that our Qdrant has been updated with the new version. It verifies that we have successfully updated our Qdrant instance.
Next Steps
- Learn about backup and restore Qdrant using KubeStash.
- Detail concepts of Qdrant object.
- Want to hack on KubeDB? Check our contribution guidelines.
Cleaning Up
To clean up the Kubernetes resources created by this tutorial, run:
$ kubectl delete qdrant -n demo qdrant-sample
qdrant.kubedb.com "qdrant-sample" deleted
$ kubectl delete qdrantopsrequest -n demo qdops-update-version
qdrantopsrequest.ops.kubedb.com "qdops-update-version" deleted
$ kubectl delete ns demo
namespace "demo" deleted































