Skip to main content
Qdrant Operator logo

Qdrant Operator

A Kubernetes operator for managing Qdrant vector database clusters

CI PyPI Python 3.12+ License: MIT Kubernetes

Features • Installation • Usage • Configuration •


Features

  • Cluster Management - Deploy and manage Qdrant clusters via Helm
  • Automated Backups - Per-node snapshots streamed to S3-compatible storage, with a manifest
  • Scheduled Backups - CronJob-style schedules with concurrency and retention policies
  • Disaster Recovery - Restore collections node-by-node from presigned URLs, with optional remapping
  • Async-First - Built on kopf with fully async adapters for performance

Installation

Prerequisites

  • Kubernetes cluster (v1.26+)
  • Helm 3.x installed
  • kubectl configured with cluster access
# From the OCI registry (published on every release)
helm install qdrant-operator oci://ghcr.io/4thel00z/charts/qdrant-operator -n qdrant-system --create-namespace

# Or from the local chart
helm install qdrant-operator ./charts/qdrant-operator

# Or install in a specific namespace
helm install qdrant-operator ./charts/qdrant-operator -n qdrant-system --create-namespace

# Verify installation
kubectl get pods -l app.kubernetes.io/name=qdrant-operator

Configuration

Override default values:

helm install qdrant-operator ./charts/qdrant-operator \
  --set operator.logLevel=DEBUG \
  --set resources.limits.memory=512Mi

Or use a values file:

helm install qdrant-operator ./charts/qdrant-operator -f my-values.yaml

Install from PyPI

The operator is also a Python package; the qdrant-operator command runs it against your kubeconfig, forwarding any extra flags to kopf run (for example --namespace team-a).

uv tool install qdrant-operator   # or: pipx install qdrant-operator
qdrant-operator --help

Container images: ghcr.io/4thel00z/qdrant-operator:<version> (linux/amd64, linux/arm64, signed provenance).

Build Docker Image (Optional)

# Replace with your registry
docker build -t ghcr.io/YOUR_ORG/qdrant-operator:0.1.0 .
docker push ghcr.io/YOUR_ORG/qdrant-operator:0.1.0

Local Development

# Install dependencies
uv sync

# Apply CRDs to cluster
kubectl apply -f manifests/crds/

# Run operator locally against your kubeconfig
make dev

Usage

Create a Qdrant Cluster

apiVersion: qdrant.io/v1alpha1
kind: QdrantCluster
metadata:
  name: my-qdrant
  namespace: default
spec:
  replicas: 3
  version: v1.16.3
  resources:
    requests:
      cpu: "500m"
      memory: "1Gi"
    limits:
      cpu: "2"
      memory: "4Gi"
  persistence:
    size: 10Gi
    storageClassName: standard
  cluster:
    enabled: true

Create a Backup

apiVersion: qdrant.io/v1alpha1
kind: QdrantBackup
metadata:
  name: my-backup
  namespace: default
spec:
  clusterRef:
    name: my-qdrant
  storage:
    s3:
      bucket: my-backups
      prefix: qdrant
      region: us-east-1
      credentialsSecretRef:
        name: s3-credentials
        accessKeyIdKey: AWS_ACCESS_KEY_ID

Schedule Automated Backups

apiVersion: qdrant.io/v1alpha1
kind: QdrantBackupSchedule
metadata:
  name: daily-backup
  namespace: default
spec:
  schedule: "0 2 * * *"  # Daily at 2 AM
  clusterRef:
    name: my-qdrant
  storage:
    s3:
      bucket: my-backups
      prefix: scheduled
      region: us-east-1
      credentialsSecretRef:
        name: s3-credentials
        accessKeyIdKey: AWS_ACCESS_KEY_ID
  retentionPolicy:
    keepLast: 7
    keepDaily: 30
  concurrencyPolicy: Forbid

Restore from Backup

apiVersion: qdrant.io/v1alpha1
kind: QdrantRestore
metadata:
  name: my-restore
  namespace: default
spec:
  backupRef:
    name: my-backup
  targetClusterRef:
    name: my-qdrant-new
  collectionMapping:
    old_collection: new_collection

Configuration

Environment Variables

Variable Description Default
KUBECONFIG Path to kubeconfig file In-cluster config
LOG_LEVEL Logging level INFO
LOG_FORMAT json or text json

S3 Credentials Secret

apiVersion: v1
kind: Secret
metadata:
  name: s3-credentials
type: Opaque
stringData:
  AWS_ACCESS_KEY_ID: "your-access-key"
  AWS_SECRET_ACCESS_KEY: "your-secret-key"

Development

# Install dependencies
uv sync

# Run tests
uv run pytest

# Run integration tests (requires k8s cluster + helm)
make test-integration

# Lint and format
uv run ruff check src tests
uv run ruff format src tests

# Type checking
uv run pyright src tests

Releasing

CI (.github/workflows/ci.yml) runs lint, pyright, unit tests, chart lint, a wheel/image build and the kind-based end-to-end suite on every push and pull request.

Releases are driven by release-please from the conventional commit history, all inside .github/workflows/release.yml on pushes to main:

  1. A release PR is kept up to date that bumps pyproject.toml and Chart.yaml, refreshes uv.lock and updates CHANGELOG.md.
  2. Merging that PR creates the vX.Y.Z tag and the GitHub release, and the same run publishes the wheel and sdist to PyPI (trusted publishing, no token), pushes the multi-arch image and the Helm chart to ghcr.io, and attaches the artifacts and CRDs to the release.

No secrets are involved beyond the default GITHUB_TOKEN; the repository setting Allow GitHub Actions to create and approve pull requests must be on for the release PR to appear.

License

MIT License - see LICENSE for details.

Metadata

Release files for qdrant-operator 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for qdrant-operator 0.2.0
File Size Uploaded
qdrant_operator-0.2.0.tar.gz 25.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for qdrant-operator 0.2.0
File Interpreter ABI Platform
qdrant_operator-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 55.0 kB

Release files / qdrant_operator-0.2.0.tar.gz

Download URL qdrant_operator-0.2.0.tar.gz
Size 25.1 kB
Tags Source
SHA-256 checksum
How to use checksums
950148ed5b2b67e4cf4cc8dc052b7df54136607e6d2d0ea2c163ba5bc6bbc816
BLAKE2b-256 checksum
How to use checksums
824597ad6206296abcd0716120005017d65bbdcee0562d743042ca65f68ab81a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.

Transparency log

Release files / qdrant_operator-0.2.0-py3-none-any.whl

Download URL qdrant_operator-0.2.0-py3-none-any.whl
Size 29.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d072708c1ecfb5d478d1d830c11ec408789550013a6f8218ede8e96ec2455aa3
BLAKE2b-256 checksum
How to use checksums
35f4f60176caa95fdca5e902ee30de3f5be0e86bf0a685f24b748651863928fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.

Transparency log

Release history Release notifications | RSS feed

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

This release

0.2.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page