hetzner-k3s

Open source · MIT · maintained since 2021

Production Kubernetes on Hetzner, in two minutes.

One compiled binary, one YAML file, one command. hetzner-k3s builds a highly available k3s cluster - private network, firewall, load balancers, persistent storage, autoscaling - without Terraform, without a management cluster, and without handing your Hetzner API token to anyone.

Written in Crystal · one binary macOS, Linux · amd64, arm64 · v2.6.0

cluster.yaml ready

On your machine

cluster.yaml 3 masters · 3 workers
hetzner-k3s create v2.6.0 · crystal
kubeconfig written locally
Hetzner Cloud API

Hetzner Cloud · fsn1 · nbg1 · hel1

master-1 fsn1 · cpx22
master-2 nbg1 · cpx22
master-3 hel1 · cpx22
workers × 3 cpx32 · autoscale 1–10
  • load balancer
  • volumes
  • firewall
example build · created in 2m 41s 6 nodes · ≈ €168/mo
Example cluster: three control-plane nodes spread across Falkenstein, Nuremberg and Helsinki, plus an autoscaling worker pool, all created from one local YAML file.
Largest cluster tested
500nodes

the biggest so far: 3 masters, 497 workers

Time to first cluster
2–3min

HA control plane, networking, add-ons

Platform fees
€0fees

only Hetzner bills you, for servers

License
MITlicense

read it, fork it, ship it yourself

01The bill

The same cluster,
three invoices.

A medium production cluster - three masters, ten workers - priced monthly by whoever ends up billing you. hetzner-k3s adds nothing to the total: it is a binary you run, not a platform you rent.

Cloudfleet's €69 is the control plane fee, and that control plane runs in Cloudfleet's own environment, not in your Hetzner project. You pay Hetzner only for the ten workers, then €4.95 for each of the 16 vCPUs above the 24 included in the plan. That lands the cluster roughly a fifth above doing it yourself.

Not on the invoice

  • Platform feenone, ever
  • Control plane feenone - self-managed
  • Trafficincluded by Hetzner
  • DDoS protectionincluded by Hetzner

hetzner-k3s + Hetzner Cloud

3 × CPX22 €60 · 10 × CPX32 €360

€420/mo

1.0×

Cloudfleet on Hetzner

10 × CPX32 €360 · platform €69 + 16 × €4.95

€508/mo

1.2×

AWS EKS

10 × m7i.xlarge $1,472 · control plane $73 · NLB $16

$1,561/mo

3.7×

Multiple of the €420 monthly bill · AWS quoted in USD, shown unconverted

Other sizes, same arithmetic

ClusterConfigurationMonthly
Development 1 master · 2 workers · CPX22 ~€60
Small production 3 masters · 3 workers · CPX22 + CPX32 ~€168
Medium production 3 masters · 10 workers · CPX22 + CPX32 ~€420
Large production 3 masters · 50 workers · CPX22 + CPX32 ~€1,859

Hetzner and Cloudfleet list prices in EUR for EU locations, excl. VAT, checked 19 October 2026. Cloudfleet Pro: €69 per cluster per month for a dedicated multi-AZ control plane, hosted by Cloudfleet, with 24 worker vCPUs included and €4.95 per additional vCPU, metered on worker-node vCPUs only. AWS: 10 × m7i.xlarge on-demand in us-east-1, the $73 EKS control plane and one network load balancer, excluding storage and egress. AWS figures in USD, not converted.

02The build

What create actually does.

No plan step, no state file, no drift to reconcile. It reads one configuration file and builds the cluster in this order - usually before your coffee lands.

  1. 01

    Reads your config

    Validates cluster.yaml, resolves locations and instance types, checks the SSH key you pointed it at.

    cluster.yaml
  2. 02

    Network and firewall

    Creates a private network for all cluster traffic plus a firewall, so only the ports a cluster needs are reachable.

    network · firewall
  3. 03

    Control plane

    Three masters across three Hetzner locations - or one, if you are just kicking the tyres. HA is a config value, not a separate product.

    3 × master
  4. 04

    k3s, then workers

    Installs k3s on the control plane, joins your worker pools with the cluster token, and provisions nodes in parallel against Hetzner's API.

    k3s · nodes
  5. 05

    The batteries

    Cloud Controller Manager, CSI driver, Cluster Autoscaler and System Upgrade Controller, installed and wired to your cluster. Flannel by default, Cilium if you want it.

    ccm · csi · ca · suc
  6. 06

    Kubeconfig, locally

    Writes a merged kubeconfig where you asked for it and prints the context. kubectl get nodes works immediately, and the API token never went anywhere else.

    kubeconfig
