KubeBlocks supports two distinct Milvus deployment architectures:
| Architecture | Components | Use Case |
|---|---|---|
| Standalone | Single all-in-one Milvus pod + etcd + MinIO | Development, testing, small vector datasets |
| Distributed | Proxy + MixCoord + DataNode + IndexNode + QueryNode + etcd + Pulsar/Kafka + MinIO | Production workloads requiring HA and horizontal scale |
Milvus Standalone runs all coordinator and worker roles as goroutines inside a single milvus process. There is no inter-pod communication within the Milvus layer — all work happens in memory within one pod. External storage (etcd and MinIO) is still managed as separate KubeBlocks Components.
{cluster}-milvus:19530milvus processCluster → Component (etcd) → InstanceSet → Pod × 1
→ Component (minio) → InstanceSet → Pod × 1
→ Component (milvus) → InstanceSet → Pod × 1
KubeBlocks provisions the components in order: etcd and minio first (in parallel), then milvus (which reads the etcd and minio endpoints on startup).
| Component | Container | Port | Purpose |
|---|---|---|---|
| milvus | milvus | 19530 (gRPC), 9091 (metrics/health) | All-in-one Milvus process — embeds RootCoord, QueryCoord, DataCoord, IndexCoord, QueryNode, DataNode, IndexNode, and Proxy |
| etcd | etcd | 2379 | Metadata storage — collection schemas, segment info, index descriptions |
| minio | minio | 9000 | Object storage — vector data, indexes, write-ahead logs |
Standalone is not highly available:
milvus pod is a single point of failureFor production workloads, use the Distributed topology.
| Service | Type | Port | Notes |
|---|---|---|---|
{cluster}-milvus | ClusterIP | 19530 (gRPC), 9091 (metrics/health) | Single entry point for all client traffic |
Milvus Distributed separates each functional role into its own independently scalable KubeBlocks Component. The Proxy is the single client entry point; internal components communicate through the MixCoord (unified coordinator) and share state via etcd (metadata), Pulsar or Kafka (log/message queue), and MinIO (object storage).
{cluster}-proxy:19530{cluster}-proxy:9091Cluster → Component (proxy) → InstanceSet → Pod × N
→ Component (mixcoord) → InstanceSet → Pod × 1
→ Component (datanode) → InstanceSet → Pod × N
→ Component (indexnode) → InstanceSet → Pod × N
→ Component (querynode) → InstanceSet → Pod × N
etcd, Pulsar/Kafka, and MinIO are not internal Components of the Distributed topology. They are external dependencies — either separately deployed KubeBlocks clusters or external services — declared via three serviceRefDeclarations: milvus-meta-storage (etcd), milvus-log-storage (Pulsar or Kafka), and milvus-object-storage (MinIO).
| Component | Role | Scalability |
|---|---|---|
| Proxy | Stateless access layer — authenticates clients, validates requests, routes to the appropriate worker | Horizontally scalable |
| MixCoord | Unified coordinator embedding RootCoord + QueryCoord + DataCoord + IndexCoord — manages DDL, segment lifecycle, query assignments, index scheduling | Single replica (stateless against etcd; recovers by reloading from etcd) |
| QueryNode | Loads sealed segments from MinIO into memory; executes ANN vector searches and scalar filtering | Horizontally scalable |
| DataNode | Receives insert/delete streaming operations; flushes growing segments to MinIO when sealed | Horizontally scalable |
| IndexNode | Builds HNSW, IVF, and other vector indexes for sealed segments stored in MinIO | Horizontally scalable |
Each role runs a container named after the role itself (plus a setup init container that copies run.sh, merge, and iam-verify into /milvus/tools/ before the main process starts):
| Container | Port | Purpose |
|---|---|---|
proxy | 19530 (gRPC), 9091 (metrics/health) | Proxy — client entry point; handles auth, routing, and result aggregation |
mixcoord | 9091 (metrics/health) | MixCoord — unified coordinator managing DDL, segment lifecycle, query assignments |
datanode | 9091 (metrics/health) | DataNode — receives inserts/deletes and flushes segments to MinIO |
indexnode | 9091 (metrics/health) | IndexNode — builds vector indexes for sealed segments |
querynode | 9091 (metrics/health) | QueryNode — loads segments from MinIO and executes vector searches |
Only the proxy container exposes port 19530 (gRPC) for client traffic. All components expose port 9091 for metrics and health checks — it is not a client-facing REST API endpoint.
| HA Mechanism | Description |
|---|---|
| Component-level replication | QueryNode, DataNode, and IndexNode can each run multiple replicas; KubeBlocks manages their lifecycle independently |
| etcd HA | When etcd is deployed as a 3-node Raft cluster, metadata is durable as long as 2 of 3 nodes are available |
| MinIO durability | When MinIO is configured with erasure coding, vector data survives drive or node failures |
| Segment redundancy | Sealed segments persist in MinIO; a restarted QueryNode reloads them from object storage without data loss |
| MixCoord recovery | MixCoord is stateless against etcd — it reloads all coordinator state from etcd on restart |
MixCoord is the only single-replica component in the Distributed topology. When it crashes, KubeBlocks automatically recovers it without data loss:
Worker nodes (QueryNode, DataNode, IndexNode) run multiple replicas and tolerate individual pod failures without coordinator involvement — KubeBlocks restarts the failed pod, and MixCoord reassigns its work to healthy replicas.
| Service | Type | Port | Selector |
|---|---|---|---|
{cluster}-proxy | ClusterIP | 19530 (gRPC), 9091 (metrics/health) | proxy pods |
Client applications (Milvus SDK) connect to the proxy on port 19530 (gRPC). Port 9091 is the metrics/health endpoint — it is not a client-facing REST API. The proxy is the single entry point — it handles authentication, routing, and result aggregation across worker components.
In the Milvus add-on, only the in-cluster MinIO object-storage Component (ComponentDefinition milvus-minio) declares KubeBlocks systemAccounts. Other Milvus stack components in this add-on (for example etcd, milvus, proxy, mixcoord, DataNode, QueryNode, IndexNode) do not define systemAccounts in their ComponentDefinitions. If you use an external object store instead of the bundled MinIO, this managed account does not apply to that store.
For the bundled MinIO component (typically named minio in componentSpecs, for example in standalone topology), KubeBlocks creates one account. Passwords are auto-generated unless overridden at the Cluster level. Credentials are stored in a Secret named {cluster}-minio-account-admin when the component name is minio (substitute your Cluster metadata.name and the MinIO component’s name).
| Account | Component (typical name) | Role | Purpose |
|---|---|---|---|
admin | minio | Object store admin | MinIO root credentials; injected into MinIO pods as MINIO_ACCESS_KEY and MINIO_SECRET_KEY for S3-compatible access to buckets used by Milvus |