The "managed Kubernetes is expensive" conversation usually stops at the control plane fee. That's the wrong place to stop. The real question is total cost of ownership: infrastructure, egress, managed services markup, and most importantly, engineer time. This post breaks it all down with real numbers for a representative production workload.
Scenario: A mid-size production cluster running 10 services — 3 control plane nodes (HA), 6 worker nodes (4 vCPU / 16 GB each), 2 TB persistent storage, and a basic observability stack. Moderate traffic, ~99.9% uptime requirement.
Monthly Infrastructure Cost Comparison
AWS EKS
| Component | Spec | Cost/mo |
|---|---|---|
| EKS control plane fee | — | $73 |
| Worker nodes (6x m5.xlarge) | 4 vCPU / 16 GB | $828 |
| EBS storage (2 TB gp3) | 2,000 GB | $160 |
| NAT Gateway | 2 AZs | $65 |
| Load Balancer (ALB) | 1 ALB | $25 |
| Data transfer (100 GB egress) | — | $9 |
| Total | ~$1,160/mo |
Google GKE (Standard mode)
| Component | Spec | Cost/mo |
|---|---|---|
| GKE control plane fee (Std) | — | $73 |
| Worker nodes (6x n2-standard-4) | 4 vCPU / 16 GB | $780 |
| Persistent Disk SSD (2 TB) | 2,000 GB | $200 |
| Cloud NAT | — | $35 |
| Load Balancer | 1 L7 | $20 |
| Egress (100 GB) | — | $12 |
| Total | ~$1,120/mo |
DigitalOcean DOKS
| Component | Spec | Cost/mo |
|---|---|---|
| Control plane fee | — | $0 |
| Worker nodes (6x s-4vcpu-16gb) | 4 vCPU / 16 GB | $720 |
| Block storage (2 TB) | 2,000 GB | $200 |
| Load Balancer | 1 | $12 |
| Total | ~$932/mo |
Hetzner Cloud (Self-Managed, kubeadm)
| Component | Spec | Cost/mo |
|---|---|---|
| Control plane nodes (3x CPX31) | 4 vCPU / 8 GB | $29 |
| Worker nodes (6x CPX41) | 8 vCPU / 16 GB | $120 |
| Hetzner Volume storage (2 TB) | 2,000 GB | $82 |
| Load Balancer | 1 LB5 | $7 |
| Private network | — | $0 |
| Total | ~$238/mo |
Use the Hetzner Kubernetes Cost Calculator and Kubernetes Cluster Cost Calculator to model your specific configuration.
Adding Engineer Time: The Number Everyone Ignores
Self-managed Kubernetes has ongoing operational overhead that doesn't show up in an infrastructure invoice. Here's a realistic estimate for a team maintaining a production cluster:
| Task | Managed K8s (hrs/mo) | Self-Hosted (hrs/mo) |
|---|---|---|
| Control plane upgrades | 0 (automated) | 2–4 |
| etcd backup management | 0 (managed) | 1–2 |
| Certificate rotation | 0 (managed) | 0.5–1 |
| Node OS patching | 1–2 | 3–6 |
| Networking troubleshooting | 2–4 | 4–8 |
| Incident response (infra layer) | 1–2 | 3–6 |
| Total hours/mo | 4–8 hrs | 13–27 hrs |
At a loaded engineer cost of $100/hr (mid-level SRE/DevOps), that translates to:
| Option | Infra Cost | Engineer Time (median) | True Monthly Cost |
|---|---|---|---|
| AWS EKS | $1,160 | $600 (6 hrs) | ~$1,760 |
| GKE Standard | $1,120 | $600 (6 hrs) | ~$1,720 |
| DOKS | $932 | $600 (6 hrs) | ~$1,532 |
| Hetzner (self-managed) | $238 | $2,000 (20 hrs) | ~$2,238 |
At median estimates, managed Kubernetes is cheaper once you include labor. That result surprises many people who look only at infrastructure spend.
When Self-Hosted Wins
Despite the above numbers, there are cases where self-hosted is clearly the right call:
1. You already have the operations capability. If your team runs self-hosted Kubernetes today and has internal tooling (Ansible, Terraform, runbooks), the marginal cost of another cluster is close to zero in labor. The table above assumes starting from scratch.
2. You're at significant scale. At 50+ nodes, the managed control plane fee ($73/mo) is trivial, but the per-node pricing on managed services becomes painful. A 50-node EKS cluster costs ~$7,000/month in EC2 alone. An equivalent Hetzner setup costs ~$1,200/month. The labor cost of ~$2,000/month doesn't close that gap.
3. Data residency or compliance requirements. Hetzner is EU-based (Frankfurt, Helsinki, Nuremberg, Falkenstein). If you need data to stay in the EU without paying AWS/GCP EU-region premiums, self-hosted on Hetzner is the clearest path.
4. You want to avoid vendor lock-in on storage and networking. Managed K8s providers deeply integrate their storage classes, load balancers, and networking into the cluster. Migrating later is painful. Self-hosted clusters using Longhorn and MetalLB are more portable from day one.
When Managed Kubernetes Wins
1. Small teams (< 3 engineers). You simply don't have the bandwidth to maintain infrastructure. A managed control plane means you never deal with etcd cluster failures, expired certificates, or botched upgrades at 2 AM.
2. You need SLAs. AWS EKS, GKE, and DOKS all publish SLAs for control plane availability. Self-hosted Kubernetes has no SLA — you are the SLA.
3. You rely on cloud-native integrations. IAM roles for service accounts (IRSA on EKS), GKE Workload Identity, and native Secret Manager integrations are genuinely useful. Replicating them on self-hosted clusters requires additional tooling (Vault, external-secrets-operator, etc.).
4. You're running in one region of a major cloud already. If your RDS, ElastiCache, and S3 are all in AWS us-east-1, running your Kubernetes cluster there too eliminates egress costs and cross-region latency. Moving to Hetzner introduces cross-provider egress fees that can erase the savings.
The Hybrid Approach
Many mature teams run a hybrid: managed Kubernetes for production (fewer incidents, SLA-backed), and self-hosted on Hetzner for staging, development, and CI (cheap, disposable).
| Environment | Platform | Reason |
|---|---|---|
| Production | EKS / GKE | SLA, ops simplicity, integrations |
| Staging | DOKS or Hetzner kubeadm | Cost, no SLA needed |
| Dev / CI | Hetzner k3s | Cheap, fast to spin up |
This approach lets junior engineers learn Kubernetes without touching production, and keeps your cloud bill predictable.
The k3s Resource Calculator and Hetzner k3s Cost Calculator are useful for sizing dev and CI clusters on Hetzner.
Summary Decision Tree
Do you have a dedicated ops/SRE team?
├── No → Use managed Kubernetes (EKS, GKE, or DOKS)
└── Yes → How many nodes?
├── < 20 nodes → Managed is likely cheaper (TCO)
└── > 20 nodes → Self-hosted on Hetzner saves money
└── Are you EU-only? → Hetzner is ideal
└── Need cloud integrations? → Managed may still win
There's no universally correct answer. Model your specific workload with the Kubernetes Cluster Cost Calculator and add your team's hourly cost. The math usually makes the right answer obvious.