The Operator is one of the two execution backends. It runs as a single-replicaDocumentation Index
Fetch the complete documentation index at: https://docs.novacula.io/llms.txt
Use this file to discover all available pages before exploring further.
Deployment inside your Kubernetes cluster, watches a custom resource called BlockchainNode, and renders each one into a ConfigMap (the node’s config files) plus a StatefulSet (the node’s pod template + persistent volume claims).
For the bare-metal Agent, see Agent (bare-metal).
When to use
- You already operate a Kubernetes cluster (especially with a fast CSI provider — local NVMe, AWS gp3, GCP pd-ssd).
- You want pod-level isolation between unrelated nodes.
- You want native PVC handling for storage and standard
kubectlintrospection. - Your platform team prefers Helm-based installs over per-host daemons.
Requirements
- Kubernetes — 1.27 or newer.
- CRD permissions — the operator auto-applies its CRD on startup, so the install user needs
customresourcedefinitionswrite at least once. Subsequent upgrades only need namespace-scoped permissions. - A namespace — defaults to
novacula-system. Override viaNOVACULA_OPERATOR_NAMESPACE. - A storage class with
WaitForFirstConsumerbinding for the node PVCs; the operator probes available classes on startup and reports them in executor capabilities. - Outbound HTTPS from the operator pod to the control plane URL.
What the operator deploys
When the control plane assigns a node spec to this executor:- The operator creates / updates a
BlockchainNodecustom resource (CRDvalidatoros.com/v1alpha1, kindBlockchainNode, scopeNamespaced, short namebn). - Its own controller loop converts the CR’s
specinto:- A
ConfigMapcarrying the rendered config files for each process. - A
StatefulSetwith one pod per node, containing one container per role (e.g.el+clfor Ethereum), plus any sidecar or init containers the chain adapter requires. PersistentVolumeClaimtemplates from the spec’sstorageblock, claimed against the configuredStorageClass.- A headless
Servicefor stable pod-DNS and per-node port routing.
- A
- Kubernetes does the rest — schedule, mount volumes, pull images, run init containers, start the main containers.
status collector polls each pod’s metrics endpoint, builds an ObservedNodeState, and writes it back through syncExecutor. The CR’s .status.phase (Pending → Configuring → Running → Syncing → Stopped / Error) tracks the same lifecycle.
Two reconcile layers
The operator is two cooperating loops:- Outer loop — same as every executor: poll the control plane, write/update the
BlockchainNodeCR per assigned node spec. - Inner loop — Kubernetes-style controller that watches
BlockchainNodeCRs and converges the cluster state to match. This is what lets you (or another tool) introspectkubectl get bn -Aand trace exactly what the operator is doing.
Self-update
When the control plane sets apendingUpgrade on this executor’s row, the operator:
- Probes the target image’s registry to confirm the tag exists and is pullable.
- Patches its own
Deploymentto the new image. - Watches the rollout. If it sees
ImagePullBackOfforCrashLoopBackOffon the new replicaset within the monitor window, it patches the image back to the prior tag (logged viafailure-classify.tsso the operator can tell why it rolled back). - The new pod reports its version on the next
syncExecutor; the control plane clearspendingUpgrade.
Bring-up flow
- Issue an
operator-kind API key from the UI: see Connect an executor. helm installthe chart, passingcontrolPlaneUrland the API key (typically as aSecret).- The operator pod starts, applies the CRD, calls
syncExecutor, declares its capabilities. - The executor row in the UI flips to
onlinewithin seconds.
Inspect with kubectl
Useful commands once you’re running:See also
- Provision an executor on Kubernetes — Helm install walkthrough.
- Environment variables — operator-side env vars.
- Apply executor upgrades — manual recovery if a self-update wedges.