Skip to main content

Rob Pankow Rob Pankow

Vector Database Storage on Kubernetes: Milvus Architecture for AI Workloads

Jul 22, 2026  |  8 min read

Vector Database Storage on Kubernetes: Milvus Architecture for AI Workloads

The AI inference storage guide covers what happens when a serving pod loads model weights, and the training checkpoint guide covers what happens when a training job writes state to disk. Milvus sits at a third point in the same pipeline: the retrieval step, where an application queries a vector index built from embeddings to find the nearest matches for a request in flight. That query path has its own storage requirements, and they do not match what most teams provision by default.

Milvus’s own architecture separates data into growing (in-memory and local-disk) segments actively being written, a write-ahead log for durability, and sealed segments pushed to object storage once a segment closes. The official deployment guidance treats S3-compatible storage as the tier for all of it. That works for the sealed, cold segments. It is the wrong tier for the growing segments and WAL, where every millisecond of query latency during a high-QPS similarity search comes directly out of application response time.

Why Milvus’s Segment-Based Storage Breaks Generic Kubernetes Volumes

Milvus does not store vectors as a single flat index. It splits a collection into segments, and each segment moves through a lifecycle that has very different I/O characteristics at each stage:

Growing segments hold newly inserted vectors that have not yet been indexed and compacted. These live in memory and on local disk on the query node, and they are read constantly during a similarity search because a query has to check both the sealed index and any recent, not-yet-sealed data to return accurate results.

The write-ahead log durably records every insert and delete before it is acknowledged. Milvus’s log broker (commonly Pulsar or Kafka, depending on deployment mode) depends on fast, low-latency disk for this log, the same write-ahead logging durability pattern used by database commit logs: a slow disk here adds latency to every write, not just large ones.

Sealed segments are immutable once a segment closes and gets its final index built. These are read far less frequently, at larger sequential block sizes, and are the segments Milvus’s own documentation points at S3-compatible object storage for.

Provisioning a single generic StorageClass for all three tiers means either over-provisioning expensive low-latency storage for cold sealed segments, or under-provisioning latency-sensitive storage for the growing segments and WAL that actually gate query response time. Neither is the right default.

Milvus Storage Tiers: Where Each Layer Should Actually Live

The table below maps each Milvus storage tier to the backend it needs, using a representative high-QPS similarity search workload as the reference point.

Milvus storage tierI/O patternLatency sensitivityBest-fit backend
Growing segments (query node)Small random reads, continuousHigh, directly gates query latencyDisaggregated NVMe/TCP or NVMe/RoCE block storage
Write-ahead log (message broker)Sequential append, fsync-boundHigh, gates write acknowledgmentSame NVMe/TCP tier, low fixed p99
Sealed segment index cacheRandom reads on recently-queried segmentsMedium, affects cold-query latencySame tier, with a cache policy layered on top
Sealed segment cold storageLarge sequential reads, infrequentLowS3-compatible object storage

Table 1: Milvus storage tier characteristics and the backend each tier fits best.

Milvus’s own guidance is correct for the bottom row and incomplete for the top three. A disaggregated storage architecture puts the growing segments, WAL, and a recently-queried-segment cache on a shared NVMe fabric separate from the query node’s local disk, so a query node restart does not lose in-flight segment state and a query node under memory pressure can spill to fast network storage instead of local disk that may not exist at the size needed.

A slow write-ahead log turns into slow inserts across the entire collection. Talk to a storage architect about sizing an NVMe/TCP tier for Milvus’s growing segments and WAL, separate from your S3-compatible cold tier. Talk to a storage architect

How Disaggregated NVMe/TCP Closes the Gap Between Hot Index I/O and Cold Tiering

Running Milvus’s query nodes and index nodes with persistent volumes backed by disaggregated NVMe/TCP (or NVMe/RoCE on RDMA-capable fabrics) addresses the two problems the object-storage-only guidance leaves open:

Query node restarts do not lose growing-segment state. Because the volume backing the growing segments and local WAL replay area lives on the storage fabric rather than node-local disk, a rescheduled query node pod reattaches the same PVC and resumes without a full segment reload from object storage, which would otherwise mean a cold-cache query node serving degraded latency until the working set rebuilds.

Sealed-segment index caching gets a real second tier. Instead of every query touching cold object storage for any segment not already resident in query-node memory, a storage layer sitting between memory and S3 caches the recently-queried sealed segments at network-fabric latency, well below what an S3-compatible endpoint returns on a cache miss.

