Merge pull request #1511 from qdrant/chore/bashofmann/private-cloud-1.6.0

Private Cloud 1.6.1
This commit is contained in:
Bastian Hofmann
2025-03-14 13:00:27 +01:00
committed by GitHub
5 changed files with 328 additions and 86 deletions
@@ -24,6 +24,8 @@ Package v1 contains API Schema definitions for the qdrant.io v1 API group
- [QdrantClusterScheduledSnapshotList](#qdrantclusterscheduledsnapshotlist)
- [QdrantClusterSnapshot](#qdrantclustersnapshot)
- [QdrantClusterSnapshotList](#qdrantclustersnapshotlist)
- [QdrantEntity](#qdrantentity)
- [QdrantEntityList](#qdrantentitylist)
- [QdrantRelease](#qdrantrelease)
- [QdrantReleaseList](#qdrantreleaselist)
@@ -57,6 +59,26 @@ _Appears in:_
#### ComponentReference
_Appears in:_
- [QdrantCloudRegionSpec](#qdrantcloudregionspec)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `apiVersion` _string_ | APIVersion is the group and version of the component being referenced. | | |
| `kind` _string_ | Kind is the type of component being referenced | | |
| `name` _string_ | Name is the name of component being referenced | | |
| `namespace` _string_ | Namespace is the namespace of component being referenced. | | |
| `markedForDeletion` _boolean_ | MarkedForDeletion specifies whether the component is marked for deletion | | |
#### ComponentStatus
@@ -77,6 +99,67 @@ _Appears in:_
| `message` _string_ | Message specifies the info explaining the current phase of the component | | |
#### EntityPhase
_Underlying type:_ _string_
_Appears in:_
- [QdrantEntityStatus](#qdrantentitystatus)
#### EntityResult
_Underlying type:_ _string_
EntityResult is the last result from the invocation to a manager
_Appears in:_
- [QdrantEntityStatusResult](#qdrantentitystatusresult)
#### GPU
_Appears in:_
- [QdrantClusterSpec](#qdrantclusterspec)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `gpuType` _[GPUType](#gputype)_ | GPUType specifies the type of the GPU to use. If set, GPU indexing is enabled. | | Enum: [nvidia amd] <br /> |
| `forceHalfPrecision` _boolean_ | ForceHalfPrecision for `f32` values while indexing.<br />`f16` conversion will take place<br />only inside GPU memory and won't affect storage type. | false | |
| `deviceFilter` _string array_ | DeviceFilter for GPU devices by hardware name. Case-insensitive.<br />List of substrings to match against the gpu device name.<br />Example: [- "nvidia"]<br />If not specified, all devices are accepted. | | MinItems: 1 <br /> |
| `devices` _string array_ | Devices is a List of explicit GPU devices to use.<br />If host has multiple GPUs, this option allows to select specific devices<br />by their index in the list of found devices.<br />If `deviceFilter` is set, indexes are applied after filtering.<br />If not specified, all devices are accepted. | | MinItems: 1 <br /> |
| `parallelIndexes` _integer_ | ParallelIndexes is the number of parallel indexes to run on the GPU. | 1 | Minimum: 1 <br /> |
| `groupsCount` _integer_ | GroupsCount is the amount of used vulkan "groups" of GPU.<br />In other words, how many parallel points can be indexed by GPU.<br />Optimal value might depend on the GPU model.<br />Proportional, but doesn't necessary equal to the physical number of warps.<br />Do not change this value unless you know what you are doing. | | Minimum: 1 <br /> |
| `allowIntegrated` _boolean_ | AllowIntegrated specifies whether to allow integrated GPUs to be used. | false | |
#### GPUType
_Underlying type:_ _string_
_Appears in:_
- [GPU](#gpu)
#### HelmRelease
@@ -111,6 +194,22 @@ _Appears in:_
| `object` _[HelmRepository](#helmrepository)_ | Object specifies the helm repository object | | EmbeddedResource: {} <br /> |
#### InferenceConfig
_Appears in:_
- [QdrantConfiguration](#qdrantconfiguration)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `enabled` _boolean_ | Enabled specifies whether to enable inference for the cluster or not. | false | |
#### Ingress
@@ -246,6 +345,47 @@ _Appears in:_
| `grpcHost` _string_ | GRPCHost specifies the host name for the GRPC ingress. | | |
#### NodeInfo
_Appears in:_
- [QdrantCloudRegionStatus](#qdrantcloudregionstatus)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `name` _string_ | Name specifies the name of the node | | |
| `region` _string_ | Region specifies the region of the node | | |
| `zone` _string_ | Zone specifies the zone of the node | | |
| `instanceType` _string_ | InstanceType specifies the instance type of the node | | |
| `arch` _string_ | Arch specifies the CPU architecture of the node | | |
| `capacity` _[NodeResourceInfo](#noderesourceinfo)_ | Capacity specifies the capacity of the node | | |
| `allocatable` _[NodeResourceInfo](#noderesourceinfo)_ | Allocatable specifies the allocatable resources of the node | | |
#### NodeResourceInfo
_Appears in:_
- [NodeInfo](#nodeinfo)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `cpu` _string_ | CPU specifies the CPU resources of the node | | |
| `memory` _string_ | Memory specifies the memory resources of the node | | |
| `pods` _string_ | Pods specifies the pods resources of the node | | |
| `ephemeralStorage` _string_ | EphemeralStorage specifies the ephemeral storage resources of the node | | |
#### NodeStatus
@@ -265,74 +405,6 @@ _Appears in:_
| `version` _string_ | Version specifies the version of Qdrant running on the node | | |
#### Operation
_Appears in:_
- [QdrantClusterStatus](#qdrantclusterstatus)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `type` _[OperationType](#operationtype)_ | Type specifies the type of the operation | | |
| `phase` _[OperationPhase](#operationphase)_ | Phase specifies the phase of the operation | | |
| `id` _integer_ | Id specifies the id of the operation | | |
| `startTime` _string_ | StartTime specifies the time when the operation started | | |
| `completionTime` _string_ | CompletionTime specifies the time when the operation completed | | |
| `message` _string_ | Message specifies the message of the operation | | |
| `subOperation` _boolean_ | SubOperation specifies whether the operation is a sub-operation of another operation | | |
| `steps` _[OperationStep](#operationstep) array_ | Steps specifies the steps the operation has performed | | |
#### OperationPhase
_Underlying type:_ _string_
_Appears in:_
- [Operation](#operation)
#### OperationStep
_Appears in:_
- [Operation](#operation)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `name` _string_ | Name specifies the name of the step | | |
| `id` _integer_ | Id specifies the id of the step | | |
| `phase` _[StepPhase](#stepphase)_ | Phase specifies the phase of the step | | |
| `message` _string_ | Message specifies the reason in case of failure | | |
#### OperationType
_Underlying type:_ _string_
_Appears in:_
- [Operation](#operation)
#### Pause
@@ -402,8 +474,9 @@ _Appears in:_
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `id` _string_ | Id specifies the unique identifier of the region | | |
| `helmRepositories` _[HelmRepository](#helmrepository) array_ | HelmRepositories specifies the list of helm repositories to be created to the region | | |
| `helmReleases` _[HelmRelease](#helmrelease) array_ | HelmReleases specifies the list of helm releases to be created to the region | | |
| `components` _[ComponentReference](#componentreference) array_ | Components specifies the list of components to be installed in the region | | |
| `helmRepositories` _[HelmRepository](#helmrepository) array_ | HelmRepositories specifies the list of helm repositories to be created to the region<br />Deprecated: Use "Components" instead | | |
| `helmReleases` _[HelmRelease](#helmrelease) array_ | HelmReleases specifies the list of helm releases to be created to the region<br />Deprecated: Use "Components" instead | | |
@@ -650,7 +723,6 @@ _Appears in:_
| `clusterManager` _boolean_ | ClusterManager specifies whether to use the cluster manager for this cluster.<br />The Python-operator will deploy a dedicated cluster manager instance.<br />The Go-operator will use a shared instance.<br />If not set, the default will be taken from the operator config. | | |
| `suspend` _boolean_ | Suspend specifies whether to suspend the cluster.<br />If enabled, the cluster will be suspended and all related resources will be removed except the PVCs. | false | |
| `pauses` _[Pause](#pause) array_ | Pauses specifies a list of pause request by developer for manual maintenance.<br />Operator will skip handling any changes in the CR if any pause request is present. | | |
| `distributed` _boolean_ | Deprecated | | |
| `image` _[QdrantImage](#qdrantimage)_ | Image specifies the image to use for each Qdrant node. | | |
| `resources` _[Resources](#resources)_ | Resources specifies the resources to allocate for each Qdrant node. | | |
| `security` _[QdrantSecurityContext](#qdrantsecuritycontext)_ | Security specifies the security context for each Qdrant node. | | |
@@ -659,11 +731,13 @@ _Appears in:_
| `config` _[QdrantConfiguration](#qdrantconfiguration)_ | Config specifies the Qdrant configuration setttings for the clusters. | | |
| `ingress` _[Ingress](#ingress)_ | Ingress specifies the ingress for the cluster. | | |
| `service` _[KubernetesService](#kubernetesservice)_ | Service specifies the configuration of the Qdrant Kubernetes Service. | | |
| `gpu` _[GPU](#gpu)_ | GPU specifies GPU configuration for the cluster. If this field is not set, no GPU will be used. | | |
| `statefulSet` _[KubernetesStatefulSet](#kubernetesstatefulset)_ | StatefulSet specifies the configuration of the Qdrant Kubernetes StatefulSet. | | |
| `storageClassNames` _[StorageClassNames](#storageclassnames)_ | StorageClassNames specifies the storage class names for db and snapshots. | | |
| `topologySpreadConstraints` _[TopologySpreadConstraint](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#topologyspreadconstraint-v1-core)_ | TopologySpreadConstraints specifies the topology spread constraints for the cluster. | | |
| `podDisruptionBudget` _[PodDisruptionBudgetSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#poddisruptionbudgetspec-v1-policy)_ | PodDisruptionBudget specifies the pod disruption budget for the cluster. | | |
| `restartAllPodsConcurrently` _boolean_ | RestartAllPodsConcurrently specifies whether to restart all pods concurrently (also called one-shot-restart).<br />If enabled, all the pods in the cluster will be restarted concurrently in situations where multiple pods<br />need to be restarted like when RestartedAtAnnotationKey is added/updated or the Qdrant version need to be upgraded.<br />This helps sharded but not replicated clusters to reduce downtime to possible minimum during restart. | | |
| `startupDelaySeconds` _integer_ | If StartupDelaySeconds is set (> 0), an additional 'sleep <value>' will be emitted to the pod startup.<br />The sleep will be added when a pod is restarted, it will not force any pod to restart.<br />This feature can be used for debugging the core, e.g. if a pod is in crash loop, it provided a way<br />to inspect the attached storage. | | |
@@ -686,6 +760,7 @@ _Appears in:_
| `service` _[QdrantConfigurationService](#qdrantconfigurationservice)_ | Service specifies the service level configuration for Qdrant. | | |
| `tls` _[QdrantConfigurationTLS](#qdrantconfigurationtls)_ | TLS specifies the TLS configuration for Qdrant. | | |
| `storage` _[StorageConfig](#storageconfig)_ | Storage specifies the storage configuration for Qdrant. | | |
| `inference` _[InferenceConfig](#inferenceconfig)_ | Inference configuration. This is used in Qdrant Managed Cloud only. If not set Inference is not available to this cluster. | | |
#### QdrantConfigurationCollection
@@ -757,6 +832,85 @@ _Appears in:_
| --- | --- | --- | --- |
| `cert` _[QdrantSecretKeyRef](#qdrantsecretkeyref)_ | Reference to the secret containing the server certificate chain file | | |
| `key` _[QdrantSecretKeyRef](#qdrantsecretkeyref)_ | Reference to the secret containing the server private key file | | |
| `caCert` _[QdrantSecretKeyRef](#qdrantsecretkeyref)_ | Reference to the secret containing the CA certificate file | | |
#### QdrantEntity
QdrantEntity is the Schema for the qdrantentities API
_Appears in:_
- [QdrantEntityList](#qdrantentitylist)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `apiVersion` _string_ | `qdrant.io/v1` | | |
| `kind` _string_ | `QdrantEntity` | | |
| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | | |
| `spec` _[QdrantEntitySpec](#qdrantentityspec)_ | | | |
#### QdrantEntityList
QdrantEntityList contains a list of QdrantEntity objects
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `apiVersion` _string_ | `qdrant.io/v1` | | |
| `kind` _string_ | `QdrantEntityList` | | |
| `metadata` _[ListMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#listmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | | |
| `items` _[QdrantEntity](#qdrantentity) array_ | | | |
#### QdrantEntitySpec
QdrantEntitySpec defines the desired state of QdrantEntity
_Appears in:_
- [QdrantEntity](#qdrantentity)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `id` _string_ | The unique identifier of the entity (in UUID format). | | |
| `entityType` _string_ | The type of the entity. | | |
| `createdAt` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta)_ | Timestamp when the entity was created. | | |
| `lastUpdatedAt` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta)_ | Timestamp when the entity was last updated. | | |
| `deletedAt` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta)_ | Timestamp when the entity was deleted (or is started to be deleting).<br />If not set the entity is not deleted | | |
| `payload` _[JSON](#json)_ | Generic payload for this entity | | |
#### QdrantEntityStatusResult
QdrantEntityStatusResult is the last result from the invocation to a manager
_Appears in:_
- [QdrantEntityStatus](#qdrantentitystatus)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `result` _[EntityResult](#entityresult)_ | The result of last reconcile of the entity | | Enum: [Ok Pending Error] <br /> |
| `reason` _string_ | The reason of the result (e.g. in case of an error) | | |
| `payload` _[JSON](#json)_ | The optional payload of the status. | | |
#### QdrantImage
@@ -999,17 +1153,25 @@ _Appears in:_
#### StepPhase
#### StorageClass
_Underlying type:_ _string_
_Appears in:_
- [OperationStep](#operationstep)
- [QdrantCloudRegionStatus](#qdrantcloudregionstatus)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `name` _string_ | Name specifies the name of the storage class | | |
| `default` _boolean_ | Default specifies whether the storage class is the default storage class | | |
| `provisioner` _string_ | Provisioner specifies the provisioner of the storage class | | |
| `allowVolumeExpansion` _boolean_ | AllowVolumeExpansion specifies whether the storage class allows volume expansion | | |
| `reclaimPolicy` _string_ | ReclaimPolicy specifies the reclaim policy of the storage class | | |
| `parameters` _object (keys:string, values:string)_ | Parameters specifies the parameters of the storage class | | |
#### StorageClassNames
@@ -1078,6 +1240,23 @@ _Appears in:_
| `allowedSourceRanges` _string array_ | AllowedSourceRanges specifies the allowed CIDR source ranges for the ingress. | | |
#### VolumeSnapshotClass
_Appears in:_
- [QdrantCloudRegionStatus](#qdrantcloudregionstatus)
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `name` _string_ | Name specifies the name of the volume snapshot class | | |
| `driver` _string_ | Driver specifies the driver of the volume snapshot class | | |
#### VolumeSnapshotInfo
@@ -5,6 +5,11 @@ weight: 5
# Changelog
## 1.6.1 (2025-03-14)
* Add support for GPU instances
* Experimental support for automatic shard balancing
## 1.5.1 (2025-03-04)
* Fix scaling down clusters that have TLS with self-signed certificates configured
@@ -91,7 +91,7 @@ operator:
appEnvironment: kubernetes
# The log level for the operator
# Available options: DEBUG | INFO | WARN | ERROR
logLevel: INFO
logLevel: INFO
# Metrics contains the operator config related the metrics
metrics:
# The port used for metrics
@@ -130,7 +130,7 @@ operator:
# Qdrant config contains settings specific for the database
qdrant:
# The config where to find the image for qdrant
image:
image:
# The repository where to find the image for qdrant
# Default is "qdrant/qdrant"
repository: registry.cloud.qdrant.io/qdrant/qdrant
@@ -154,7 +154,7 @@ operator:
# See: <https://qdrant.tech/articles/io_uring/#and-what-about-qdrant>
asyncScorer: false
# Qdrant DB log level
# Available options: DEBUG | INFO | WARN | ERROR
# Available options: DEBUG | INFO | WARN | ERROR
# Default is "INFO"
logLevel: INFO
# Default Qdrant security context configuration
@@ -198,9 +198,8 @@ operator:
# If disabled, all other properties in this struct are disregarded. Otherwise, the individual features will be inspected.
# Default is false.
enable: true
# The endpoint address the cluster manager could be reached
# If set, this should be a full URL like: http://cluster-manager.qdrant-cloud-ns.svc.cluster.local:7333
endpointAddress: http://cluster-manager
# The endpoint address where the cluster manager can be reached
endpointAddress: "http://qdrant-cluster-manager"
# InvocationInterval is the interval between calls (started after the previous call is retured)
# Default is 10 seconds
invocationInterval: 10s
@@ -209,7 +208,7 @@ operator:
timeout: 30s
# Specifies overrides for the manage rules
manageRulesOverrides:
#dry_run:
#dry_run:
#max_transfers:
#max_transfers_per_collection:
#rebalance:
@@ -248,7 +247,7 @@ operator:
# Default is 3 seconds
telemetryTimeout: 3s
# MaxConcurrentReconciles is the maximum number of concurrent Reconciles which can be run. Defaults to 20.
maxConcurrentReconciles: 20
maxConcurrentReconciles: 20
# VolumeExpansionMode specifies the expansion mode, which can be online or offline (e.g. in case of Azure).
# Available options: Online, Offline
# Default is Online
@@ -283,7 +282,7 @@ operator:
restores:
# Whether or not the Restore feature is enabled.
# Default is true.
enable: true
enable: true
# MaxConcurrentReconciles is the maximum number of concurrent Reconciles which can be run. Defaults to 1.
maxConcurrentReconciles: 1
@@ -80,8 +80,8 @@ Once you are onboarded to Qdrant Private Cloud, you will receive credentials to
kubectl create namespace qdrant-private-cloud
kubectl create secret docker-registry qdrant-registry-creds --docker-server=registry.cloud.qdrant.io --docker-username='your-username' --docker-password='your-password' --namespace qdrant-private-cloud
helm registry login 'registry.cloud.qdrant.io' --username 'your-username' --password 'your-password'
helm upgrade --install qdrant-private-cloud-crds oci://registry.cloud.qdrant.io/qdrant-charts/qdrant-kubernetes-api --namespace qdrant-private-cloud --version v1.12.0 --wait
helm upgrade --install qdrant-private-cloud oci://registry.cloud.qdrant.io/qdrant-charts/qdrant-private-cloud --namespace qdrant-private-cloud --version 1.5.1
helm upgrade --install qdrant-private-cloud-crds oci://registry.cloud.qdrant.io/qdrant-charts/qdrant-kubernetes-api --namespace qdrant-private-cloud --version v1.15.0 --wait
helm upgrade --install qdrant-private-cloud oci://registry.cloud.qdrant.io/qdrant-charts/qdrant-private-cloud --namespace qdrant-private-cloud --version 1.6.1
```
For a list of available versions consult the [Private Cloud Changelog](/documentation/private-cloud/changelog/).
@@ -287,4 +287,63 @@ step certificate create mydomain.com qdrant-nodes.crt qdrant-nodes.key \
--san qdrant-my-cluster-0.qdrant-headless-my-cluster \
--san qdrant-my-cluster-1.qdrant-headless-my-cluster
```
</aside>
</aside>
## GPU support
Starting with Qdrant 1.13 and private-cloud version 1.6.1 you can create a cluster that uses GPUs to accelarate indexing.
As a prerequisite, you need to have a Kubernetes cluster with GPU support. You can check the [Kubernetes documentation](https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/) for generic information on GPUs and Kubernetes, or the documentation of your specific Kubernetes distribution.
Examples:
* [AWS EKS GPU support](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/amazon-eks.html)
* [Azure AKS GPU support](https://docs.microsoft.com/en-us/azure/aks/gpu-cluster)
* [GCP GKE GPU support](https://cloud.google.com/kubernetes-engine/docs/how-to/gpus)
* [Vultr Kubernetes GPU support](https://blogs.vultr.com/whats-new-vultr-q2-2023)
Once you have a Kubernetes cluster with GPU support, you can create a QdrantCluster with GPU support:
```yaml
apiVersion: qdrant.io/v1
kind: QdrantCluster
metadata:
name: qdrant-a7d8d973-0cc5-42de-8d7b-c29d14d24840
labels:
cluster-id: "a7d8d973-0cc5-42de-8d7b-c29d14d24840"
customer-id: "acme-industries"
spec:
id: "a7d8d973-0cc5-42de-8d7b-c29d14d24840"
version: "v1.13.4"
size: 1
resources:
cpu: 2
memory: "8Gi"
storage: "40Gi"
gpu:
gpuType: "nvidia"
```
Once the cluster Pod has started, you can check in the logs if the GPU is detected:
```shell
$ kubectl logs qdrant-a7d8d973-0cc5-42de-8d7b-c29d14d24840-0
Starting initializing for pod 0
_ _
__ _ __| |_ __ __ _ _ __ | |_
/ _` |/ _` | '__/ _` | '_ \| __|
| (_| | (_| | | | (_| | | | | |_
\__, |\__,_|_| \__,_|_| |_|\__|
|_|
Version: 1.13.4, build: 7abc6843
Access web UI at http://localhost:6333/dashboard
2025-03-14T10:25:30.509636Z INFO gpu::instance: Found GPU device: NVIDIA A16-2Q
2025-03-14T10:25:30.509679Z INFO gpu::instance: Found GPU device: llvmpipe (LLVM 15.0.7, 256 bits)
2025-03-14T10:25:30.509734Z INFO gpu::device: Create GPU device NVIDIA A16-2Q
...
```
For more GPU configuration options, see the [Qdrant Private Cloud API Reference](/documentation/private-cloud/api-reference/).