Tinkerbell: Bare-Metal Provisioning

Khimananda Oli 7 min read Virtualization
Tinkerbell: Bare-Metal Provisioning

By Khimananda Oli | Last reviewed: August 2026

Managing physical servers often feels like a step backward into manual configuration hell, especially when your team is accustomed to the elasticity of cloud VMs. Tinkerbell: Bare-Metal Provisioning solves this friction by treating physical hardware exactly like cloud infrastructure, using containerized actions and declarative workflows to automate installation from power-on to production-ready. Instead of maintaining fragile PXE configurations and kickstart files, you define provisioning logic in Docker containers that execute sequentially on the target machine.

If you are managing hybrid environments or on-prem data centers in Nepal where cloud latency or data residency is a concern, mastering this tool is essential. For teams already practicing Infrastructure as Code, integrating Tinkerbell aligns physical provisioning with the same rigorous standards applied to Terraform-managed cloud resources. The mental model shifts from "installing an OS" to "executing a pipeline," making bare metal a first-class citizen in your DevOps ecosystem.

Provisioner NodeTink Server / CLIDHCP / TFTP / HTTPOCI Registry (Hooks)Worker Node APXE Boot → Hook OSStream ActionsInstall Ubuntu 24.04Worker Node BPXE Boot → Hook OSStream ActionsInstall Rocky Linux 9External ServicesGit Repo (Templates)Vault / Secrets MgrMonitoring Stack
High-level Tinkerbell bare-metal provisioning architecture: the provisioner serves hooks via PXE while workers stream containerized actions from the OCI registry.

How does Tinkerbell bare-metal provisioning actually work?

At its core, Tinkerbell decouples the operating system installation from the boot mechanism. Traditional PXE setups rely on static kickstart or preseed files hosted on an HTTP server, which become unmanageable at scale. Tinkerbell introduces the concept of "Hooks" — lightweight, container-based actions that run in memory on the target hardware before any OS is installed.

The Hook OS and Action Containers

When a machine boots via PXE, it loads the Hook OS, a minimal Linux environment designed solely to execute containers. This environment pulls action images from a local OCI registry. Each action (e.g., write-rootfs, install-grub, configure-network) runs as an isolated container with access to the host's block devices and network interfaces. This means your provisioning logic is portable, versioned, and testable locally before touching production hardware.

The workflow engine orchestrates these actions based on a template mapped to the specific hardware MAC address. Unlike cloud-init which runs post-boot, Tinkerbell actions have raw access to the disk during the installation phase, allowing for complex partitioning, RAID setup, and encrypted volume creation that would be impossible with standard user-space tools. For teams familiar with Docker fundamentals, this pattern feels natural: you are essentially building a CI/CD pipeline that targets bare metal instead of a Kubernetes cluster.

How do you configure Tinkerbell workflows for custom OS installs?

A Tinkerbell workflow is defined as a YAML template containing a sequence of actions. In 2026, the ecosystem has matured significantly, providing reliable base images for Ubuntu 24.04, Rocky Linux 9, Debian 12, and Windows Server 2025. However, real-world deployments rarely use stock templates; you will need to customize them for security hardening, compliance, or application-specific requirements.

Defining a Custom Template

Below is a practical example of a workflow template for deploying a hardened Ubuntu server. Note how each action specifies an image, environment variables, and device mappings. This declarative approach allows you to store provisioning logic in Git alongside your application code.

version: "0.1"
name: ubuntu-2404-hardened
global_timeout: 1800
tasks:
  - name: "os-installation"
    worker_addr: "{{.device.mac}}"
    volumes:
      - /dev:/dev
      - /dev/console:/dev/console
      - /lib/firmware:/lib/firmware:ro
    actions:
      - name: "stream-image"
        image: quay.io/tinkerbell-actions/write-rootfs:v0.8.0
        timeout: 600
        environment:
          IMG_URL: http://provisioner.local/images/ubuntu-2404-hardened.raw.gz
          DEST_DISK: /dev/sda
          COMPRESSED: true
      - name: "configure-network"
        image: quay.io/tinkerbell-actions/configure-netplan:v0.2.0
        timeout: 90
        environment:
          NETPLAN_CONFIG: |
            network:
              version: 2
              ethernets:
                eno1:
                  dhcp4: false
                  addresses: [{{.device.ip}}/24]
                  gateway4: {{.device.gateway}}
                  nameservers:
                    addresses: [1.1.1.1, 8.8.8.8]
      - name: "install-grub"
        image: quay.io/tinkerbell-actions/grub-install:v0.3.0
        timeout: 90
        environment:
          DEST_DISK: /dev/sda
          EFI_PARTITION: /dev/sda1
      - name: "post-install-security"
        image: registry.internal/hardening-action:v1.2.0
        timeout: 300
        environment:
          ENABLE_FIPS: "true"
          SSH_KEYS: "{{.device.ssh_keys}}"
          AUDIT_PROFILE: "soc2-type2"

