DEV Community

Cover image for I Broke My First Kubernetes Pod - 5 Commands That Saved Me From Hours of Confusion
Arbythecoder
Arbythecoder

Posted on

I Broke My First Kubernetes Pod - 5 Commands That Saved Me From Hours of Confusion

Man, I was so confused!

Last week, I decided to finally tackle Kubernetes properly. You know that feeling when everyone's talking about K8s and you're still figuring out Docker? I set up Docker Desktop, created what I thought was a simple pod, and... it immediately crashed. Then crashed again. And again.

I stared at my screen thinking "What did I do wrong this time?"

Welcome to CrashLoopBackOff - a status that sounds like a dance move but had me scratching my head for way too long!

NAME         READY   STATUS             RESTARTS     AGE
crash-demo   0/1     CrashLoopBackOff   4 (5s ago)   2m28s
Enter fullscreen mode Exit fullscreen mode

If you've seen this before, you know that sinking feeling. That's exactly how CrashLoopBackOff works - it looks simple but can really mess with your head when you're just starting out.

What Even IS CrashLoopBackOff? (The Real Talk Explanation)

Think of CrashLoopBackOff like a stubborn car that refuses to start:

  1. Your container starts "Alright, I'm ready to work!"
  2. Your container crashes "Wait! Something's wrong, I'm out!"
  3. Kubernetes tries again "Maybe this time it will work?"
  4. Container crashes again "Still the same problem!"
  5. Kubernetes waits longer "Let me give it some breathing space..."
  6. Repeat forever "This is CrashLoopBackOff!"

The "BackOff" part means Kubernetes is smart. Instead of trying immediately, it waits longer between retries (10s, 20s, 40s, up to 5 minutes). It's like when your car won't start - you don't keep turning the key continuously, you give it time.

My Debugging Journey: From "What Happened?" to "Aha!"

Here's my actual terminal session from when trouble started (yes, I made typos under pressure because we're all human):

PS C:\Users\Arbythecoder> kubectl cluster -info  # See the typo here!
error: unknown command "cluster" for "kubectl"

PS C:\Users\Arbythecoder> kubectl get pods
NAME         READY   STATUS             RESTARTS     AGE
crash-demo   0/1     CrashLoopBackOff   4 (5s ago)   2m28s
Enter fullscreen mode Exit fullscreen mode

At that moment, I was thinking: "Seriously, what did I mess up? Why won't this thing just work?"

Let me show you the 5 commands that helped me go from completely lost to actually understanding what was happening. Maybe they'll save you some head-scratching too.

Command #1: The Full Story - kubectl describe pod

What it does: Gives you the complete story of your pod's issues
Why you need it: Because kubectl get pods only shows current status, not the real cause

kubectl describe pod crash-demo
Enter fullscreen mode Exit fullscreen mode

Here's what I saw and what each part actually means:

# This shows the container is stuck trying to restart
State:          Waiting
  Reason:       CrashLoopBackOff

# This shows what happened during the last attempt
Last State:     Terminated
  Reason:       Error
  Exit Code:    1        # This is key! Zero means success, anything else means trouble

# This shows how many times it has failed (the real deal)
Restart Count:  12       # Wow! 12 attempts and still failing
Enter fullscreen mode Exit fullscreen mode

The most important part is at the bottom - the Events section:

Events:
  Type     Reason     Age                    From     Message
  ----     ------     ----                   ----     -------
  Warning  BackOff    2m33s (x274 over 62m)  kubelet  Back-off restarting failed container
Enter fullscreen mode Exit fullscreen mode

What this meant: "This container has been failing for over an hour, and Kubernetes has tried 274 times - something is definitely wrong here!"

Command #2: The Time Machine - kubectl logs --previous

What it does: Shows you what the container was saying before it crashed
Why it's crucial: Regular kubectl logs might be empty if your container crashes immediately

kubectl logs crash-demo --previous
Enter fullscreen mode Exit fullscreen mode

For my case, this returned... absolutely nothing. Empty as an abandoned building.

What this taught me: Sometimes even kubectl logs --previous doesn't show anything. This usually means the container crashed so early it never produced logs, or the logs aren't going to stdout. When this happens, kubectl describe and pod events become your best friends. They show error messages that Kubernetes detected and help you figure out what went wrong.

When there are no logs even with --previous, it typically means:

  • The container crashed before it could even start properly
  • The problem is likely with the command you're trying to run
  • Time to double-check your YAML file!

Command #3: The Timeline - kubectl get events --sort-by='.lastTimestamp'

What it does: Shows you everything that happened in your cluster, in order
Why it helps: Sometimes the problem isn't just your pod. Maybe your whole node had issues

kubectl get events --sort-by='.lastTimestamp'
Enter fullscreen mode Exit fullscreen mode

My output showed:

LAST SEEN   TYPE      REASON         OBJECT                MESSAGE
56m         Normal    NodeNotReady   node/docker-desktop   Node status is now: NodeNotReady
56m         Normal    NodeReady      node/docker-desktop   Node status is now: NodeReady
2m48s       Warning   BackOff        pod/crash-demo        Back-off restarting failed container
Enter fullscreen mode Exit fullscreen mode

