Skip to content

Conversation

@AlvinRamoutar
Copy link
Contributor

@AlvinRamoutar AlvinRamoutar commented Nov 3, 2025

See #400 .

I am one of many K8s operators deploying Qdrant to a shared K8s environment.

While we leverage namespace segregation for services, I want to further extend this functionality to resource labels.

This way, we can deploy multiple Qdrants to a single namespace while:

  • ensuring operators can select individual components by our custom labelling
  • grouping for observability and cost tracking tooling

Notes:

@AlvinRamoutar AlvinRamoutar force-pushed the feat/alvinramoutar/qdrant-1.15.6 branch from cbc68be to a288408 Compare November 3, 2025 05:33
@AlvinRamoutar
Copy link
Contributor Author

AlvinRamoutar commented Nov 3, 2025

TestStatefulSetLabels

$ go test -v ./test -run TestStatefulSetLabels
=== RUN   TestStatefulSetLabels
=== PAUSE TestStatefulSetLabels
=== CONT  TestStatefulSetLabels
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 qdrant_labels_test.go:26: Namespace: %s
 qdrant-krn95o
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67: Running command helm with args [template --namespace qdrant-krn95o --set-json additionalLabels={"example.com/customLabel": "customValue"} --show-only templates/statefulset.yaml qdrant C:\Users\ramoua\source\repos\qdrant-helm-fork\charts\qdrant]
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67: ---
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67: # Source: qdrant/templates/statefulset.yaml
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67: apiVersion: apps/v1
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67: kind: StatefulSet
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67: metadata:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:   name: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:   labels:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:     helm.sh/chart: qdrant-1.15.5
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:     app: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:     app.kubernetes.io/name: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:     app.kubernetes.io/instance: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:     app.kubernetes.io/version: "v1.15.5"
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:     app.kubernetes.io/managed-by: Helm
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:     example.com/customLabel: customValue
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67: spec:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:   replicas: 1
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:   podManagementPolicy: Parallel
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:   selector:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:     matchLabels:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       app: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       app.kubernetes.io/name: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       app.kubernetes.io/instance: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:   serviceName: qdrant-headless
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:   template:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:     metadata:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       annotations:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         checksum/config: 14594dcf73752cab265519febc68307c659e6716c287c62c790b056692d3032a
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       labels:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         app: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         app.kubernetes.io/name: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         app.kubernetes.io/instance: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         example.com/customLabel: customValue
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:     spec:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       initContainers:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       - name: ensure-dir-ownership
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         image: "docker.io/qdrant/qdrant:v1.15.5"       
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         command:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - chown
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - -R
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - 1000:3000
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - /qdrant/storage
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - /qdrant/snapshots
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         volumeMounts:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - name: qdrant-storage
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             mountPath: /qdrant/storage
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - name: qdrant-snapshots
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             mountPath: /qdrant/snapshots
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       containers:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         - name: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           image: "docker.io/qdrant/qdrant:v1.15.5"     
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           imagePullPolicy: IfNotPresent
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           env:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             - name: QDRANT_INIT_FILE_PATH
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:               value: /qdrant/init/.qdrant-initialized  
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           command: ["/bin/bash", "-c"]
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           args:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - ./config/initialize.sh
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           ports:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             - name: http
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:               containerPort: 6333
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:               protocol: TCP
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             - name: grpc
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:               containerPort: 6334
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:               protocol: TCP
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             - name: p2p
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:               containerPort: 6335
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:               protocol: TCP
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           readinessProbe:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             httpGet:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:               path: "/readyz"
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:               port: 6333
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             initialDelaySeconds: 5
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             timeoutSeconds: 1
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             periodSeconds: 5
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             successThreshold: 1
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             failureThreshold: 6
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           resources:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             {}
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           securityContext:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             allowPrivilegeEscalation: false
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             privileged: false
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             readOnlyRootFilesystem: true
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             runAsGroup: 2000
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             runAsNonRoot: true
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             runAsUser: 1000
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           lifecycle:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             preStop:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:               exec:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:                 command:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:                 - sleep
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:                 - "3"
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           volumeMounts:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - name: qdrant-storage
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             mountPath: /qdrant/storage
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - name: qdrant-config
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             mountPath: /qdrant/config/initialize.sh    
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             subPath: initialize.sh
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - name: qdrant-config
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             mountPath: /qdrant/config/production.yaml  
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             subPath: production.yaml
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - name: qdrant-snapshots
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             mountPath: /qdrant/snapshots
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - name: qdrant-init
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             mountPath: /qdrant/init
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       securityContext:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         fsGroup: 3000
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         fsGroupChangePolicy: Always
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       serviceAccountName: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       volumes:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         - name: qdrant-config
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           configMap:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             name: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             defaultMode: 0755
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         - name: qdrant-snapshots
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           emptyDir: {}
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         - name: qdrant-init
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           emptyDir: {}
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:   volumeClaimTemplates:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:     - metadata:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         name: qdrant-storage
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         labels:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           app: qdrant
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:       spec:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         storageClassName:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         accessModes:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           - "ReadWriteOnce"
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:         resources:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:           requests:
TestStatefulSetLabels 2025-11-02T23:55:08-05:00 logger.go:67:             storage: "10Gi"
--- PASS: TestStatefulSetLabels (0.18s)
PASS
ok      github.com/qdrant/qdrant-helm/test      2.879s