This template demonstrates three critical patterns: variable substitution using device metadata, inline configuration for network setup, and custom internal actions for compliance. The post-install-security action references a private registry image, highlighting how you can encapsulate organizational standards into reusable components. If you are implementing DevSecOps practices, this is where policy-as-code meets bare metal.

1. Stream ImageWrite rootfsto /dev/sdaTimeout: 600s2. NetplanConfigure IP& DNSTimeout: 90s3. GRUBInstall BootloaderEFI SetupTimeout: 90s4. HardeningFIPS + AuditSSH Keys InjectTimeout: 300sWorkflow Execution Sequence (In-Memory Hook OS)Each action runs as an isolated container with /dev mounted
Tinkerbell workflow execution sequence: actions run serially in the Hook OS environment with explicit timeouts and device access.

What are the prerequisites for deploying Tinkerbell in production?

Deploying Tinkerbell requires careful network planning, as it takes authoritative control over DHCP and TFTP services on the provisioning VLAN. Running this on a shared corporate network without isolation will cause IP conflicts and disrupt existing services. In my experience helping Nepali enterprises modernize their on-prem infrastructure, the most common failure point is inadequate network segmentation.

  • Dedicated Provisioning VLAN: Isolate bare-metal traffic from production networks. Tinkerbell must be the sole DHCP authority on this segment.
  • Provisioner Hardware: Minimum 4 vCPU, 8GB RAM, and 200GB SSD for the OS image cache. Network throughput matters more than CPU; use 10GbE if provisioning multiple nodes simultaneously.
  • Container Runtime: Docker CE or containerd on the provisioner. The Tink stack runs as containers managed by Docker Compose or Helm.
  • UEFI/BIOS Consistency: Standardize on UEFI boot mode across all target hardware. Mixed BIOS/UEFI fleets require separate workflows and complicate maintenance.
  • Image Repository: Local OCI registry (Harbor, Zot, or Docker Registry) pre-loaded with Hook OS and action images. Do not pull from public registries during provisioning; air-gapped reliability is non-negotiable.

For teams managing database servers on bare metal, combining Tinkerbell with proper storage configuration ensures your PostgreSQL instances start on correctly partitioned and tuned disks from day one. Automating filesystem tuning (noatime, swappiness, hugepages) within the provisioning workflow eliminates an entire category of post-deployment performance issues.

How does Tinkerbell compare to MAAS, Foreman, and Ironic?

Choosing a bare-metal provisioning tool depends heavily on your existing ecosystem and operational maturity. Tinkerbell occupies a specific niche: container-native, workflow-driven, and lightweight. It lacks the full lifecycle management of heavier platforms but excels at flexible, programmable installation.

FeatureTinkerbellCanonical MAASForeman / KatelloOpenStack Ironic
Core ModelContainer workflowsCloud-like API + commissioningPuppet/Ansible + KickstartOpenStack service
ComplexityLow-MediumMedium-HighHighVery High
CustomizationDocker containersCurtin + Cloud-initTemplates + PluginsIPA + Deploy Ramdisk
Lifecycle MgmtProvisioning onlyFull (DNS, NTP, Updates)Full (Patch, Config, Content)Within OpenStack
Best ForDevOps-native teams, edgeUbuntu-centric cloudsRHEL/CentOS enterprisesPrivate cloud tenants
Learning CurveModerate (containers)SteepSteepExpert

If your team lives in containers and GitOps, Tinkerbell’s learning curve is gentler because it reuses familiar primitives. MAAS offers superior hardware discovery and ongoing management but demands significant operational overhead. Foreman remains the gold standard for RHEL shops needing content view management and errata tracking. Ironic is only justified if you are already running OpenStack. For most DevOps teams in 2026 seeking to automate bare metal without adopting a platform monolith, Tinkerbell provides the best balance of power and simplicity.