What this told me: My node had some issues earlier (maybe Docker was restarting), but that wasn't the current problem. The real issue was just my pod continuously failing.

Command #4: The Wide View - kubectl get pods -o wide

What it does: Shows you extra details about your pods
Why it matters: Sometimes you need to see which node your pod is running on, or what IP it got

kubectl get pods -o wide
Enter fullscreen mode Exit fullscreen mode

This shows you:

  • Which node is running your pod
  • The pod's IP address
  • Additional status information that might give clues

Pro tip: If multiple pods are failing on the same node, the problem might be the node itself, not your application.

Command #5: The Root Cause - Check Your YAML File

This isn't a kubectl command, but it's often the most important step. I had to go back and examine my crashpod.yml file.

Here's what was causing my trouble:

apiVersion: v1
kind: Pod
metadata:
  name: crash-demo
spec:
  containers:
  - name: broken
    image: busybox
    command: ["false"]  # This is the problem right here!
Enter fullscreen mode Exit fullscreen mode

The issue: The false command literally just exits with code 1 (failure). It's designed to fail! I created this as a test case, but when you're learning, even intentional failures can be confusing if you forget what you did.

The "Aha!" Moment: Understanding Exit Codes

From my kubectl describe output, I saw:

Exit Code: 1
Enter fullscreen mode Exit fullscreen mode

In the programming world:

  • Exit Code 0 = "Everything went well, I'm happy!"
  • Exit Code 1 (or any non-zero) = "Something went wrong, I had to stop!"

My container was literally running a command designed to always fail. No wonder it was in CrashLoopBackOff - it was doing exactly what I told it to do!

What I Learned: The Proper Debugging Approach

Start big, then focus small:

  1. kubectl get pods "What's the current situation?"
  2. kubectl describe pod "What's the full story behind this issue?"
  3. kubectl logs --previous "What was the application saying before it crashed?"
  4. kubectl get events "What else was happening in the cluster?"
  5. Check your YAML "Is my configuration actually correct?"

Common Mistakes I Made (So You Won't Repeat Them)

Mistake #1: Using kubectl logs without --previous on a crashing container

  • Fix: Always use --previous for containers that keep restarting

Mistake #2: Ignoring the Exit Code in kubectl describe

  • Fix: Exit Code 0 = good news, anything else = investigate further

Mistake #3: Not reading the Events section properly

  • Fix: Events show you the timeline of what Kubernetes tried to do and where it got stuck

Mistake #4: Panicking when seeing high restart counts

  • Fix: High restart counts just mean it's been failing for a while. Focus on WHY it's failing

Mistake #5: Thinking the problem must be complex

  • Fix: Often it's something simple in your YAML (wrong command, typo in image name, missing configuration)

Practice Makes Perfect - Try This Yourself

Want to practice debugging? Create your own crash pod to understand the process:

apiVersion: v1
kind: Pod
metadata:
  name: practice-crash
spec:
  containers:
  - name: broken-app
    image: busybox
    command: ["sh", "-c", "echo 'Starting up...' && sleep 5 && exit 1"]
Enter fullscreen mode Exit fullscreen mode

This will:

  1. Print "Starting up..." (so you'll see logs this time)
  2. Wait 5 seconds (so it doesn't crash immediately)
  3. Exit with failure code 1
  4. Go into CrashLoopBackOff

Use the 5 commands on this pod and you'll see the full debugging process in action!

The Real Talk Summary

Kubernetes debugging isn't rocket science. It's detective work. Every crash leaves clues, and these 5 commands help you follow the trail:

  1. kubectl describe pod Get the complete story
  2. kubectl logs --previous See what happened before the crash
  3. kubectl get events Understand the timeline
  4. kubectl get pods -o wide Get additional context
  5. Check your YAML Verify your configuration

Remember: Even senior developers create pods that crash. The difference is they know these debugging steps and don't spend hours guessing what went wrong.

Next time you see CrashLoopBackOff, you'll know exactly where to start looking.


Learning Together - What's Next?

This is Part 1 of me figuring out Kubernetes in real-time. I'm sharing every struggle, breakthrough, and "wait, that actually worked!" moment as I learn - the messy reality, not just the clean tutorials.

What's coming up:

  • Part 2: Network debugging confusion (when pods can't talk to each other)
  • Part 3: My first attempt at production monitoring (what worked and what didn't)
  • Part 4: Docker container optimization (how I finally shrunk that 2GB image to 400MB)

Fellow K8s learners! If you're figuring this out too, let's learn together. I'll keep sharing every discovery, mistake, and breakthrough as they happen.

Drop a comment below with your current K8s struggle - maybe we can tackle it in the next post! This community has helped me so much, and I want to pay it forward.


What's your most confusing Kubernetes moment? Share it in the comments - let's learn from each other's struggles!

Top comments (0)