How Milvus's growing segments, WAL, and sealed-segment cache map onto a disaggregated NVMe/TCP tier ahead of S3-compatible cold storage
Figure 1: Milvus's three storage tiers (left), the NVMe/TCP layer that serves the two latency-sensitive tiers (center), and the query-latency and recovery outcome (right).

Milvus deployments also inherit the same snapshot-based backup and rollback pattern already covered for CSI snapshot architecture: a VolumeSnapshot of the growing-segment and WAL volumes gives a point-in-time, storage-side capture of in-flight collection state, restorable in seconds, rather than relying solely on Milvus’s own backup tool to export and re-import segment data through object storage. For teams running multiple collections across environments, a VolumeSnapshotClass per collection tier (frequent, short-retention snapshots for actively-written collections; longer-retention snapshots for stable, production collections) mirrors the pattern already in production for database and training-checkpoint volumes.

Simplyblock licenses per usable storage TB per year, with no per-core fee, and no charge tied to the size of the query-node fleet. A team that scales query nodes horizontally to handle higher QPS does not pay more for the storage tier unless the actual volume of growing-segment, WAL, and cached-segment data grows. For the object-storage side of a Milvus deployment, the AI storage companies overview covers how block and object platforms typically split responsibilities in a mixed AI infrastructure stack, and the scale-out AI storage guide covers sizing a cluster across inference, training, and retrieval workloads together.

Questions and Answers

Why does Milvus need block storage in addition to S3-compatible object storage? Milvus’s own architecture separates data into growing segments, a write-ahead log, and sealed segments. Only the sealed segments are a good fit for S3-compatible object storage: the growing segments and WAL are latency-sensitive, fsync-bound, and read continuously during every similarity search, so they need low-latency block storage rather than an object-storage endpoint built for infrequent, larger reads.

What happens if a Milvus query node restarts on generic Kubernetes storage? If the growing segments and local WAL replay area live on node-local disk or a volume without fast reattachment, a rescheduled query node pod has to rebuild its in-memory working set from object storage before it can serve queries at full accuracy and speed. A persistent volume claim backed by simplyblock’s NVMe/TCP storage reattaches to the new pod in seconds without that cold-cache rebuild.

Can Milvus’s own backup tool replace CSI snapshots for disaster recovery? Milvus’s backup tool exports and re-imports collection data through object storage, which works for scheduled, infrequent backups but adds a full data-movement step to every backup and restore cycle. A CSI volume snapshot of the underlying growing-segment and WAL volumes is a storage-side, near-instant point-in-time capture, and restoring it is a volume-level operation rather than a re-import through the object-storage path.

How does simplyblock fit into a Milvus deployment on Kubernetes? Simplyblock provides NVMe/TCP (or NVMe/RoCE) block storage as persistent volumes for Milvus’s query nodes and index nodes, covering the growing-segment, WAL, and sealed-segment cache tiers that S3-compatible object storage alone cannot serve at the latency a high-QPS similarity search needs. Simplyblock’s CSI driver adds fast, storage-side snapshots for collection-level backup and rollback, alongside whatever object-storage backend handles Milvus’s cold sealed-segment tier.

How should I size storage for a Milvus deployment on Kubernetes? Size the NVMe/TCP tier for the working set of growing segments plus the WAL retention window across all query nodes, and add headroom for a sealed-segment cache sized to the collections queried most frequently. Cold, infrequently-queried sealed segments can stay on S3-compatible object storage. Simplyblock’s pricing is per usable TB per year with no per-core fee, so scaling the query-node fleet horizontally for higher QPS is a compute decision, not an automatic storage cost increase.

You may also like:

NVMe/TCP vs NVMe/RoCE for Kubernetes Storage: Choosing the Right Fabric
NVMe/TCP vs NVMe/RoCE for Kubernetes Storage: Choosing the Right Fabric

NVMe over Fabrics gives Kubernetes clusters low-latency block storage over the network. The transport you pick, TCP or RoCE, determines your latency floor, infrastructure cost, and operational complexity. Here is how to choose.

We Break Our Storage So You Never Have To
We Break Our Storage So You Never Have To

Simplyblock runs 100+ hours of automated chaos engineering before every release: real NVMe hardware, real FIO workloads, four failure types injected under live load. This is what we test, why it is necessary, and what it means for your infrastructure.

NVMe Storage Cost Optimization in 2026: Erasure Coding, Thin Provisioning, and Compute Efficiency
NVMe Storage Cost Optimization in 2026: Erasure Coding, Thin Provisioning, and Compute Efficiency

NVMe drives deliver the performance Kubernetes stateful workloads need, but triple replication and thick provisioning multiply their cost fast. Here is a practical breakdown of erasure coding economics, thin provisioning, and how sub-millisecond latency reduces compute waste.