ЁЯПл The SchoolтА║тШ╕я╕П KubernetesтА║ЁЯй║ рдзрдбрд╛ 16 тАФ debugging playbook: рдкрд░рд┐рдЪрд╛рд░рд┐рдХреЗрдЪрд╛ triage chart
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯй║ рдзрдбрд╛ 16 тАФ debugging playbook: рдкрд░рд┐рдЪрд╛рд░рд┐рдХреЗрдЪрд╛ triage chart

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 16 / 26 тАФ рднрд╛рдЧ 3 рд╕реБрд░реВ: рддреЗ рдЦрд░реЛрдЦрд░ рдЪрд╛рд▓рд╡рдгреЗ ┬╖ рдорд╛рдЧреАрд▓: lesson-15-multi-az-scaling ┬╖ рдкреБрдвреАрд▓: lesson-17-rbac


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдЖрдзреАрдЪреЗ рд╕рдЧрд│реЗ, рдЖрдгрд┐ рддреБрдореНрд╣реА рдЖрдпреБрд╖реНрдпрднрд░ рджрд░ рдЖрдард╡рдбреНрдпрд╛рд▓рд╛ рд╡рд╛рдкрд░рд╛рд▓ рдЕрд╕рд╛ рдзрдбрд╛: рдкреНрд░рддреНрдпреЗрдХ рдиреЗрд╣рдореАрдЪреНрдпрд╛ pod рдЖрдЬрд╛рд░рд╛рд╕рд╛рдареА triage chart, рдЖрдгрд┐ рддреЗ рд╕рдЧрд│реЗ рдУрд│рдЦрдгрд╛рд░рд╛ рдкрд╛рдЪ tools рдЪрд╛ рд╕рд░рд╛рд╡.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рд╢рд╛рд│реЗрдЪреА рдкрд░рд┐рдЪрд╛рд░рд┐рдХрд╛ ЁЯй║ рдШрд╛рдмрд░рдд рдирд╛рд╣реА рдЖрдгрд┐ рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡рдд рдирд╛рд╣реА. рдХреЛрдгреАрд╣реА рдЖрд▓реЗ рддрд░реА рддреА рддреЛрдЪ рд╕рд░рд╛рд╡ рдХрд░рддреЗ: chart рдкрд╛рд╣рд╛, рдард░рд▓реЗрд▓реЗ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рд╛, рдордЧ рдЙрдкрдЪрд╛рд░ рдХрд░рд╛. Kubernetes debugging рдЕрдЧрджреА рддрд╕реЗрдЪ рдЖрд╣реЗ. рдкрд╛рдЪ рдкреНрд░рд╢реНрди, рдХреНрд░рдорд╛рдиреЗ:

  1. kubectl describe pod X тАФ рд░реБрдЧреНрдгрд╛рдЪрд╛ chart: рддрд│рд╛рд╢реА рдЕрд╕рд▓реЗрд▓реЗ Events рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рджрд╛рдирд╛рдЪрд╛ 90%. рддреЗ рдЖрдзреА рд╡рд╛рдЪрд╛, рдиреЗрд╣рдореА.
  2. kubectl logs X тАФ рдмреЗрд╢реБрджреНрдз рдкрдбрдгреНрдпрд╛рдЖрдзреА рд░реБрдЧреНрдг рдХрд╛рдп рдореНрд╣рдгрд╛рд▓рд╛. --previous = рдорд╛рдЧрдЪреНрдпрд╛ рд╡реЗрд│реА рдмреЗрд╢реБрджреНрдз рдкрдбрдгреНрдпрд╛рдЖрдзреА рдХрд╛рдп рдореНрд╣рдгрд╛рд▓рд╛ (crash loops рд╕рд╛рдареА рдлрд╛рд░ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ!). -f = рдереЗрдЯ рдРрдХрд╛.
  3. kubectl get events -w тАФ рдХреЙрд░рд┐рдбреЙрд░рдордзрд▓реНрдпрд╛ рдЧрдкреНрдкрд╛: рдЦреЛрд▓реАрдд рдШрдбрдгрд╛рд░реЗ рд╕рдЧрд│реЗ, рдХреНрд░рдорд╛рдиреЗ.
  4. kubectl exec -it X -- sh тАФ рд░реБрдЧреНрдгрд╛рд▓рд╛ рдЖрддреВрди рддрдкрд╛рд╕рд╛.
  5. kubectl port-forward X 8080:3000 тАФ reception рдЯрд╛рд│реВрди рд░реБрдЧреНрдгрд╛рд▓рд╛ рдереЗрдЯ рдмреЛрд▓рд╡рд╛ (Service/Ingress рд▓рд╛ рдмрдЧрд▓ рджреЗрдКрди рдиреЗрдордХреЗ рдХреБрдареЗ рдмрд┐рдШрдбрддреЗ рддреЗ рд╡реЗрдЧрд│реЗ рдХрд░рд╛).

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart TB
    sick["ЁЯдТ pod is sick"] --> desc["1 describe тЖТ read EVENTS"]
    desc --> p["Pending ЁЯкС<br/>no desk fits:<br/>requests too big? taints?<br/>cluster full? (L08, L15, L20)"]
    desc --> i["ImagePullBackOff ЁЯН▒<br/>wrong lunchbox label:<br/>typo? tag missing? no ECR<br/>permission? (L01, AWS L05)"]
    desc --> c["CrashLoopBackOff ЁЯТе<br/>starts, dies, repeats:<br/>logs --previous!<br/>bad config? (L06)"]
    desc --> o["OOMKilled ЁЯлГ<br/>ate over the limit:<br/>raise limit or fix leak (L08)"]
    desc --> s["Service silent тШОя╕П<br/>selector тЙа labels?<br/>kubectl get endpointslices (L04)"]

