How Kubernetes Ate Six Months of My Life - 7 Things Beginners Miss

·Operation Risk·10 min read

Translated from the original Korean post. 한국어 원문 보기 →

When Everything Looked Fine

I still remember the screen. First Kubernetes cluster deployed, dashboard open. Three nodes, a handful of pods, everything green. I looked at all that green and thought: done.

Three weeks later I ran a load test and the whole thing came apart. Not cleanly, either. Pods died in a chain, one node wobbled and everything sitting on it went down with it. What followed was six months of trial and error I still wince at.

The root cause was simple. I thought Kubernetes was "a fancier way to run Docker." Put a container in, get a running app out. That was the whole mental model. I was handling Kubernetes like a beginner, not like an engineer responsible for a production environment. The gap between those two cost me six months of tuition.

The Seven Mistakes That Hurt Most

Looking back, my mistakes all had the same shape. None of them were really about a specific setting. They all came from misunderstanding what Kubernetes is for in the first place.

Mistake 1: Treating it as Docker Compose with extra steps

Plenty of developers arrive at Kubernetes from Docker Compose. I did, and I carried the same formula in my head: container in, app out. In a small dev environment that approach actually works. Which is exactly why it's dangerous. It works, so you never find out you're wrong.

Kubernetes is a different animal from Docker Compose. It's an orchestration system with its own opinions about failure handling, scheduling, networking, and state. Use it without understanding those opinions and you'll spend your days fighting the tool. Memorizing a few more commands doesn't fix it. What had to change was the unit of management: the thing you manage is the cluster, not the individual app. Until that flipped in my head, everything I did was a patch.

Mistake 2: Skipping resource limits

Without CPU and memory limits, everything runs fine at first. So I figured, why bother. Then one pod springs a memory leak, and the other pods on that node start dying off one by one. One culprit, everybody's a victim.

Debugging was the nastier part. I could dig through logs all day and never see the real cause. Application logic was clean but the pod kept restarting, so I was digging in completely the wrong place. It took me way too long to get it: resource limits aren't optional. They're the bulkhead that stops one pod's problem from flooding the whole node. Running without them is sailing a ship with no watertight compartments.

Mistake 3: Running a single replica

A single replica in production isn't a deployment strategy. It's a countdown. One node goes down and the whole service stops. Kubernetes gives you multiple replicas spread across nodes out of the box, and not using it throws away half the reason you adopted Kubernetes at all.

At the time my thinking was "as long as it runs." Production assumes the opposite. You design on the premise that anything can die at any moment. The goal isn't to keep things from dying. It's to keep the service healthy when they do.

Mistake 4: Passing secrets as environment variables

Environment variables show up in the pod spec, in logs, on dashboards. But to a beginner it looks like the simplest option. I stuck a database password straight into an env var. The first security review caught it before it became a real incident, and I still get a chill thinking about it. If that had been slurped into a log collection pipeline, who knows how far it would have traveled.

Use Kubernetes Secrets properly, or in more sensitive environments inject from an external Secrets Manager. It feels obvious now. Back then my reaction was "why does this need to be so complicated?" There's usually a reason things are complicated.

Mistake 5: Putting everything in the default namespace

Dozens of services jammed into one namespace meant that when something broke I couldn't tell what was what. Every debugging session started with scrolling up and down an unsorted wall of names. Namespaces let you carve out logical territory, attach RBAC, and apply different policies per environment.

They cost almost nothing to create, so there's no reason not to. These days I split by dev/staging/production and by team on top of that. Draw the boundaries early and an incident can't cross them.

Mistake 6: No health check probes

Without probes, Kubernetes has no way to know whether your application is actually healthy. It only knows the container came up. The pod can be running and serving exactly zero requests successfully, and the system will keep routing traffic to it. From the user's side, a perfectly healthy-looking server that only returns errors.

Readiness and liveness probes are a few lines of YAML, and the payoff is wildly out of proportion to their length. Traffic arrives only when the app is genuinely ready, and a broken pod restarts itself. Those few lines are what closes the gap between "the container started" and "the service works."

Mistake 7: Never testing node failure

Beginners test the application. They don't test the cluster. I didn't. I had never deliberately taken a node down to see what happened, so I had no idea how the system behaved under failure. My first load test was effectively my first failure test. At the worst possible moment.

I think this is the line between people who actually understand Kubernetes and people who think they do. You take a node down, kill a pod on purpose, cut the network, and watch what happens. That's when the intuition forms. Behavior you read in the docs and behavior you watched with your own eyes land in completely different parts of your brain.

What Real Ops Teams Do

