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.
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.
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 ##
##################
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" templates/data-pvc.yaml Longhorn-backed PersistentVolumeClaim for persistent data.
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.
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.
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.
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 }} 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.