тЭУ рдХрд╛рдп (chart, рд▓рдХреНрд╖рдгрд╛рдиреБрд╕рд╛рд░)

рд▓рдХреНрд╖рдг рдЕрд░реНрде рдкрд╣рд┐рд▓рд╛ рдкреНрд░рд╢реНрди
Pending scheduler рд▓рд╛ рдмрд╛рдХ рд╕рд╛рдкрдбрд▓рд╛ рдирд╛рд╣реА describe: рдХреЛрдгрддреА рдЕрдЯ рдЕрдкрдпрд╢реА тАФ resources, taints, volume zone?
ImagePullBackOff рдбрдмрд╛ рдЖрдгрддрд╛ рдпреЗрдд рдирд╛рд╣реА рдиреЗрдордХреА image string? tag рдЖрд╣реЗ рдХрд╛? registry auth (node рдЪреА IAM рдЯреЛрдкреА)?
CrashLoopBackOff рд╕реБрд░реВ рд╣реЛрддреЛ рдордЧ рдорд░рддреЛ, рдкреБрдиреНрд╣рд╛ рдкреБрдиреНрд╣рд╛ logs --previous; рдордЧ env/config, рдордЧ command
OOMKilled (exit 137) memory limit рдЧрд╛рдард▓реА describe рдордзреНрдпреЗ Last State рджрд┐рд╕рддреЗ; limit рд╡рд╛рдврд╡рд╛ рдХрд┐рдВрд╡рд╛ leak рд╢реЛрдзрд╛
Running рдкрдг Ready рдирд╛рд╣реА readiness probe рдЕрдкрдпрд╢реА /readyz рдЦрд░реЛрдЦрд░ рдирд┐рд░реЛрдЧреА рдЖрд╣реЗ рдХрд╛? DB рдкреЛрд╣реЛрдЪрддреЗ рдХрд╛? (L07)
Service рдХрд╛рд╣реАрдЪ рдкрд░рдд рджреЗрдд рдирд╛рд╣реА selector/labels рдЬреБрд│рдд рдирд╛рд╣реАрдд get endpointslices тАФ рд░рд┐рдХрд╛рдореА рдпрд╛рджреА = reception рд▓рд╛ рдХреЛрдгреАрдЪ рдирд╛рд╣реА
Node NotReady рдмрд╛рдХрдЪ рдЖрдЬрд╛рд░реА рдЖрд╣реЗ рд╣реА EC2 рдЪреА рдЧреЛрд╖реНрдЯ: describe node, рдордЧ AWS рдХреЛрд░реНрд╕ L12

ЁЯдФ рдХрд╛

рдЖрдзреАрдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдзрдбреНрдпрд╛рдиреЗ рдПрдХ рдпрдВрддреНрд░рдгрд╛ рд╢рд┐рдХрд╡рд▓реА; incidents рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛ рдпрдВрддреНрд░рдгрд╛ рдПрдХреЗрдХ рдХрд░реВрди рдЕрдкрдпрд╢реА рд╣реЛрдгреЗ. рддрдЬреНрдЬреНрдЮ рдЬрд╛рд╕реНрдд рд╣реБрд╢рд╛рд░ рдирд╕рддрд╛рдд тАФ рддреЗ рдлрдХреНрдд рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡рдгреНрдпрд╛рдРрд╡рдЬреА рдиреЗрд╣рдореА рддреЛрдЪ рд╕рд░рд╛рд╡ рдХрд░рддрд╛рдд. Events тЖТ logs тЖТ exec. рдпрд╛рдЪ рдХреНрд░рдорд╛рдиреЗ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ тАФ рджрд╡рд╛рдЦрд╛рдиреНрдпрд╛рдЪрд╛ рд╕рд░рд╛рд╡ (рд╕реБрд░рдХреНрд╖рд┐рдд, рд╕реНрд╡рддрдГ рдУрдврд╡реВрди рдШреЗрддрд▓реЗрд▓рд╛)

# patient 1: ImagePullBackOff
kubectl -n school run sick1 --image=nginxdemos/hello:no-such-tag
kubectl -n school describe pod sick1 | tail -5        # Events tell you instantly

# patient 2: CrashLoopBackOff
kubectl -n school run sick2 --image=busybox -- sh -c "echo I die now; exit 1"
kubectl -n school logs sick2 --previous 2>/dev/null || kubectl -n school logs sick2

# patient 3: Pending (impossible request)
kubectl -n school run sick3 --image=nginx --overrides='{"spec":{"containers":[{"name":"sick3","image":"nginx","resources":{"requests":{"cpu":"100"}}}]}}'
kubectl -n school describe pod sick3 | grep -A3 Events

# discharge everyone:
kubectl -n school delete pod sick1 sick2 sick3

ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl

kubectl describe ┬╖ kubectl get events ┬╖ kubectl logs --previous ┬╖ kubectl exec

ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L05 (ImagePullBackOff рдмрд╣реБрдзрд╛ ECR permission рдореБрд│реЗ рдЕрд╕рддреЛ)

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ

рджрд╡рд╛рдЦрд╛рдиреНрдпрд╛рддрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЬрд╛рд░реА pod рдЪреЗ рдирд┐рджрд╛рди describe тЖТ events тЖТ logs (--previous) тЖТ exec рдордзреВрди рд╣реЛрддреЗ, рдбреЛрдХрд╛рд╡реВрди рди рдкрд╛рд╣рддрд╛.

ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ

local cluster: kubectl delete -f k8s/ (рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА apply рдХреЗрд▓реЗрд▓реА file) тАФ EKS рд╡рд░ рдЪрд╛рд▓реВ рд░рд╛рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдХрд╢рд╛рдЪреЗрд╣реА рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ рдмрд┐рд▓ рдпреЗрддреЗ

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

тПня╕П рдкреБрдвреЗ

рд╣реЗ commands рдЪрд╛рд▓рд╡рд╛рдпрдЪреА рдкрд░рд╡рд╛рдирдЧреА рдореБрд│рд╛рдд рдХреЛрдгрд╛рд▓рд╛ рдЖрд╣реЗ тАФ рдЖрдгрд┐ рддреБрдордЪрд╛ CI robot cluster-admin рдХрд╛ рдирд╕рд╛рд╡рд╛: RBAC.

git checkout lesson-17-rbac

ЁЯй║ Lesson 16 тАФ The debugging playbook: the nurse's triage chart

ЁЯУН You are here: Lesson 16 of 26 тАФ Part 3 begins: running it for real ┬╖ Previous: lesson-15-multi-az-scaling ┬╖ Next: lesson-17-rbac


ЁЯУж What's in this branch

Everything before, plus the lesson you'll use weekly forever: the triage chart for every classic pod sickness, and the five-tool drill that diagnoses all of them.

ЁЯзТ Explain like I'm 5