Operational Complexity →Customization Flexibility →TinkerbellMAASForemanIronicContainer-nativeFull LifecycleContent MgmtCloud Scale
Bare-metal provisioning tool comparison: Tinkerbell offers high flexibility with moderate complexity, ideal for DevOps-native teams.

Start Automating Your Bare Metal Today

Tinkerbell bare-metal provisioning bridges the gap between physical infrastructure and modern DevOps practices, giving you the reproducibility and auditability required for compliant, scalable operations. Start with a single provisioning VLAN and a simple Ubuntu workflow to validate the architecture before expanding to heterogeneous fleets. Document every custom action and treat your templates as production code with reviews and versioning. If you need help designing a bare-metal automation strategy that integrates with your existing CI/CD pipelines and compliance requirements, reach out to discuss your infrastructure challenges.

Frequently Asked Questions

Tinkerbell is an open-source, container-native workflow engine for provisioning bare-metal servers. It uses Docker containers as actions to install operating systems, configure firmware, and manage hardware lifecycle without relying on legacy PXE boot infrastructure or monolithic configuration management tools.

Unlike MAAS or Foreman, Tinkerbell treats provisioning steps as immutable container images rather than scripts. This allows teams to version control, test, and share metal workflows like application code, providing greater flexibility for custom hardware initialization and complex multi-stage deployment pipelines in 2026 environments.

Yes, it supports both. Configure the template to use the iPXE UEFI binary and ensure your signing keys are enrolled in the machine's firmware for Secure Boot validation during the provisioning workflow execution phase.

The stack includes Tink Server for state management, Tink Worker running on target hardware, Boots for DHCP and iPXE services, and Hegel for metadata. These microservices communicate via gRPC and run natively on Kubernetes or as standalone binaries depending on deployment scale.

Yes. Deploy a local OCI registry containing all action images and OS artifacts. Configure Tink Worker and Boots to pull from this internal registry instead of public sources, ensuring complete network isolation during bare-metal provisioning operations.

Check Tink Worker logs using journalctl -u tink-worker on the target host. Verify workflow state via tink workflow get . Inspect specific action container logs through the worker's Docker socket to identify failures in individual provisioning steps.

Yes. Version 1.x reached general availability in late 2024. Major cloud providers and edge platforms now use it for fleet management. The API is stable, documentation is comprehensive, and the CNCF graduation path ensures long-term maintenance and community support.

Boots captures MAC addresses during initial PXE requests and registers unknown hardware automatically. You can also pre-populate hardware data via the Tink CLI or API using tink hardware push to define specifications before triggering automated provisioning workflows.

PostgreSQL is the primary supported backend for Tink Server state persistence in 2026. Earlier versions used etcd, but migration to Postgres improved query performance and simplified operational overhead for large-scale bare-metal fleets exceeding one thousand nodes.

Yes. Create a custom action container that mounts a Windows ISO and executes unattended installation via WinPE. Community-maintained Windows actions exist, but most teams build proprietary images to handle driver injection and domain joining specific to their hardware.

All inter-service communication uses mTLS by default. Action containers run with minimal privileges and are pulled from verified registries. Network segmentation between the provisioning VLAN and production traffic prevents unauthorized access during the bare-metal setup phase.

One x86_64 server with 8GB RAM and dual NICs suffices for small deployments. One NIC handles the isolated provisioning network while the other connects to management. Kubernetes is optional; standalone binary mode reduces resource overhead significantly.

Tink Server supports rolling updates because workflow state persists externally in PostgreSQL. Active workers continue executing cached actions. Upgrade Boots and Hegel separately during maintenance windows, verifying API compatibility against your current Tink Server version first.

Yes. Official Terraform and Pulumi providers exist for managing hardware definitions, templates, and workflows declaratively. This enables GitOps-style bare-metal provisioning where infrastructure changes trigger automated Tinkerbell workflow creation through standard CI/CD pipelines.

Forward Tink Server, Boots, and Hegel logs to your existing observability stack using standard output. Workers emit structured JSON logs compatible with Fluent Bit or Vector collectors for centralized aggregation and alerting on provisioning failures.