← Cloud & DevOps
Cloud & DevOps
Kubernetes Is Overkill for Your App (and That's Okay)
✍ ManhithaMay 15, 20258 min read
🐳
Kubernetes has become the default answer to "how should we deploy this?" — and that's a problem. K8s is a genuinely remarkable engineering achievement, but it's designed to solve problems that most applications don't have. Choosing it by default is like buying an articulated lorry to do your weekly grocery run.
What Kubernetes actually does
Kubernetes orchestrates containers across a cluster of machines, providing automated deployment, scaling, self-healing, service discovery, and load balancing. At Google-scale, where you're running thousands of services across tens of thousands of machines, this coordination is invaluable. The question is whether your application has any of those problems.
The honest complexity cost
A minimal production Kubernetes setup requires understanding: pods, deployments, services, ingress controllers, namespaces, RBAC, persistent volumes, config maps, secrets, health checks, resource limits, node affinity, and more. Debugging a K8s production issue requires expertise that takes months to develop. Most startups don't have that expertise, and acquiring it is expensive.
What you should probably use instead
For most applications serving up to millions of requests per day: a managed platform like Railway, Render, or Fly.io (for small-to-medium apps), or AWS ECS/App Runner (for larger workloads) provides 90% of K8s's operational benefits with 10% of the complexity. Add Kubernetes when you genuinely outgrow these — not before.
When K8s is actually the right answer
Complex microservices (10+ services), multi-team environments where services need isolated deployment pipelines, workloads with genuinely complex scaling requirements, or teams with dedicated platform engineering capacity. If you check at least three of those boxes, Kubernetes makes sense. Otherwise, reach for simpler tools first.
Why containers alone weren't enough
Docker solved the problem of environment consistency — packaging an application with its dependencies so it runs identically anywhere. But as organisations deployed dozens or hundreds of containers across multiple machines, new problems emerged: how do you distribute containers across available hardware efficiently? How do you restart a failed container automatically? How do you update running containers without downtime?
These are orchestration problems, and Kubernetes was purpose-built to solve them. Developed at Google — where a predecessor system called Borg had been orchestrating containers at scale for years — Kubernetes brought that operational intelligence to the open-source world. It became the standard almost immediately after its 2014 release, and today it runs under most of the cloud infrastructure you interact with daily.
The Kubernetes object model
Kubernetes operates on a declarative model: you describe the desired state of your system in YAML configuration files, and Kubernetes continuously reconciles the actual state with your desired state. The core objects are Pods (one or more containers that share network and storage), Deployments (specifications for how many Pod replicas to run and how to update them), Services (stable network endpoints for accessing Pods), and Namespaces (logical partitions of a cluster for organising workloads).
This declarative approach is powerful because it makes infrastructure reproducible and auditable. Your entire cluster configuration can live in a Git repository, changes are tracked, and you can reconstruct any environment from scratch. This is the foundation of GitOps — a deployment methodology that treats Git as the single source of truth for infrastructure state.
The control plane and worker nodes
A Kubernetes cluster has two types of machines. The control plane hosts the API server (which receives all requests to create or modify cluster state), the scheduler (which assigns Pods to nodes based on resource availability), and etcd (the distributed key-value store that persists cluster state). The worker nodes run the actual application Pods and host the kubelet daemon that communicates with the control plane.
In managed Kubernetes services (GKE, EKS, AKS), the cloud provider manages the control plane on your behalf, handling upgrades, high availability, and the operational complexity of etcd management. This removes a significant burden — control plane failures are catastrophic for a cluster, and the operational expertise required to manage them at production scale is substantial.
When Kubernetes is the right tool
Kubernetes is powerful but not universally appropriate. It adds significant operational complexity — the joke in the industry is that you often need a team to manage Kubernetes before you need Kubernetes to manage your application. For small teams, simpler deployment options like Docker Compose, serverless functions, or managed container services like AWS Fargate often provide better operational leverage.
Kubernetes earns its complexity at scale: when you have dozens of services, need sophisticated traffic routing, require fine-grained resource allocation across large compute fleets, or need to run workloads across multiple cloud providers. The key question is not "can we use Kubernetes?" but "does our scale and operational maturity justify its overhead?"