ЁЯПл The SchoolтА║тШ╕я╕П KubernetesтА║ЁЯУИ рдзрдбрд╛ 26 тАФ Observability: рдкреНрд░рдЧрддрд┐рдкреБрд╕реНрддрдХреЗ, рджреИрдирдВрджрд┐рдиреА рдЖрдгрд┐ рдзреЛрдХреНрдпрд╛рдЪреНрдпрд╛ рдШрдВрдЯрд╛
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯУИ рдзрдбрд╛ 26 тАФ Observability: рдкреНрд░рдЧрддрд┐рдкреБрд╕реНрддрдХреЗ, рджреИрдирдВрджрд┐рдиреА рдЖрдгрд┐ рдзреЛрдХреНрдпрд╛рдЪреНрдпрд╛ рдШрдВрдЯрд╛

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 26 / 26 тАФ рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛! ┬╖ рдорд╛рдЧреАрд▓: lesson-25-crds-operators


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

рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕ тАФ рд╕рд░реНрд╡ 26 рдзрдбреЗ. рд╢реЗрд╡рдЯ: рдЪрд╛рд▓реВ cluster рддреБрдореНрд╣реА рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╕рд╛ рдкрд╛рд╣рддрд╛: рддреАрди signals, рдиреЗрд╣рдореАрдЪреА tools, рдЖрдгрд┐ "рдкреБрд░реЗрд╕реЗ рдЪрд╛рдВрдЧрд▓реЗ" рдХрд╕реЗ рджрд┐рд╕рддреЗ.

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

рдЬреА рд╢рд╛рд│рд╛ рддреБрдореНрд╣реА рдкрд╛рд╣реВ рд╢рдХрдд рдирд╛рд╣реА рддреА рдЕрдлрд╡рд╛рдВрд╡рд░ рдЪрд╛рд▓рддреЗ. рддреАрди рдкреНрд░рдХрд╛рд░рдЪреА рдХрд╛рдЧрджрдкрддреНрд░реЗ рд╣реЗ рджреБрд░реБрд╕реНрдд рдХрд░рддрд╛рдд:

  1. рдкреНрд░рдЧрддрд┐рдкреБрд╕реНрддрдХреЗ ЁЯУК (metrics) тАФ рд╡реЗрд│реЗрдиреБрд╕рд╛рд░ рдЖрдХрдбреЗ: рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓ рдХрд┐рддреА CPU рд╡рд╛рдкрд░рддреЗ? рджрд░ рд╕реЗрдХрдВрджрд╛рд▓рд╛ рдХрд┐рддреА requests? рдХрд┐рддреА pods Pending? рддреБрдореНрд╣реА рд▓рд╣рд╛рди рдЖрд╡реГрддреНрддреА рдкрд╛рд╣рд┐рд▓реА рдЖрд╣реЗ: metrics-server (рддреЛ kubectl top рдЖрдгрд┐ HPA рд▓рд╛ рдкреБрд░рд╡рддреЛ, L09). рдореЛрдареА рдЖрд╡реГрддреНрддреА рдореНрд╣рдгрдЬреЗ Prometheus: рджрд░ рдХрд╛рд╣реА рд╕реЗрдХрдВрджрд╛рдВрдиреА рддреЛ рд╢рд╛рд│реЗрдд рдлрд┐рд░рддреЛ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рджрд╛рд░рд╛рд╡рд░рдЪреЗ рдЖрдХрдбреЗ (/metrics) рдЙрддрд░рд╡реВрди рдШреЗрддреЛ, рдЗрддрд┐рд╣рд╛рд╕рд╛рд╕рд╣ рдиреЛрдВрджрд╡рддреЛ тАФ рдореНрд╣рдгрдЬреЗ рддреБрдореНрд╣реА рд╡рд┐рдЪрд╛рд░реВ рд╢рдХрддрд╛ "рдХрд╛рд▓ рд░рд╛рддреНрд░реА 2 рд╡рд╛рдЬрддрд╛ рддреЗ рдХрд╛рдп рдХрд░рдд рд╣реЛрддреЗ?"
  2. рджреИрдирдВрджрд┐рдиреА ЁЯУЬ (logs) тАФ рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рдиреЗ рдЬреЗ рд▓рд┐рд╣рд┐рд▓реЗ рддреЗ (kubectl logs, L16). рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рдПрдХ рдЕрдбрдЪрдг: рджреИрдирдВрджрд┐рдиреА рдмрд╛рдХрд╛рд╕реЛрдмрддрдЪ рдорд░рддрд╛рдд! рдореНрд╣рдгреВрди рдкреНрд░рддреНрдпреЗрдХ рдордЬрд▓реНрдпрд╛рд╡рд░рдЪрд╛ рдПрдХ collector (рдПрдХ DaemonSet! тАФ L21) рдкреНрд░рддреНрдпреЗрдХ рджреИрдирдВрджрд┐рдиреА рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдд (Loki, CloudWatch Logs, Elasticsearch) рдкрд╛рдард╡рддреЛ, рдЬрд┐рдереЗ рддреНрдпрд╛ pods рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЯрд┐рдХрддрд╛рдд рдЖрдгрд┐ рд╕рдВрдкреВрд░реНрдг рд╢рд╛рд│реЗрдд рд╢реЛрдзрддрд╛ рдпреЗрддрд╛рдд.
  3. рдзреЛрдХреНрдпрд╛рдЪреНрдпрд╛ рдШрдВрдЯрд╛ ЁЯФФ (alerts) тАФ рд░рд╛рддреНрд░реА 3 рд╡рд╛рдЬрддрд╛ dashboards рдХрдбреЗ рдХреЛрдгреАрдЪ рдЯрдХ рд▓рд╛рд╡реВрди рдкрд╛рд╣рдд рдирд╛рд╣реА. рдирд┐рдпрдо metrics рд╡рд░ рд▓рдХреНрд╖ рдареЗрд╡рддрд╛рдд: "5 min рд╣рд╡реЗ рддреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдХрдореА ready pods тЖТ on-call рдлреЛрди рд╡рд╛рдЬрд╡рд╛." (Alertmanager, рдХрд┐рдВрд╡рд╛ CloudWatch alarms.)

