Qdrant

Vector database powering semantic search and grounding the local models with RAG

Qdrant stores embeddings for semantic search and RAG. Collections are derived data: they can always be rebuilt from source documents by re-embedding, which shapes how it is operated.

ArgoCD configuration

Excerpt from argocd-apps/values.yaml in the argocd-apps chart, with annotations added for this site:

qdrant:
  application: true
  project: cluster-services
  # true: collections are rebuildable from source data by re-embedding, so config drift is cheap to auto-correct
  autoSync: true

##################
## Applications ##
##################

Chart values

The full qdrant/values.yaml from the service's own chart:

### Name of the project - Many variable ###
hostname: qdrant.opi5cluster.co.uk

### Qdrant Database ###
qdrantImage: registry.opi5cluster.co.uk/qdrant:v1.19.0

## Qdrant Ports
httpPort: 6333
grpcPort: 6334

## Data Volume
volume:
  storageClass: longhorn-ssd-small
  size: 20Gi
  accessModes: ReadWriteOnce

resources:
  requests:
    memory: "1Gi"
    cpu: "500m"

Manifests & templates

templates/data-pvc.yaml

Longhorn-backed PersistentVolumeClaim for persistent data.

Show manifest
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: {{ .Release.Namespace }}-data-pvc
  namespace: {{ .Release.Namespace }}
spec:
  accessModes:
  - {{ .Values.volume.accessModes }}
  resources:
    requests:
      storage: {{ .Values.volume.size }}
  storageClassName: {{ .Values.volume.storageClass }}

templates/http-route.yaml

Gateway API HTTPRoute exposing the service through the Istio gateway under opi5cluster.co.uk.

Show manifest
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: {{ .Release.Namespace }}-httproute
  namespace: {{ .Release.Namespace }}
  annotations:
    link.argocd.argoproj.io/external-link: "https://{{ .Release.Namespace }}.opi5cluster.co.uk/https:/dashboard"
spec:
  parentRefs:
    - name: istio-gateway
      namespace: istio
      sectionName: websecure
  hostnames:
    - {{ .Release.Namespace }}.opi5cluster.co.uk
  rules:
    - backendRefs:
        - name: {{ .Release.Namespace }}-service
          port: {{ .Values.httpPort }}

templates/qdrant-statefulset.yaml

StatefulSet with Longhorn storage for the vector collections.

Show manifest
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: {{ .Release.Namespace }}-statefulset
  namespace: {{ .Release.Namespace }}
  labels:
    app: {{ .Release.Namespace }}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ .Release.Namespace }}
  template:
    metadata:
      labels:
        app: {{ .Release.Namespace }}
    spec:
      securityContext:
        runAsUser: 1000
        runAsGroup: 1000
        fsGroup: 1000
      containers:
      - name: {{ .Release.Namespace }}
        image: {{ .Values.qdrantImage }}
        ports:
        - containerPort: {{ .Values.httpPort }}
        - containerPort: {{ .Values.grpcPort }}
        env:
        - name: QDRANT__SERVICE__HTTP_PORT
          value: {{ .Values.httpPort | quote }}
        - name: QDRANT__SERVICE__GRPC_PORT
          value: {{ .Values.grpcPort | quote }}
        {{- with .Values.resources }}
        resources:
          {{- toYaml . | nindent 10 }}
        {{ end }}
        volumeMounts:
        - name: data
          mountPath: /qdrant/storage
          readOnly: false
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: {{ .Release.Namespace }}-data-pvc

templates/service.yaml

ClusterIP Service fronting the workload.

Show manifest
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Namespace }}-service
  namespace: {{ .Release.Namespace }}
spec:
  type: ClusterIP
  selector:
    app: {{ .Release.Namespace }}
  ports:
    - name: {{ .Release.Namespace }}-http-port
      port: {{ .Values.httpPort }}
      targetPort: {{ .Values.httpPort }}
    - name: {{ .Release.Namespace }}-grpc-port
      port: {{ .Values.grpcPort }}
      targetPort: {{ .Values.grpcPort }}

Trade-offs

Decision. autoSync on

Alternative. Manual sync

Why. Collections are rebuildable from source data, so a config drift auto-corrects with a re-embed instead of a careful manual recovery.

← Back to AI Stack · All service groups