YAML is painful, but Helm charts deploy entire stacks in minutes. The alternative is worse.
Every time I mention Kubernetes, someone tells me it’s too complicated. Too much YAML. Too many concepts. Too hard to learn

I get it. I’ve been there. The first time I looked at a Kubernetes manifest, I wanted to close my laptop and become a farmer. But here’s the thing: the alternative is worse
YAML sucks, I know
Let’s acknowledge the elephant in the room. YAML is a terrible way to configure things:
- No autocompletion
- Basic syntax highlighting
- No type checking
- You scroll up constantly to figure out what level you’re at
- One wrong indent and everything breaks
- Error messages are cryptic
This isn’t a defense of YAML. It’s bad. Really bad. It’s basically low-code that somehow ended up worse than actual code
But that’s not the point
One command, entire stack
Last week I needed a logging stack. Loki, Promtail, the whole thing. Here’s what I ran:
helm install loki grafana/loki-stack Done. Five minutes later I had centralized logging across my cluster. That’s it. One command
Without Helm? I’d be downloading tarballs, writing systemd units, figuring out config files, debugging port bindings, setting up log rotation, configuring storage paths. That’s a day minimum. Probably two with the inevitable “why won’t this thing start” debugging
Same with sealed-secrets:
helm install sealed-secrets sealed-secrets/sealed-secrets -n kube-system Ten minutes of work including reading the docs. Now I can encrypt secrets and commit them to git safely. The alternative? Writing your own encryption wrapper, managing keys manually, hoping you don’t mess up
ArgoCD? About ten minutes to have full GitOps running:
helm install argocd argo/argo-cd -n argocd Try setting up a GitOps pipeline from scratch. You’re looking at a week of webhooks, authentication, state management, and UI work
The ecosystem is the feature
This is what people miss when they complain about Kubernetes complexity. Yes, the underlying system is complex. But you rarely interact with it directly
Helm charts abstract away thousands of decisions:
- How should this app handle health checks?
- What resource limits make sense?
- How do I configure TLS termination?
- What’s the right way to set up service discovery?
- How do I handle persistent storage?
Someone already answered those questions. The chart maintainer, usually backed by the company that built the software, figured it out. You get their knowledge for free
Install Prometheus with Helm and you get:
- Proper RBAC configured
- Sensible scrape intervals
- Storage retention policies
- Alertmanager integration
- Service monitors for common exporters
That’s weeks of learning compressed into helm install
The real comparison
Don’t compare “Kubernetes with YAML” to “nothing”. Compare it to what you’d actually do:
Without Kubernetes:
- SSH into servers
- Write bash scripts for deployments
- Manage systemd units manually
- Set up your own load balancing
- Configure DNS by hand
- Build your own secret management
- Write custom health check scripts
- Handle log aggregation yourself
- Figure out rolling updates manually
- Debug networking between machines
With Kubernetes:
- Write some YAML (yes, it sucks)
- Run
kubectl apply - Everything else is handled
The YAML is annoying. But it’s a small price for not doing everything else manually
Operators make it even better
Here’s where it gets good. Operators extend Kubernetes to manage complex applications:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: my-database
spec:
instances: 3
storage:
size: 10Gi That’s it. Three-node PostgreSQL cluster with automatic failover, backups, and monitoring. The CloudNativePG operator handles everything. Try setting up PostgreSQL replication manually. You’ll need a week and some aspirin
Same pattern works for:
- Redis clusters
- RabbitMQ
- Kafka
- Elasticsearch
- MongoDB
Write a small manifest, get a production-ready system. The operator does the hard work
Learning curve is front-loaded
Yes, Kubernetes takes time to learn. But once you know it, you know it. The concepts transfer across:
- Every cloud provider
- Any application type
- Any team you join
Compare that to learning someone’s custom deployment scripts. Or their bespoke systemd setup. Or their hand-rolled Ansible playbooks that only they understand
Kubernetes is standardized. That matters more than being simple
When it’s actually too much
I’m not saying use Kubernetes for everything. If you have:
- A single service
- No scaling needs
- No team to share with
- No need for self-healing
Then yeah, a VPS with Docker Compose is fine. Don’t overcomplicate things
But the moment you need:
- Multiple services talking to each other
- Automatic failover
- Rolling updates with no downtime
- Secret management
- Multiple environments
- More than two people deploying
Kubernetes stops being “too complicated” and starts being “the simplest option that actually works”
The tooling keeps improving
The experience is better than it was three years ago:
- k9s: Terminal UI that makes cluster navigation fast
- Lens: GUI if you prefer that
- Helm: One-command installs for complex stacks
- Helmfile: Manage multiple Helm releases declaratively
- kustomize: Overlay configs without templating
- ArgoCD/Flux: GitOps that deploys automatically
You don’t have to write raw YAML for everything. The ecosystem exists specifically because people agreed YAML management sucks
Stop comparing to an ideal
The complaint is always “Kubernetes is complicated compared to…” but compared to what exactly?
Not to nothing. You need something to run your applications
Not to a perfect simple system that handles everything. That doesn’t exist
Compared to the actual alternatives, which are either:
- Manual server management (worse)
- Vendor-specific platforms (lock-in)
- Custom automation (maintenance burden)
Kubernetes wins. Not because it’s simple. Because it’s less bad than everything else at scale
Conclusion
YAML is annoying. The learning curve is real. Some of the abstractions are over-engineered
But I can deploy a complete observability stack before lunch. I can set up GitOps in an afternoon. I can run a replicated database with three lines of YAML
The alternative isn’t “no complexity”. It’s “different complexity that you have to build and maintain yourself”
I’ll take the YAML
Enjoyed this article?
Let me know! A share is always appreciated.