03The point

You already rent the servers. Renting permission to deploy is a different business model.

hetzner-k3s is the other one - a binary, a config file, and keys that stay on your machine.

04Comparison

Where your cluster ends up.

All three approaches produce a working Kubernetes cluster. They differ in who holds your API token, what you have to install first, and what shows up on the invoice.

Criteria hetzner-k3s Managed service Terraform-based
Setup time 2–3 minutes 5–10 minutes 15–30 minutes or more
What you install One binary A third-party account1 Terraform, Packer, HCL
Credential exposure None - token stays local API token handed to a vendor None
Who can see your workloads Only you The provider Only you
Monthly cost Infrastructure only Infrastructure + platform fees Infrastructure only
Learning curve Low - one YAML file Low Medium to high

1. Managed Kubernetes providers for Hetzner - Cloudfleet, Edka and friends - require signing up with them in addition to your Hetzner Cloud account.

05Quickstart

Three commands. One YAML file.

Install it, describe the cluster you want, create it. The only prerequisite is a Hetzner Cloud API token and an SSH key.

01

Install

Homebrew on macOS and Linux. Prefer a binary? Releases ship for macOS and Linux, amd64 and arm64.

Download a release
terminal
$ brew install vitobotta/tap/hetzner_k3s
02

Describe the cluster

One human-readable file: token, cluster name, SSH keys, and your node pools. Locations and instance types are plain strings, so a cluster definition fits in a pull request.

Also in this file

  • CNIflannel or cilium
  • API load balanceroptional
  • Upgrade concurrency1 by default
  • Protect against deletiontrue / false
cluster.yaml
hetzner_token: <your-token>
cluster_name: my-cluster
config_format_version: 1
k3s_version: v1.32.0+k3s1

networking:
  ssh:
    public_key_path: "~/.ssh/id_ed25519.pub"
    private_key_path: "~/.ssh/id_ed25519"

masters_pool:
  instance_type: cpx22
  instance_count: 3
  locations: [fsn1, nbg1, hel1]

worker_node_pools:
  - name: workers
    instance_type: cpx32
    instance_count: 3
    location: fsn1
    autoscaling:
      enabled: true
      min_instances: 1
      max_instances: 10
03

Create

The kubeconfig is written for you. Add | tee create.log if you want a record of the run - handy when you open an issue.

terminal
$ hetzner-k3s create --config cluster.yaml

✓ network · firewall · ssh key
✓ master-1 master-2 master-3       fsn1 nbg1 hel1
✓ k3s install · workers joined
✓ ccm · csi · autoscaler · suc
✓ kubeconfig written

$ kubectl get nodes
NAME       STATUS   ROLES                  AGE
master-1   Ready    control-plane,master   2m
master-2   Ready    control-plane,master   2m
master-3   Ready    control-plane,master   2m
worker-1   Ready    <none>                 1m
worker-2   Ready    <none>                 1m
worker-3   Ready    <none>                 1m

Next: install an ingress controller, point DNS at the load balancer Hetzner CCM created, and deploy. The docs cover upgrades, scaling, CNI choice, and clusters past 100 nodes.

Open the documentation
06Users

Who runs it.

  • 01

    Startups

    Production workloads at Hetzner prices, with a control plane you can actually debug.

  • 02

    Platform and dev teams

    A disposable test cluster in the time it takes to review a PR. Delete it and it is gone.

  • 03

    Agencies

    Client infrastructure as version-controlled YAML instead of tribal knowledge.

  • 04

    EU companies

    Falkenstein, Nuremberg and Helsinki. Data stays in the EU, and only you hold the keys.

07Support

Free, MIT, no tiers.

Use it for a side project, a startup or a bank. There is no paid edition, no feature flag held back, no telemetry phoning home. Read the source, fork it, send a patch.

View the source

Need it in production?

Architecture review, deployment help, custom features or a training session for your team - from the person who wrote it.

Get in touch