Omni Provider
The Omni provider manages Talos Linux clusters through the Sidero Omni SaaS platform. Omni handles machine lifecycle, cluster orchestration, and configuration distribution â KSail connects to the Omni API to create, manage, and tear down clusters using machines youâve already registered in Omni.
When to Use the Omni Provider
Section titled âWhen to Use the Omni ProviderâThe Omni provider is ideal when you:
- Manage bare-metal or cloud machines through a centralized SaaS platform
- Want Omni to handle machine registration, health monitoring, and Talos upgrades
- Need enterprise-grade cluster orchestration without managing infrastructure directly
- Run Talos across heterogeneous hardware (bare-metal servers, VMs, edge devices)
Prerequisites
Section titled âPrerequisitesâ- Sidero Omni account â Sign up at siderolabs.com
- Registered machines â At least one machine must be registered in your Omni instance and available for allocation (see Omni docs: Register a Machine). Machines can be allocated dynamically via a machine class, statically by UUID list, or auto-discovered from the available pool when neither is configured.
- Service account key â Create one in the Omni web UI under Settings â Service Accounts; the key is a base64-encoded string
- Omni API endpoint â Your account-specific URL, typically
https://<account>.omni.siderolabs.io:443 - Docker â Required locally for
ksailCLI operations
Configuration
Section titled âConfigurationâEnvironment Variable
Section titled âEnvironment VariableâExport the service account key so KSail can authenticate with the Omni API:
export OMNI_SERVICE_ACCOUNT_KEY=your-base64-encoded-service-account-keyBy default, KSail reads from OMNI_SERVICE_ACCOUNT_KEY. To use a different environment variable name, set spec.provider.omni.serviceAccountKeyEnvVar in ksail.yaml.
ksail.yaml Reference
Section titled âksail.yaml ReferenceâThe Omni provider is configured through spec.provider.omni in ksail.yaml:
apiVersion: ksail.io/v1alpha1kind: Clustermetadata: name: my-omni-clusterspec: cluster: distribution: Talos provider: Omni talos: controlPlanes: 1 workers: 2 provider: omni: # Required: your Omni API endpoint endpoint: "https://<account>.omni.siderolabs.io:443" # Optional: pin the Talos version to deploy. # If omitted, KSail resolves the latest available version from Omni. talosVersion: "v1.9.5" # Optional: pin the Kubernetes version to deploy. # If omitted, KSail resolves a compatible version from Omni or Talos config defaults. kubernetesVersion: "v1.32.3" # Machine allocation strategy â choose one (or omit both to auto-discover): # Dynamic: allocate machines from a named machine class machineClass: "my-machine-class" # Static: allocate specific machines by UUID # machines: # - "uuid-of-machine-1" # - "uuid-of-machine-2" # Auto-discover: omit both machineClass and machines to let KSail # query Omni for available (unallocated) machines at cluster creation time. # Optional: override default env var names # serviceAccountKeyEnvVar: "MY_CUSTOM_OMNI_KEY" # endpointEnvVar: "MY_CUSTOM_OMNI_ENDPOINT"| Field | Type | Default | Description |
|---|---|---|---|
omni.endpoint | string | â | Omni API endpoint URL. Overridden by the env var in endpointEnvVar. |
omni.endpointEnvVar | string | OMNI_ENDPOINT | Environment variable containing the Omni API endpoint URL. Takes precedence over endpoint. |
omni.serviceAccountKeyEnvVar | string | OMNI_SERVICE_ACCOUNT_KEY | Environment variable containing the service account key |
omni.talosVersion | string | Omni latest | Talos Linux version to deploy (e.g., v1.9.5 or 1.9.5). If omitted, KSail resolves the latest available version from Omni. The v prefix is added automatically if omitted. |
omni.kubernetesVersion | string | Auto-resolved | Kubernetes version to deploy (e.g., v1.32.3 or 1.32.3). If omitted, KSail resolves a compatible version from Omni or Talos config defaults. The v prefix is added automatically if omitted. |
omni.machineClass | string | â | Omni machine class name for dynamic node allocation. The class must exist in your Omni account. Mutually exclusive with machines. |
omni.machines | list of strings | â | List of Omni machine UUIDs for static allocation. The first N are assigned as control planes. Mutually exclusive with machineClass. |
When neither machineClass nor machines is set, KSail automatically queries Omni for available (unallocated) machines and assigns the required number at cluster creation time. Setting both fields at once returns an error.
Quick Start
Section titled âQuick StartâStep 1: Configure Credentials
Section titled âStep 1: Configure CredentialsâSet OMNI_SERVICE_ACCOUNT_KEY as described in the Configuration section above, then verify it is exported in your shell.
Step 2: Initialize Project
Section titled âStep 2: Initialize Projectâksail cluster init \ --name my-omni-cluster \ --distribution Talos \ --provider Omni \ --control-planes 1 \ --workers 2This creates ksail.yaml and a talos/ directory for Talos configuration patches.
Step 3: Configure Omni Options
Section titled âStep 3: Configure Omni OptionsâThe scaffolder does not generate the omni: block automatically. Open ksail.yaml and add the Omni endpoint and machine allocation. You may also pin talosVersion and kubernetesVersion explicitly; if omitted, KSail resolves them from Omni automatically:
spec: provider: omni: endpoint: "https://<account>.omni.siderolabs.io:443" # Optional: pin versions (auto-resolved from Omni if omitted) # talosVersion: "v1.9.5" # kubernetesVersion: "v1.32.3" # Choose a machine allocation strategy (or omit both to auto-discover): machineClass: "my-machine-class" # machines: # - "uuid-of-machine-1" # - "uuid-of-machine-2"If you omit both machineClass and machines, KSail queries Omni for available (unallocated) machines at cluster creation time and assigns the required count automatically.
Step 4: Create Cluster
Section titled âStep 4: Create Clusterâksail cluster createStep 5: Cleanup
Section titled âStep 5: Cleanupâ# Delete the cluster (deallocates machines in Omni, does not wipe them)ksail cluster deleteArchitecture
Section titled âArchitectureâKSail communicates with the Omni SaaS API to manage cluster resources. Omni owns the machine lifecycle â KSail never connects to nodes directly for provisioning.
graph TB
subgraph "Your Machine"
KSAIL["ksail CLI"]
end
subgraph "Sidero Omni SaaS"
API["Omni API"]
ORCH["Cluster Orchestrator"]
REG["Machine Registry"]
end
subgraph "Registered Machines"
CP["Control Plane Node"]
W1["Worker Node 1"]
W2["Worker Node 2"]
end
KSAIL -->|"service account key"| API
API --> ORCH
ORCH -->|"allocate & configure"| REG
REG -->|"Talos config patches"| CP
REG -->|"Talos config patches"| W1
REG -->|"Talos config patches"| W2
CP -.->|"kubeconfig"| KSAIL
KSail authenticates via a service account key â no direct SSH or Talos API access needed. Omni allocates registered machines to the cluster and applies Talos configuration. ksail cluster delete deallocates machines without destroying them â they return to the available pool.
Operations
Section titled âOperationsâList Clusters
Section titled âList Clustersâksail cluster listLists all clusters visible to your Omni account, including clusters created outside KSail, when both OMNI_SERVICE_ACCOUNT_KEY and OMNI_ENDPOINT are set in your environment. The list command does not read spec.provider.omni.endpoint from ksail.yaml, so OMNI_ENDPOINT must be configured explicitly for listing.
Cluster Info
Section titled âCluster Infoâksail cluster infoDisplays Kubernetes control-plane and core service endpoints for the current context (thin wrapper around kubectl cluster-info). For Omni-specific machine stages and node roles, use the Omni web UI or Omni CLI.
Update Cluster
Section titled âUpdate Clusterâksail cluster updateApplies in-place changes to components (CNI, GitOps engine, cert-manager, etc.) and node counts. KSail scales Omni clusters declaratively: it rebuilds the cluster template with updated control-plane and worker counts and syncs it to the Omni API, which handles machine allocation and deallocation. All three allocation strategies are supported â machine class, static UUIDs, and auto-discovery. See the Update Behavior table for details.
Backup & Restore
Section titled âBackup & Restoreâksail cluster backup --output ./backup.tar.gzksail cluster restore --input ./backup.tar.gzKSail detects the Omni provider automatically from the server URL (*.omni.siderolabs.io) and embeds the correct distribution and provider metadata in the backup archive. This works even when the current context name (for example, devantler-service-account@omni) doesnât follow KSailâs default naming conventions. See Backup & Restore for full details.
Kubeconfig Tokens
Section titled âKubeconfig TokensâKSail manages your Omni kubeconfig automatically:
- Initial fetch â If no kubeconfig exists (e.g., a fresh CI runner), KSail fetches it from Omni before running any command. The parent directory (
~/.kube/) is created if needed. - Token refresh â Tokens have a 30-day TTL and are renewed transparently before any CLI command runs (when the token has 5 minutes or less remaining).
No manual action is required in either case.
Troubleshooting
Section titled âTroubleshootingâfailed to determine Talos version â KSail could not auto-resolve the Talos version from Omni (for example the Omni API was unreachable or returned no versions). Set talosVersion and kubernetesVersion explicitly to bypass version discovery:
spec: provider: omni: talosVersion: "v1.9.5" kubernetesVersion: "v1.32.3"TalosVersion is required or KubernetesVersion is required â Version resolution produced an empty value. This typically means the Omni query returned no results and no fallback was available. Set both fields explicitly as shown above.
omni service account key is not set â The env var is missing or empty. Run echo $OMNI_SERVICE_ACCOUNT_KEY to check. Re-export if needed. If you use a custom variable name, verify it matches spec.provider.omni.serviceAccountKeyEnvVar in ksail.yaml.
omni endpoint is required â spec.provider.omni.endpoint is missing from ksail.yaml and the OMNI_ENDPOINT env var is not set. Add it:
spec: provider: omni: endpoint: "https://<account>.omni.siderolabs.io:443"Cluster creation hangs or reports no nodes â No machines are registered and available in your Omni instance. Log in to the Omni web UI, navigate to Machines, and verify machines are registered and not already allocated. See Omni docs: Register a Machine.
cloud provider requires an external registry â Omni-managed nodes cannot reach Docker-based local registries running on your machine. When spec.cluster.localRegistry is enabled, it must point to an internet-accessible registry (e.g., ghcr.io/myorg). KSail returns this error early if a non-external registry is configured.
context deadline exceeded or connection errors â Verify the endpoint URL is correct and includes the port (:443). Check connectivity with curl -I https://<account>.omni.siderolabs.io:443 and ensure no firewall blocks outbound HTTPS.
not enough available machines in Omni for the requested node count â Auto-discovery found fewer available (unallocated) machines than the cluster requires. Log in to the Omni web UI, navigate to Machines, and verify enough machines are registered and not already allocated to another cluster. Alternatively, set machineClass or machines explicitly to control allocation.
MachineClass and Machines are mutually exclusive (set one or the other) â Both spec.provider.omni.machineClass and spec.provider.omni.machines are set in ksail.yaml. Remove one: use machineClass for dynamic allocation, machines for static allocation, or omit both for auto-discovery.