рдЖрдгрд┐ рднрд╛рд░реА рдЪреМрдереЗ: traces ЁЯз╡ тАФ рдПрдХрд╛ request рдЪрд╛ рдкреНрд░рд╡рд╛рд╕ services рдордзреВрди рдЬреЛрдбрд▓реЗрд▓рд╛ (рдлрд╛рдЯрдХ тЖТ api тЖТ analytics тЖТ db), "рдХреБрдареЗ рд╣рд│реВ рдЭрд╛рд▓реЗ?" рд╕рд╛рдареА. рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдмреЛрдЯрд╛рдВрдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд services рд╣реЛрддреАрд▓ рддреЗрд╡реНрд╣рд╛ рддреНрдпрд╛рдЪреА рдУрд│рдЦ рдХрд░реВрди рдШреНрдпрд╛.

рдХреНрд▓рд╛рд╕рд┐рдХ рд╕реБрд░реБрд╡рд╛рддреАрдЪрд╛ рд╕рдВрдЪ: kube-prometheus-stack (Prometheus + Grafana

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

flowchart LR
    subgraph school["ЁЯПл the cluster"]
        pods["ЁЯкС pods expose /metrics"]
        ds["ЁЯзп log collector<br/>DaemonSet, every floor (L21)"]
    end
    prom["ЁЯУК Prometheus<br/>scrapes numbers + history"]
    loki["ЁЯУЬ log store<br/>diaries outlive desks"]
    graf["ЁЯУ║ Grafana<br/>one screen: metrics + logs"]
    alert["ЁЯФФ Alertmanager<br/>rules тЖТ ring the on-call phone"]
    pods --> prom
    ds --> loki
    prom --> graf
    loki --> graf
    prom --> alert

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдЖрдзреАрдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдзрдбреНрдпрд╛рдиреЗ cluster рд▓рд╛ рдПрдХ рд╡рд░реНрддрди рджрд┐рд▓реЗ; observability рдиреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд│рддреЗ рдХреА рдЖрддреНрддрд╛ рдиреЗрдордХреЗ рдХреЛрдгрддреЗ рдШрдбрдд рдЖрд╣реЗ. рдзрдбрд╛ 16 рдЪрд╛ рд╕рд░рд╛рд╡ рдкреБрд░рд╛рд╡реНрдпрд╛рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрдгреЗ рд╡рд┐рд░реБрджреНрдз рдШрдмрд░рд╛рдЯреАрдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрдгреЗ тАФ рдЖрдгрд┐ backup рдЖрдЬ рд░рд╛рддреНрд░реА рдЕрдкрдпрд╢реА рдЭрд╛рд▓рд╛ рд╣реЗ рдЖрдЬ рдХрд│рдгреЗ рд╡рд┐рд░реБрджреНрдз backup рд▓рд╛рдЧрд▓рд╛ рддреНрдпрд╛ рджрд┐рд╡рд╢реА рдХрд│рдгреЗ тАФ рдпрд╛рдВрддрд▓рд╛ рдлрд░рдХрд╣реА рд╣рд╛рдЪ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

# the junior report card you already have:
kubectl top nodes && kubectl -n school top pods        # (metrics-server, L09)

# what Prometheus would scrape тАФ peek at a real /metrics page:
kubectl -n school port-forward deploy/school-api 3000:3000 &
curl -s localhost:3000/metrics | head -20 2>/dev/null \
  || echo "no /metrics endpoint тАФ apps expose one via client libraries (prom-client for Node)"
kill %1

# the full stack, one command (needs Helm; ~2 min, laptop-friendly):
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install obs prometheus-community/kube-prometheus-stack -n monitoring --create-namespace
kubectl -n monitoring port-forward svc/obs-grafana 3001:80 &
# open http://localhost:3001 (admin / prom-operator) тЖТ dashboards for
# YOUR cluster: nodes, pods, the works. ЁЯУ║  Uninstall: helm uninstall obs -n monitoring

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

kubectl port-forward svc/grafana ┬╖ kubectl get servicemonitors

ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L18 (CloudWatch тАФ рддреАрдЪ рддрд┐рдХрдбреА, managed)

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

Grafana k8s/observability/starter-dashboard.json рдордзрд▓реЗ рдЪрд╛рд░ panels рджрд╛рдЦрд╡рддреЗ тАФ up / errors / latency / cluster health тАФ рдЖрдгрд┐ рддреБрдореНрд╣реА pod рдорд╛рд░рд▓реНрдпрд╛рд╡рд░ alert рд╡рд╛рдЬрддреЛ.

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

monitoring stack local рд╡рд░ helm uninstall рдХрд░рд╛ тАФ EKS рд╡рд░ рддреЗ nodes рдЖрдгрд┐ storage рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ рдмрд┐рд▓ рд▓рд╛рд╡рддрд╛рдд

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

ЁЯОУ рд╕рдВрдкреВрд░реНрдг рд╢рд╛рд│рд╛, рдкреВрд░реНрдг

рдбрдмреЗ тЖТ рдмрд╛рдХ тЖТ monitors тЖТ reception тЖТ рдЦреЛрд▓реНрдпрд╛ тЖТ рд╕реВрдЪрдирд╛-рдлрд▓рдХ тЖТ probes тЖТ рд╡рд╛рдЯреЗ тЖТ рдмрд╕реЗрд╕ тЖТ рдлрд╛рдЯрдХреЗ тЖТ рдмрджрд▓реНрдпрд╛ тЖТ рдлрд│реНрдпрд╛ тЖТ office тЖТ deploy robots тЖТ рдЕрдиреЗрдХ рдЗрдорд╛рд░рддреА тЖТ рдкрд░рд┐рдЪрд╛рд░рд┐рдХреЗрдЪрд╛ рд╕рд░рд╛рд╡ тЖТ hall passes тЖТ рдЧреГрд╣рдкрд╛рдард╛рдЪреНрдпрд╛ рдШрдВрдЯрд╛ тЖТ рдЪрд┐рдареНрдареНрдпрд╛рдВрдЪреЗ рдирд┐рдпрдо тЖТ рдард░рд▓реЗрд▓реНрдпрд╛ рдЬрд╛рдЧрд╛ тЖТ рдЕрдЧреНрдирд┐рд╢рд╛рдордХ тЖТ рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдкрд╛рдЯреНрдпрд╛ тЖТ рдЬреЗрд╡рдгрд╛рдЪреЗ рдХреНрд░рдорд╛рдВрдХ тЖТ рдиреВрддрдиреАрдХрд░рдг тЖТ рдирд╡реЗ рд╢рдмреНрдж тЖТ рдЖрдгрд┐ рдЖрддрд╛: рд╕рдЧрд│реНрдпрд╛рд╡рд░ рдирдЬрд░. рд╕рд╡реНрд╡реАрд╕ рдзрдбреЗ. рддреБрдореНрд╣реА рдЖрддрд╛ рдлрдХреНрдд Kubernetes рд╡рд╛рдкрд░рдд рдирд╛рд╣реА тАФ рддреБрдореНрд╣реА рддреЗ рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛, debug рдХрд░реВ рд╢рдХрддрд╛, рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░реВ рд╢рдХрддрд╛, upgrade рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ рд╢реНрд╡рд╛рд╕ рдкрд╛рд╣реВ рд╢рдХрддрд╛. ЁЯОУ

git checkout main   # and go run something real

ЁЯУИ Lesson 26 тАФ Observability: report cards, diaries and alarm bells

ЁЯУН You are here: Lesson 26 of 26 тАФ the final lesson! ┬╖ Previous: lesson-25-crds-operators


ЁЯУж What's in this branch

The complete course тАФ all 26 lessons. The finale: how you actually see a running cluster: the three signals, the standard tools, and what "good enough" looks like.

ЁЯзТ Explain like I'm 5

A school you can't observe is a school run on rumors. Three kinds of paperwork fix that:

  1. Report cards ЁЯУК (metrics) тАФ numbers over time: how much CPU is each kid using? requests per second? pods Pending? You've met the junior version: metrics-server (it feeds kubectl top and the HPA, L09). The grown-up version is Prometheus: every few seconds it walks the school and copies numbers off every door (/metrics), filing them with history тАФ so you can ask "what was it doing at 2 AM yesterday?"
  2. Diaries ЁЯУЬ (logs) тАФ what each kid wrote (kubectl logs, L16). One problem at scale: diaries die with the desk! So a collector on every floor (a DaemonSet! тАФ L21) ships every diary to the library (Loki, CloudWatch Logs, Elasticsearch) where they outlive pods and are searchable across the whole school.
  3. Alarm bells ЁЯФФ (alerts) тАФ nobody stares at dashboards at 3 AM. Rules watch the metrics: "fewer ready pods than desired for 5 min тЖТ ring the on-call phone." (Alertmanager, or CloudWatch alarms.)

Plus the fancy fourth: traces ЁЯз╡ тАФ one request's journey stitched across services (gate тЖТ api тЖТ analytics тЖТ db), for "WHERE was it slow?". Meet it when you have more services than fingers.

The classic starter kit: kube-prometheus-stack (Prometheus + Grafana

ЁЯЧ║я╕П Diagram

flowchart LR
    subgraph school["ЁЯПл the cluster"]
        pods["ЁЯкС pods expose /metrics"]
        ds["ЁЯзп log collector<br/>DaemonSet, every floor (L21)"]
    end
    prom["ЁЯУК Prometheus<br/>scrapes numbers + history"]
    loki["ЁЯУЬ log store<br/>diaries outlive desks"]
    graf["ЁЯУ║ Grafana<br/>one screen: metrics + logs"]
    alert["ЁЯФФ Alertmanager<br/>rules тЖТ ring the on-call phone"]
    pods --> prom
    ds --> loki
    prom --> graf
    loki --> graf
    prom --> alert

тЭУ What

ЁЯдФ Why

Every earlier lesson gave the cluster a behavior; observability is how you find out which one is happening right now. It's also the difference between lesson 16's drill starting from evidence versus from panic тАФ and between discovering the backup failed tonight or discovering it the day you needed the backup.

ЁЯзк Try it

# the junior report card you already have:
kubectl top nodes && kubectl -n school top pods        # (metrics-server, L09)

# what Prometheus would scrape тАФ peek at a real /metrics page:
kubectl -n school port-forward deploy/school-api 3000:3000 &
curl -s localhost:3000/metrics | head -20 2>/dev/null \
  || echo "no /metrics endpoint тАФ apps expose one via client libraries (prom-client for Node)"
kill %1

# the full stack, one command (needs Helm; ~2 min, laptop-friendly):
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install obs prometheus-community/kube-prometheus-stack -n monitoring --create-namespace
kubectl -n monitoring port-forward svc/obs-grafana 3001:80 &
# open http://localhost:3001 (admin / prom-operator) тЖТ dashboards for
# YOUR cluster: nodes, pods, the works. ЁЯУ║  Uninstall: helm uninstall obs -n monitoring

ЁЯФз kubectl for this lesson

kubectl port-forward svc/grafana ┬╖ kubectl get servicemonitors

ЁЯФЧ Builds on: ЁЯкк AWS L18 (CloudWatch тАФ the same trio, managed)

тЬЕ Verify тАФ what you should see

Grafana shows the four panels from k8s/observability/starter-dashboard.json тАФ up / errors / latency / cluster health тАФ and the alert fires when you kill a pod.

ЁЯз╣ Clean up

helm uninstall the monitoring stack locally тАФ on EKS it is nodes and storage billing hourly

тЪая╕П Common mistakes

ЁЯОУ The whole school, complete

Lunchboxes тЖТ desks тЖТ monitors тЖТ reception тЖТ rooms тЖТ notice boards тЖТ probes тЖТ portions тЖТ buses тЖТ gates тЖТ substitutions тЖТ shelves тЖТ the office тЖТ deploy robots тЖТ many buildings тЖТ the nurse's drill тЖТ hall passes тЖТ homework bells тЖТ notes rules тЖТ assigned seats тЖТ extinguishers тЖТ name plates тЖТ lunch rankings тЖТ renovations тЖТ new words тЖТ and now: eyes on all of it. Twenty-six lessons. You don't just use Kubernetes anymore тАФ you can run it, debug it, secure it, upgrade it and watch it breathe. ЁЯОУ

git checkout main   # and go run something real
тЖР Previouscrds operatorsFinished! Take the quiz тЖТcheck what stuck

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