SpicepodCluster
SpicepodCluster CRD reference for deploying distributed query clusters.
A SpicepodCluster (spice.ai/v2) deploys a distributed query cluster with dedicated scheduler and executor nodes. The operator automatically manages mTLS certificate provisioning, child SpicepodSet resources, and cluster topology.
Architecture
┌─────────────────────┐
│ Load Balancer │
└─────────────────────┘
│
┌──────────────────┼──────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│Scheduler │ │Scheduler │ │Scheduler │◄──► Object Store (S3)
└──────────┘ └──────────┘ └──────────┘
▲ ▲ ▲
│ (executor-initiated connections) │
│ │ │
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Executor │ │ Executor │ │ Executor │────► Object Store (shuffle)
└──────────┘ └──────────┘ └──────────┘Schedulers coordinate query planning and partition assignment; executors perform the compute work. Executors initiate connections to all schedulers and are shared across them — partition ownership is committed to a shared object store and pushed to executors via the cluster ControlStream. See Distributed Query for the full execution model.
Example
Executors pull their Spicepod configuration from the scheduler, so no spicepod field is needed on executorSpec.
Multi-Replica Schedulers
For high availability, deploy multiple schedulers:
Each scheduler independently accepts and distributes work. Shared state is maintained in an S3-compatible object store.
Automatic mTLS
The operator automatically:
Generates a self-signed root CA certificate.
Issues per-node leaf certificates with appropriate SANs.
Configures mTLS between all cluster nodes.
Stores certificates in Kubernetes Secrets.
Tracks certificate expiry via Prometheus metrics.
Development Mode
For development and testing, mTLS can be disabled:
Never use allowInsecureConnections: true in production. All inter-node communication will be unencrypted.
Port Separation
50051
Public
Arrow Flight, OpenTelemetry
Optional
8090
Public
HTTP API
Optional
9090
Public
Prometheus metrics
No
50052
Internal
Scheduler gRPC, Cluster Service
Required
The internal port (50052) carries cluster coordination traffic. See Distributed Query → Internal gRPC for the full RPC surface, including:
GetAppDefinition— Executors fetch the full Spicepod definition (datasets, catalogs, views, UDFs) from the scheduler.ExpandSecret— Executors request secret values from the scheduler's secret store.GetSchedulers/AllocateInitialPartitions— Executors fetch scheduler membership and their assigned partitions at startup.ControlStream— Bidirectional channel carrying executor heartbeats andUpdatePartitions/RefreshDataset/CancelTaskscommands.GetTaskHistory/GetMetrics— Federatedruntime.task_historyand on-demand metrics fan-out across the cluster.
Verification
Configuration Inheritance
SpicepodCluster creates child SpicepodSet resources for schedulers and executors. Both schedulerSpec and executorSpec accept the common SpicepodSet spec fields: image, http, flight, metrics, replicas, resources, env, envFromSource, network, nodeAffinity, tolerations, volumeClaimTemplates, volumeMounts, serviceAccount, annotations, labels, updateStrategy, terminationGracePeriodSeconds, and a per-node cluster override.
Notable differences from a standalone SpicepodSet:
executorSpecdoes not acceptspicepodorprobes— executors fetch the Spicepod definition from the scheduler at startup viaGetAppDefinitionand run without the HTTP server that probes target.The
servicetoggle is not available on cluster node specs; the operator manages the headless Services required for mTLS and scheduler/executor discovery.
Per-node cluster overrides
The cluster field on schedulerSpec / executorSpec is a small subset (NodeClusterConfig) used to override cluster-internal addresses; the operator otherwise auto-populates cluster identity, role, mTLS, and scheduler discovery:
Status
rootCertificateReady
Whether the cluster's root CA has been generated.
rootCertificateSecretName
Secret holding the root CA certificate and private key.
rootCertificateExpiresAt
RFC 3339 expiration of the root CA.
schedulerSpicepodsetName
Name of the child scheduler SpicepodSet.
executorSpicepodsetName
Name of the child executor SpicepodSet.
schedulerReadyReplicas
Ready scheduler replicas.
executorReadyReplicas
Ready executor replicas.
conditions
Standard Kubernetes Conditions (Ready, Paused); supersede the legacy error field.
Last updated
Was this helpful?