Basic Provisioner Configuration
You can set a provisioner configuration to add one or more compute nodes running Substrate to your cluster. The configuration process varies depending on your deployment type.
The most basic provisioner configuration simply matches nodes based on hostnames. To add a single node, obtain the hostname of the node that you want to add and run the following commands on your server node:
# COMPUTE_HOSTNAME="" # populate with the hostname for your compute node.# cat >provisioner.yaml<<EOF
definitions:
- id: compute1
provisioner: static
provisionerSpec:
condition: |-
hostname() matches "${COMPUTE_HOSTNAME}"
EOF
# fuzzball cluster config set provisioner.yamlThe hostname() matches field supports pattern matching, so you can add more than one node with patterns that match the hostnames.
Once you’ve run the set command, you can restart Substrate on the compute node like so:
# systemctl restart fuzzball-substrate.serviceThis is a bare-bones configuration suitable for testing. For complete instructions see the Provisioner Configuration Guide
The AWS deployment method includes a shortcut allowing you to quickly and easily configure AWS EC2 compute node instance types (launched from the AMIs used by the deployment). During deployment, the CloudFormation template specifies 2 default node types for smaller and larger jobs. After deployment, you can run the following command to create the appropriate provisioner configuration to take advantage of these nodes:
$ fuzzball node provisioner setupIn the default scenario where t3a.2xlarge and p3.2xlarge nodes are specified in the CloudFormation template during deployment, this command produces and applies the following provisioner configuration.
definitions:
- id: t3a.2xlarge
provisioner: aws
provisionerSpec:
instanceType: t3a.2xlarge
- id: p3.2xlarge
provisioner: aws
provisionerSpec:
instanceType: p3.2xlarge
You can also copy this text into a file (or a modified version as applicable) and apply it with the following command:
$ fuzzball cluster config set aws-provisioner.yamlThe GCP deployment method includes a shortcut allowing you to quickly and easily configure some
basic GCP compute node instance types if you used --instance-types during deployment. After
deployment, you can run the following command to create the appropriate provisioner configuration
to take advantage of these nodes:
$ fuzzball node provisioner setupFor each machine type you specified with --instance-types, the setup command automatically
creates node provisioners. This may include variations of smaller and larger instance
types in the same family. For example, if you specified --instance-types=n2-standard-8,g2-standard-8
during deployment, the command may create the following node provisioners:
$ fuzzball cluster config getdefinitions:
- id: n2-standard-4
provisioner: gcp
provisionerSpec:
machineType: n2-standard-4
- id: n2-standard-8
provisioner: gcp
provisionerSpec:
machineType: n2-standard-8
- id: n2-standard-16
provisioner: gcp
provisionerSpec:
machineType: n2-standard-16
- id: g2-standard-4
provisioner: gcp
provisionerSpec:
machineType: g2-standard-4
- id: g2-standard-8
provisioner: gcp
provisionerSpec:
machineType: g2-standard-8
- id: g2-standard-16
provisioner: gcp
provisionerSpec:
machineType: g2-standard-16
You can save the configuration above and edit it to apply custom settings such as adding new instance types or applying policies. You can then apply this configuration with the following command:
$ fuzzball cluster config set custom-gcp.yamlSupport for CoreWeave within Fuzzball is in preview status and is currently subject to more rapid change to address customer requirements than other features of Fuzzball. If you are interested in using Fuzzball on CoreWeave, we recommend contacting CIQ as part of your deployment planning process.
CoreWeave supports dynamic and static provisioning:
- Dynamic Provisioning: Fuzzball creates and destroys nodes on-demand based on workflow requirements.
- Static Provisioning: Use pre-existing CoreWeave
NodePoolresources after installing thecoreweave-substrate-staticHelm chart (see Static Provisioning Guide)
Dynamic provisioning is the default approach where Fuzzball automatically manages the CoreWeave NodePool lifecycle.
Create node provisioners specifying which CoreWeave instance types your cluster can use, and that you want to make available to workflows:
# coreweave-provisioner-definitions.yaml
definitions:
- id: cpu-gp-genoa
provisioner: coreweave
provisionerSpec:
instanceType: "cd-gp-a192-genoa"
costPerHour: 7.78
- id: gpu-h100
provisioner: coreweave
provisionerSpec:
instanceType: "gd-8xh100ib-i128"
costPerHour: 49.24
Apply the configuration:
$ fuzzball cluster config set coreweave-provisioner-definitions.yamlBefore workflows can use a CoreWeave instance type, you must provision at least one instance of that
type to initialize and discover its available node resources.
fuzzball node provision takes the name of the node provisioner to instantiate:
$ fuzzball node provision cpu-gp-genoa
$ fuzzball node provision gpu-h100Monitor node provisioning:
$ fuzzball node listFor static provisioning with pre-existing NodePool resources, you define provisioner resources
with provisioner: static and deploy Substrate using the coreweave-substrate-static Helm chart.
Create node provisioners for your existing CoreWeave NodePools:
# static-provisioner-definitions.yaml
definitions:
- id: coreweave-cpu-small
provisioner: static
provisionerSpec:
condition: "true"
costPerHour: 7.78
- id: coreweave-gpu-large
provisioner: static
provisionerSpec:
condition: "true"
costPerHour: 49.24
The
conditionandnodeSelectorfields work together for CoreWeave static provisioning:
nodeSelector(in Helm values below): Controls which Kubernetes nodes receive substrate pods via DaemonSetcondition(in the node provisioner definition): Controls which substrate pods register with this node provisionerSetting
condition: "true"on a definition allows all Substrate pods deployed by the DaemonSet to register with that definition. You can use more specific conditions (e.g.,hostname() matches "gpu-.*") to further filter which Substrate pods use this definition beyond the DaemonSet’s node selection.
Apply the definitions:
$ fuzzball cluster config set static-provisioner-definitions.yamlCreate a values file mapping your targets to node pools:
# static-provisioner-values.yaml
namespace: fuzzball
# Must match your Fuzzball version
imageTag: "v4.0.0"
# Image pull secret name
imagePullSecretName: "registry-image-credentials"
# Automatically patch CoreWeave NodePools with substrate taint
autopatchNodePools: true
# Define targets - one DaemonSet per target
targets:
- name: fuzzball-cpu
definitionId: "coreweave-cpu-small"
nodeSelector:
compute.coreweave.com/node-pool: "fuzzball-cpu-node-pool"
- name: fuzzball-gpu
definitionId: "coreweave-gpu-large"
nodeSelector:
compute.coreweave.com/node-pool: "fuzzball-gpu-node-pool"
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
Install the coreweave-substrate-static Helm chart to deploy substrate as DaemonSets on your NodePools:
$ helm upgrade --install fuzzball-substrate-static \
oci://depot.ciq.com/fuzzball/fuzzball-images/helm/coreweave-substrate-static \
--namespace fuzzball \
--version v4.0.0 \
--values static-provisioner-values.yamlNode provisioners can be created at different permission scopes:
- Cluster-level: Accessible cluster-wide (requires cluster administrator privileges)
- Organization-level: Accessible to all groups within an organization (requires organization owner role)
- Group-level: Accessible only to members of a specific group (requires group owner role)
By default, node provisioners created with fuzzball cluster config set are created at the cluster-wide level. To create organization or group-scoped node provisioners, use the --organization or --group flags as shown below.
Organization owners can create node provisioners that are available to all groups within their organization:
$ fuzzball cluster config set --organization myorg provisioner.yamlGroup owners can create node provisioners that are available only to their group members:
$ fuzzball cluster config set --group mygroup provisioner.yamlThis scoped permission model enables:
- Delegation: Organization and group owners can manage their own compute resources without requiring cluster-wide administrator access
- Isolation: Groups can have dedicated node provisioners tailored to their specific workflow requirements
- Cost control: Organizations can restrict which instance types or node provisioner backends are available to different teams
Users can only create and manage node provisioners within scopes where they have owner-level permissions. Organization owners have permissions across all groups within their organization, while group owners are limited to their specific group.
You can verify that nodes have been properly added to your cluster by running the node list subcommand:
# fuzzball node list
NODE ID | HOSTNAME | CPU TYPE | TOTAL CORES | TOTAL MEMORY (GB) | TOTAL DEVICES | RUNNING JOBS
10.1.96.4/7331 | compute1 | cpu/x86/avx | 2 | 8 | 0 | 0Now that your Fuzzball cluster can provision compute nodes, you are ready to configure storage.
Node provisioners include a backendKind field that captures the
node provisioner backend
taxonomy. This field identifies the backend, such as:
"aws"— AWS-based node provisioners"static"— Static node provisioners- Other backends as supported by your deployment
The backendKind field is automatically populated when node provisioners are configured. For legacy node provisioners created before this field was introduced, the value may be empty.
This field is informational and helps identify the backend when managing multiple node provisioners through the API or Admin UI. It does not affect the node provisioner’s runtime behavior.