Back to articles
blog — devops — zsh$ cat devops.md# Nov 19, 2025Kubernetes isn't thatcomplicated, stopcomplaining
6 min read

YAML is painful, but Helm charts deploy entire stacks in minutes. The alternative is worse.

KubernetesHelmDevOps

Every time I mention Kubernetes, someone tells me it’s too complicated. Too much YAML. Too many concepts. Too hard to learn

I tried to explain Kubernetes to someone and we both didn't understand

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:

  1. Manual server management (worse)
  2. Vendor-specific platforms (lock-in)
  3. 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.

About the author

Sofiane Djerbi

Sofiane Djerbi

Cloud & Kubernetes Architect, FinOps Expert. I help companies build scalable, secure, and cost-effective infrastructures.

Comments