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
On your machine
Hetzner Cloud · fsn1 · nbg1 · hel1
- load balancer
- volumes
- firewall
- Largest cluster tested
- 500nodes
- Time to first cluster
- 2–3min
- Platform fees
- €0fees
- License
- MITlicense
the biggest so far: 3 masters, 497 workers
HA control plane, networking, add-ons
only Hetzner bills you, for servers
read it, fork it, ship it yourself
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
| Cluster | Configuration | Monthly |
|---|---|---|
| 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.
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.
Undo is one command too: hetzner-k3s delete removes the servers, network and firewall.
-
01
Reads your config
Validates
cluster.yaml, resolves locations and instance types, checks the SSH key you pointed it at. -
02
Network and firewall
Creates a private network for all cluster traffic plus a firewall, so only the ports a cluster needs are reachable.
-
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.
-
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.
-
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.
-
06
Kubeconfig, locally
Writes a merged kubeconfig where you asked for it and prints the context.
kubectl get nodesworks immediately, and the API token never went anywhere else.
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.
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.
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.
Install
Homebrew on macOS and Linux. Prefer a binary? Releases ship for macOS and Linux, amd64 and arm64.
Download a release$ brew install vitobotta/tap/hetzner_k3s
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
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
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.
$ 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 documentationWho 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.
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 sourceNeed it in production?
Architecture review, deployment help, custom features or a training session for your team - from the person who wrote it.
Get in touchSponsored by
Running hetzner-k3s in production? Sponsor the project and keep the releases coming.