Talos
Talos Linux is a minimal, immutable operating system designed specifically for running Kubernetes. It provides enhanced security through API-driven configuration with no shell access, automatic updates, and a reduced attack surface. This guide shows you how to use Talos with KSail for local development (Docker provider), cloud deployments (Hetzner Cloud provider), or managed clusters through Sidero Omni (Omni provider).
Talos is ideal for security-focused production workloads, GitOps workflows, and multi-cloud deployments requiring immutable infrastructure. Itâs not suitable for quick prototyping or scenarios requiring shell accessâuse Vanilla or K3s instead.
Quick Start
Section titled âQuick StartâLocal Development with Docker
Section titled âLocal Development with DockerâCreate a Talos cluster on your local machine using Docker containers as nodes.
Prerequisites
Section titled âPrerequisitesâDocker installed and running (see Docker Provider).
Step 1: Initialize Project
Section titled âStep 1: Initialize Projectâksail cluster init \ --name talos-dev \ --distribution Talos \ --provider Docker \ --control-planes 1 \ --workers 2Step 2: Create Cluster
Section titled âStep 2: Create Clusterâksail cluster createStep 3: Verify Cluster
Section titled âStep 3: Verify Clusterâksail cluster infokubectl get nodeskubectl get pods -AStep 4: Cleanup
Section titled âStep 4: Cleanupâksail cluster deleteProduction Deployment on Hetzner Cloud
Section titled âProduction Deployment on Hetzner CloudâCreate a production-ready Talos cluster on Hetzner Cloud infrastructure.
Prerequisites
Section titled âPrerequisitesâA Hetzner Cloud account and API token. See Hetzner Provider for full setup.
Step 1: Configure API Token
Section titled âStep 1: Configure API Tokenâexport HCLOUD_TOKEN=your-hetzner-api-tokenStep 2: Initialize Project
Section titled âStep 2: Initialize Projectâksail cluster init \ --name talos-prod \ --distribution Talos \ --provider Hetzner \ --control-planes 1 \ --workers 2Step 3: Create Cluster
Section titled âStep 3: Create Clusterâksail cluster createStep 4: Verify Cluster
Section titled âStep 4: Verify Clusterâksail cluster infokubectl get nodes -o widekubectl get pods -n kube-system | grep hcloud-csiStep 5: Cleanup
Section titled âStep 5: Cleanupâksail cluster deleteManaged Deployment via Sidero Omni
Section titled âManaged Deployment via Sidero OmniâCreate a Talos cluster managed through Sidero Omni, which handles machine lifecycle and cluster orchestration via a SaaS API.
Prerequisites
Section titled âPrerequisitesâA Sidero Omni account with service account key and registered machines. See Omni Provider for full setup.
Step 1: Configure Credentials
Section titled âStep 1: Configure Credentialsâexport OMNI_SERVICE_ACCOUNT_KEY=your-base64-encoded-service-account-keyStep 2: Initialize Project
Section titled âStep 2: Initialize Projectâksail cluster init \ --name talos-omni \ --distribution Talos \ --provider Omni \ --control-planes 1 \ --workers 2Step 3: Add the Omni Endpoint
Section titled âStep 3: Add the Omni EndpointâThe scaffolder does not generate the omni: block automatically. Open ksail.yaml and add spec.provider.omni.endpoint manually:
spec: provider: omni: endpoint: "https://<account>.omni.siderolabs.io:443"Step 4: Create Cluster
Section titled âStep 4: Create Clusterâksail cluster createStep 5: Cleanup
Section titled âStep 5: Cleanupâksail cluster deleteUse Cases
Section titled âUse CasesâTalos excels at immutable infrastructure, security-focused production deployments, and multi-environment consistencyâthe same distribution works from local Docker development through Hetzner Cloud production without âworks on my machineâ issues. See Use Cases for practical workflow examples.
Common Talos API operations:
talosctl -n <node-ip> get machineconfig # View configurationtalosctl -n <node-ip> version # Check Talos versiontalosctl -n <node-ip> logs # System logstalosctl -n <node-ip> upgrade --image ghcr.io/siderolabs/installer:v1.6.0Architecture
Section titled âArchitectureâTalos node architecture varies by provider. See the Docker Provider, Hetzner Provider, and Omni Provider pages for details.
Distribution Comparison
Section titled âDistribution ComparisonâSee the Support Matrix for a full breakdown of feature and component compatibility across all distributions.
Troubleshooting
Section titled âTroubleshootingâCluster Creation Fails
Section titled âCluster Creation FailsâCheck Docker status (docker ps, docker network ls), verify HCLOUD_TOKEN for Hetzner, or try cleaning up and retrying with ksail cluster delete && ksail cluster create.
Nodes Not Ready
Section titled âNodes Not ReadyâCheck CNI pods are running (kubectl get pods -n kube-system and look for your CNI pods, e.g. cilium- or calico-), verify Talos health (talosctl -n <node-ip> health), or reinstall CNI with ksail cluster update.
LoadBalancer Not Working (Docker)
Section titled âLoadBalancer Not Working (Docker)âVerify MetalLB is enabled in ksail.yaml (loadBalancer: Enabled), check MetalLB pods (kubectl get pods -n metallb-system), and verify IP pool exists (kubectl get ipaddresspools -n metallb-system). On macOS, Docker runs in a Linux VM so MetalLB virtual IPs are not routable from the hostâuse extraPortMappings instead (see Port Mappings (Docker Provider)).
Cannot Access Talos API
Section titled âCannot Access Talos APIâCheck ~/.talos/config exists, verify node IPs with kubectl get nodes -o wide, and use explicit node IP with talosctl -n <node-ip> --talosconfig ~/.talos/config get members.
Advanced Topics
Section titled âAdvanced TopicsâCustom Node Counts
Section titled âCustom Node CountsâAdjust control plane and worker nodes in your existing ksail.yaml (requires distribution: Talos):
# Partial snippet â add to your existing ksail.yamlspec: cluster: distribution: Talos talos: controlPlanes: 3 # HA setup workers: 5Port Mappings (Docker Provider)
Section titled âPort Mappings (Docker Provider)âOn macOS, Docker runs in a Linux VM, so MetalLB virtual IPs are not directly accessible from the host. For Talos clusters using the Docker provider only, use extraPortMappings in ksail.yaml to expose container ports on the host (Hetzner and Omni Talos clusters do not use Docker port mappings):
# Partial snippet â add to your existing ksail.yamlspec: cluster: distribution: Talos talos: extraPortMappings: - containerPort: 80 hostPort: 8080 protocol: TCP - containerPort: 443 hostPort: 8443 protocol: TCPAccess services at http://localhost:<hostPort> (for the example above, http://localhost:8080). Ports are applied to the first control-plane node onlyâin multi-control-plane clusters, additional control-plane nodes do not receive port mappings to avoid Docker host port collisions. See the Declarative Configuration reference for the full field specification.
Persistent Storage (Hetzner)
Section titled âPersistent Storage (Hetzner)âFor cloud volumes, use the hcloud-volumes storage class installed automatically by the Hetzner Provider.
Talos Upgrades
Section titled âTalos UpgradesâUpgrade without cluster recreation: talosctl -n <node-ip> upgrade --image ghcr.io/siderolabs/installer:v1.6.0. See Talos upgrade docs for coordination details.
Image Verification (Talos 1.13+)
Section titled âImage Verification (Talos 1.13+)âTalos 1.13 introduced ImageVerificationConfig, which enforces machine-wide container image signature verification before any image is pulled. KSail can scaffold a starter configuration:
ksail cluster init \ --distribution Talos \ --image-verification EnabledThis generates talos/cluster/image-verification.yaml with a default skip-all rule and commented examples. The file is a valid Talos config document that KSail applies alongside your MachineConfig during cluster creation.
# Talos ImageVerificationConfig (Talos 1.13+)# This document enables machine-wide container image signature verification.# Rules are evaluated in order; the first matching rule applies.# See: https://www.talos.dev/v1.13/talos-guides/configuration/image-verification/apiVersion: v1alpha1kind: ImageVerificationConfigrules: # Default: skip verification for all images. # Remove or modify this rule and add specific verification rules below. - image: "*" skip: true # Example: Verify registry.k8s.io images using keyless (Cosign/OIDC) verification # - image: "registry.k8s.io/*" # keyless: # issuer: "https://accounts.google.com" # subject: "krel-trust@k8s-releng-prod.iam.gserviceaccount.com" # Example: Verify images from a private registry using a public key # - image: "my-registry.example.com/*" # publicKey: # certificate: | # -----BEGIN CERTIFICATE----- # <your PEM-encoded certificate here> # -----END CERTIFICATE----- # Example: Deny all images from an untrusted registry # - image: "untrusted-registry.example.com/*" # deny: trueEdit the file to enforce your signature policy, then run ksail cluster create. Rules are evaluated in order; the first matching rule applies.
See the Talos image verification docs for the full rule schema.
GitOps Integration
Section titled âGitOps IntegrationâEnable Flux or ArgoCD for declarative workload managementâsee GitOps Workflows.