The school nurse ЁЯй║ doesn't panic and doesn't guess. Whatever walks in, she runs the same drill: look at the chart, ask the standard questions, then treat. Kubernetes debugging is exactly that. The five questions, in order:

  1. kubectl describe pod X тАФ the patient's chart: Events at the bottom are 90% of every diagnosis. Read them first, always.
  2. kubectl logs X тАФ what the patient said before fainting. --previous = what they said before the last faint (crucial for crash loops!). -f = listen live.
  3. kubectl get events -w тАФ the hallway gossip: everything happening in the room, in order.
  4. kubectl exec -it X -- sh тАФ examine the patient from inside.
  5. kubectl port-forward X 8080:3000 тАФ call the patient directly, skipping reception (bypasses Service/Ingress to isolate WHERE it breaks).

ЁЯЧ║я╕П Diagram

flowchart TB
    sick["ЁЯдТ pod is sick"] --> desc["1 describe тЖТ read EVENTS"]
    desc --> p["Pending ЁЯкС<br/>no desk fits:<br/>requests too big? taints?<br/>cluster full? (L08, L15, L20)"]
    desc --> i["ImagePullBackOff ЁЯН▒<br/>wrong lunchbox label:<br/>typo? tag missing? no ECR<br/>permission? (L01, AWS L05)"]
    desc --> c["CrashLoopBackOff ЁЯТе<br/>starts, dies, repeats:<br/>logs --previous!<br/>bad config? (L06)"]
    desc --> o["OOMKilled ЁЯлГ<br/>ate over the limit:<br/>raise limit or fix leak (L08)"]
    desc --> s["Service silent тШОя╕П<br/>selector тЙа labels?<br/>kubectl get endpointslices (L04)"]

тЭУ What (the chart, symptom by symptom)

Symptom Meaning First question
Pending scheduler found no desk describe: which condition failed тАФ resources, taints, volume zone?
ImagePullBackOff can't fetch the lunchbox exact image string? tag exists? registry auth (node's IAM hat)?
CrashLoopBackOff starts then dies, repeatedly logs --previous; then env/config, then command
OOMKilled (exit 137) memory limit hit describe shows Last State; raise limit or find the leak
Running but not Ready readiness probe failing is /readyz actually healthy? DB reachable? (L07)
Service returns nothing selector/labels mismatch get endpointslices тАФ empty list = reception has nobody
Node NotReady the desk itself is sick it's an EC2 story: describe node, then AWS course L12

ЁЯдФ Why

Every earlier lesson taught a mechanism; incidents are those mechanisms failing one at a time. The pros aren't smarter тАФ they just always run the same drill instead of guessing. Events тЖТ logs тЖТ exec. In that order.

ЁЯзк Try it тАФ infirmary drill (safe, self-inflicted)

# patient 1: ImagePullBackOff
kubectl -n school run sick1 --image=nginxdemos/hello:no-such-tag
kubectl -n school describe pod sick1 | tail -5        # Events tell you instantly

# patient 2: CrashLoopBackOff
kubectl -n school run sick2 --image=busybox -- sh -c "echo I die now; exit 1"
kubectl -n school logs sick2 --previous 2>/dev/null || kubectl -n school logs sick2

# patient 3: Pending (impossible request)
kubectl -n school run sick3 --image=nginx --overrides='{"spec":{"containers":[{"name":"sick3","image":"nginx","resources":{"requests":{"cpu":"100"}}}]}}'
kubectl -n school describe pod sick3 | grep -A3 Events

# discharge everyone:
kubectl -n school delete pod sick1 sick2 sick3

ЁЯФз kubectl for this lesson

kubectl describe ┬╖ kubectl get events ┬╖ kubectl logs --previous ┬╖ kubectl exec

ЁЯФЧ Builds on: ЁЯкк AWS L05 (ImagePullBackOff is usually an ECR permission)

тЬЕ Verify тАФ what you should see

each sick pod in the infirmary gets a diagnosis from describe тЖТ events тЖТ logs (--previous) тЖТ exec, without peeking.

ЁЯз╣ Clean up

local cluster: kubectl delete -f k8s/ (or the file you applied) тАФ on EKS, anything left running bills by the hour

тЪая╕П Common mistakes

тПня╕П Next

Who is even ALLOWED to run these commands тАФ and why your CI robot shouldn't be cluster-admin: RBAC.

git checkout lesson-17-rbac
тЖР Previousmulti az scalingNext тЖТrbac

This page is the lesson's README from the lesson-16-debugging branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.