Once I'd been burned enough, patterns started showing up. Teams that run Kubernetes well share a handful of habits. Nothing flashy — the habits are boring to the point of being tedious.

They automate deployment from day one

Nobody types kubectl apply by hand in production. Every change goes through the CI/CD pipeline. It isn't about tool preference. It's about having one consistent, traceable path from code to cluster.

My team started out with "we're in a hurry, just do it manually this once." Then something broke and we couldn't trace who changed what and when. It cost us dearly. When the change history lives only in people's heads, root cause analysis turns into detective work. Now even the most trivial config change goes through code review and the pipeline.

They manage configuration as code

Everything lives in version control. Cluster state, deployment configs, ConfigMaps, all of it in Git. When something breaks you can point at exactly what changed and when. Traceability is something you lay down before the incident, not after.

Infrastructure as Code isn't a choice anymore, it's the baseline. Helm charts, Kustomize — the tool itself doesn't matter. What matters is that infrastructure state exists as code and can be reproduced whenever you need it.

They restrict permissions hard

RBAC isn't something you bolt on after an incident. You start with it. The rule is simple: nobody gets more access than they actually need.

Developers can reach only the namespaces they own, and even the ops team's permissions split by environment. It feels like friction at first. It's also the most reliable way to prevent someone from accidentally touching production. Narrowing permissions isn't about distrusting people. It's about shrinking the blast radius of a mistake.

They monitor the cluster, not just the app

Application metrics matter, but they aren't enough on their own. Node CPU utilization, pod eviction rates, PersistentVolume capacity — cluster-level signals are the real early warning. When the app looks fine while the infrastructure underneath slowly fills up, app metrics won't tell you.

We watch cluster state live in Prometheus and Grafana, with alerts when thresholds get crossed. We need to know before users do. Half of incident response comes down to how early you find out.

They break things on purpose

This isn't heroics, it's scheduled work. Some teams do it weekly. Chaos Engineering is the name for it: deliberately injecting failure to verify that recovery actually works.

The question isn't "will something fail?" It's "do we know what happens when it does?" You terminate nodes at random, inject network latency, manufacture resource starvation, and watch how the system responds. Breaking it while everything is calm is far cheaper than having it break for real at 3 a.m.

It Was Never a Technical Problem

Six months later, the commands weren't the hard part. The concepts were learnable. What ate the time was building intuition.

Experienced operators ask themselves a few questions before every deploy. What happens if this pod goes down? What happens if this node disappears? How much does this pod consume, and what does that do to its neighbors? Is this config leaking credentials somewhere?

Beginners don't ask those questions yet. Not because they're careless, but because they haven't failed yet. Incidents are what teach you the questions. They taught me.

I've done consulting work helping large Kubernetes rollouts, and I've seen this pattern repeat. Technical knowledge is rarely what holds a team back. The hard part is moving the team's bar from "it works" to "it works reliably in an environment we care about."

Those are completely different problems with completely different fixes. The first one lives in the code. The second lives in habits and team culture.

A Quick Checklist

Before you decide a cluster is ready for production, walk through these.

Resource management

  • Does every pod have CPU/memory limits set?
  • Can one pod hit trouble without affecting the others?

Availability

  • Do critical services run multiple replicas?
  • Does the service keep working when a node goes down?

Monitoring

  • Are readiness/liveness probes configured?
  • Can Kubernetes actually tell what state your application is in?

Organization

  • Are namespaces set up sensibly?
  • Can you tell environments apart when things are under heavy load?

Security

  • Are secrets managed properly?
  • Would a security review turn up anything obvious?

Deployment

  • Can you deploy through a pipeline?
  • Is every change traceable?

Operations

  • Is cluster monitoring in place?
  • Will you find out about problems before your users do?

Anywhere the answer is "not yet," that's the next thing to work on.

What I Got Out of It

I don't regret the six months. Watching a system collapse in front of you teaches things no document can. I do wish someone had told me a few of them earlier.

Kubernetes isn't a shortcut to deployment. It's a different way of managing infrastructure. And how reliable the tool is comes down to the habits of the people running it. The same cluster becomes a completely different system depending on who operates it and how.

Green dots on a dashboard aren't the goal. They're a snapshot of this exact moment, nothing more. The goal is a system where failures happen in predictable ways, recover on their own, and tell you what's going on before users notice.

That kind of system doesn't get built overnight. Build up from the fundamentals, and the more boring a piece looks, the less you should skip it. Incidents always seem to break out in exactly the spot you skipped.

What's the gap between the cluster you're running right now and the one you picture in your head?

Was this post helpful?

One click helps me write the next one

#Kubernetes#DevOps#Cluster Management#Container Orchestration#Infrastructure