TestIngressLabels

$ go test -v ./test -run TestIngressLabels
=== RUN   TestIngressLabels
=== PAUSE TestIngressLabels
=== CONT  TestIngressLabels
TestIngressLabels 2025-11-02T23:57:41-05:00 qdrant_labels_test.go:52: Namespace: %s
 qdrant-yfiitn
TestIngressLabels 2025-11-02T23:57:41-05:00 logger.go:67: Running command helm with args [template --namespace qdrant-yfiitn --set-json additionalLabels={"example.com/customLabel": "customValue"} --set-json ingress.enabled=true --show-only templates/ingress.yaml qdrant C:\Users\ramoua\source\repos\qdrant-helm-fork\charts\qdrant]
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67: ---
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67: # Source: qdrant/templates/ingress.yaml
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67: apiVersion: networking.k8s.io/v1
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67: kind: Ingress
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67: metadata:
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:   name: qdrant
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:   labels:
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:     helm.sh/chart: qdrant-1.15.5
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:     app: qdrant
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:     app.kubernetes.io/name: qdrant
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:     app.kubernetes.io/instance: qdrant
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:     app.kubernetes.io/version: "v1.15.5"
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:     app.kubernetes.io/managed-by: Helm
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:     example.com/customLabel: customValue
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67: spec:
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:   rules:
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:     - host: "example-domain.com"
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:       http:
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:         paths:
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:           - path: "/"
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:             pathType: "Prefix"
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:             backend:
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:               service:
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:                 name: qdrant
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:                 port:
TestIngressLabels 2025-11-02T23:57:42-05:00 logger.go:67:                   number: 6333
--- PASS: TestIngressLabels (0.20s)
PASS
ok      github.com/qdrant/qdrant-helm/test      3.091s

TestServiceAccountLabels

$ go test -v ./test -run TestServiceAccountLabels
=== RUN   TestServiceAccountLabels
=== PAUSE TestServiceAccountLabels
=== CONT  TestServiceAccountLabels
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 qdrant_labels_test.go:79: Namespace: %s
 qdrant-h3el2e
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67: Running command helm with args [template --namespace qdrant-h3el2e --set-json additionalLabels={"example.com/customLabel": "customValue"} --show-only templates/serviceaccount.yaml qdrant C:\Users\ramoua\source\repos\qdrant-helm-fork\charts\qdrant]
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67: ---
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67: # Source: qdrant/templates/serviceaccount.yaml
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67: apiVersion: v1
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67: kind: ServiceAccount
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67: metadata:
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67:   name: qdrant
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67:   labels:
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67:     helm.sh/chart: qdrant-1.15.5
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67:     app: qdrant
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67:     app.kubernetes.io/name: qdrant
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67:     app.kubernetes.io/instance: qdrant
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67:     app.kubernetes.io/version: "v1.15.5"
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67:     app.kubernetes.io/managed-by: Helm
TestServiceAccountLabels 2025-11-02T23:57:55-05:00 logger.go:67:
TestServiceAccountLabels 2025-11-02T23:57:56-05:00 logger.go:67:     example.com/customLabel: customValue
--- PASS: TestServiceAccountLabels (0.18s)
PASS
ok      github.com/qdrant/qdrant-helm/test      0.831s

Copy link
Collaborator

@bashofmann bashofmann left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Implementation looks good. Thanks for the contribution.

Could you please remove the version bump and the changes from the changelogs from this PR? We will add these, when we prepare a release with the next Qdrant patch release.

Also, please run gofmt to make the linter happy.

@AlvinRamoutar AlvinRamoutar force-pushed the feat/alvinramoutar/qdrant-1.15.6 branch from 431bb4d to 0b04cfd Compare November 24, 2025 22:52
@AlvinRamoutar
Copy link
Contributor Author

Implementation looks good. Thanks for the contribution.

Could you please remove the version bump and the changes from the changelogs from this PR? We will add these, when we prepare a release with the next Qdrant patch release.

Also, please run gofmt to make the linter happy.

Appreciate the review @bashofmann , updated.

@AlvinRamoutar
Copy link
Contributor Author

Is there a way I could trigger PR workflows @bashofmann ?

@bashofmann
Copy link
Collaborator

I fixed the failing test in #424. Thank you for your contribution.

@bashofmann bashofmann closed this Dec 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants