Operators vs. Helm Charts: Why Not Every Kubernetes App Needs an Operator


Kubernetes Operators have become the shiny new hammer in the cloud-native toolbox. Every time a system gets even slightly complex — “Let’s write an Operator!” It’s understandable. Operators promise to automate day-2 operations, manage complex lifecycles, and keep your systems running like clockwork.
But here’s the truth I’ve learned after deploying dozens of real-world apps:
Most Kubernetes applications do not need an Operator. And many are better off with a well-structured Helm chart.
The Operator pattern is powerful, yes — but that power comes at a cost: complexity, custom resources, and opaque behavior that can bite you at the worst times.
Let’s break it down.
Helm Charts are templated YAML files. They install Kubernetes objects (like Deployments, Services, PVCs) and make it easy to customize via values.yaml.
Operators are Kubernetes controllers, written in Go (usually), that monitor custom resources (CRDs) and take action — like provisioning, reconfiguring, healing, or scaling workloads.
Think of Helm as installation and templating. Operators are stateful automation engines.
So why not always use Operators? Because…
When you install an Operator, you’re not just adding a few manifests. You’re introducing:
This might be justified for tools like Postgres, Kafka, or MongoDB, where orchestration is genuinely hard.
But for things like Prometheus, Keycloak, or Redis?
Spinning up a Deployment with a ConfigMap should not require a distributed control plane extension.
Let’s talk about kube-prometheus-stack — a Helm chart that wraps the Prometheus Operator and gives you:
But here’s the catch: you now have to manage two layers of abstraction:
At one client, upgrading kube-prometheus-stack broke alerting rules because the underlying CRDs changed. Helm upgraded the chart, but the operator silently failed to reconcile the new CRs.
Fixing it meant:
A vanilla Helm chart with Prometheus and Alertmanager would have taken minutes to understand and fix. The Operator-based setup took hours.
The main pitch of Operators is automating day-2 ops — scaling, backup, recovery, tuning.
But most teams I’ve worked with:
If your app doesn’t benefit from dynamic state reconciliation, a Helm chart is often cleaner and easier.
With Helm:
helm template shows you rendered manifests.With Operators:
Magic can be helpful — until it breaks. Then it’s just... obscure.
Let me be clear — Operators aren’t evil. They’re fantastic when:
In those cases, an Operator can replace brittle shell scripts or manual ops.
But using an Operator just because “the vendor provides one” is not a good reason.
Operators are powerful, but they aren’t free. They introduce abstractions, moving parts, and stateful logic that Helm intentionally avoids.
Before you add an Operator to your cluster, ask:
Most of the time, a clean, documented Helm chart will take you further, faster, and with fewer surprises.
Just because you can use an Operator doesn’t mean you should.