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

ЁЯПв рдзрдбрд╛ 13 тАФ рдкрдбрджреНрдпрд╛рдорд╛рдЧреЗ: рд╢рд╛рд│реЗрдЪреЗ рдХрд╛рд░реНрдпрд╛рд▓рдп

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 13 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-12-storage ┬╖ рдмреЛрдирд╕ рдкреБрдврдЪрд╛: lesson-14-deploy-gitops


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

рд╕рд░реНрд╡ 13 рдзрдбреЗ тАФ рд╣реА branch рдореНрд╣рдгрдЬреЗ рдкреВрд░реНрдг course. рд╢реЗрд╡рдЯрдЪрд╛ рднрд╛рдЧ: control plane тАФ рдЖрдзреАрдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ рдзрдбрд╛ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдШрдбрд╡реВрди рдЖрдгрдгрд╛рд░реА рдпрдВрддреНрд░рдгрд╛. 4K рдЖрдХреГрддреНрдпрд╛рдВрд╕рд╣ рдмреЛрдирд╕ рд╕рдЦреЛрд▓ рдЕрднреНрдпрд╛рд╕: docs/under-the-hood.md.

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

рдЗрддрдХрд╛ рд╡реЗрд│ рддреБрдореНрд╣реА "рд╢рд╛рд│реЗрд╢реА" рдмреЛрд▓рдд рд╣реЛрддрд╛ тАФ рдкрдг рддреА рдЦрд░реЛрдЦрд░ рдЪрд╛рд▓рд╡рддреЗ рдХреЛрдг? рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдд ЁЯПв рдЬрд╛ рдЖрдгрд┐ рдХрд░реНрдордЪрд╛рд▒реНрдпрд╛рдВрдирд╛ рднреЗрдЯрд╛:

рд╕рдВрдкреВрд░реНрдг course рдордзреНрдпреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЬрд╛рдгрд╡рд▓реЗрд▓реА рдЬрд╛рджреВ тАФ self-healing, autoscaling, rollouts тАФ рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд рд╣реЗ рдкрд╛рдЪ рдЬрдг, рдПрдХрдЪ рдиреЛрдВрджрд╡рд╣реА рд╕рддрдд рд╡рд╛рдЪрдд рдЖрдгрд┐ рд▓рд┐рд╣рд┐рдд. рдХреЛрдгрддреАрд╣реА рдЬрд╛рджреВ рдирд╛рд╣реА. ЁЯкДтЭМ

ЁЯЧ║я╕П рдЖрдХреГрддреА тАФ kubectl apply рдЦрд░реЛрдЦрд░ рдХрд╛рдп рдХрд░рддреЗ

sequenceDiagram
    participant You as ЁЯзС kubectl apply
    participant API as ЁЯзСтАНЁЯТ╝ API server
    participant E as ЁЯУЦ etcd
    participant CM as ЁЯФН controllers
    participant S as ЁЯЧУя╕П scheduler
    participant KL as ЁЯзСтАНЁЯПл kubelet on node
    You->>API: "I wish: Deployment, 2 replicas"
    API->>E: write the wish
    CM->>API: sees Deployment тЖТ creates ReplicaSet тЖТ creates 2 Pods, unassigned
    S->>API: sees unassigned pods тЖТ picks best node for each
    KL->>API: "anything for my node?" тЖТ yes!
    KL->>KL: pull image ЁЯН▒, start container, run probes ЁЯЩЛ
    KL->>API: "running & ready" тЖТ written to etcd
    Note over You,KL: kubectl get pods now shows 2/2 Running ЁЯОЙ

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

ЁЯдФ рдХрд╛

рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рддрд▓реНрдпрд╛ рдХрд░реНрдордЪрд╛рд▒реНрдпрд╛рдВрдЪреА рдХрд╛рд│рдЬреА рддреБрдореНрд╣реА рдХрд╛ рдХрд░рд╛рд╡реА? рдХрд╛рд░рдг рдЖрддрд╛ рддреБрдореНрд╣реА рдкрд╛рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрддрдирд╛рдЪреЗ рдпрд╛рдВрддреНрд░рд┐рдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЖрд╣реЗ тАФ рдЖрдгрд┐ debugging рдЕрдВрджрд╛рдЬ рди рд░рд╛рд╣рддрд╛ рддрд░реНрдХ рдмрдирддреЗ:

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

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

kubectl get nodes -o wide                      # the classroom machines
kubectl -n kube-system get pods                # office staff & helpers you can see
kubectl get --raw /healthz && echo             # ask the principal directly: "ok"

# Watch the office gossip live while you break something (lesson 03 chaos):
kubectl -n school get events -w
# in another terminal:  kubectl -n school delete pod -l app=school-api --wait=false
# тЖТ watch: killing тЖТ SuccessfulCreate тЖТ Scheduled тЖТ Pulled тЖТ Started. The whole office, on record.

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

kubectl get events ┬╖ kubectl get componentstatuses ┬╖ kubectl api-resources

ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L13 (рдЬреНрдпрд╛ рдкрд░рд┐рд╕рд░рд╛рдд рд╣реА рдХрд╛рд░реНрдпрд╛рд▓рдпреЗ рдЙрднреА рдЖрд╣реЗрдд)

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

kubectl get events --sort-by=.lastTimestamp -n school рдирд╡реНрдпрд╛ pod рд╕рд╛рдареА Scheduled тЖТ Pulled тЖТ Created тЖТ Started рдпрд╛рдЪ рдХреНрд░рдорд╛рдиреЗ рджрд╛рдЦрд╡рддреЗ.

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

рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА тАФ рддреБрдореНрд╣реА рдлрдХреНрдд рд╡рд╛рдЪрд▓реЗ

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

ЁЯОУ рддреБрдореНрд╣реА рдХрд░реВрди рджрд╛рдЦрд╡рд▓реЗ!

рдЖрддрд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣реАрдд рдЖрд╣реЗ: containers тЖТ pods тЖТ deployments тЖТ services тЖТ namespaces тЖТ config рдЖрдгрд┐ secrets тЖТ probes тЖТ resources тЖТ autoscaling тЖТ ingress тЖТ rollouts тЖТ storage тЖТ control plane. рд╣реЗ "рдирд╡рд╢рд┐рдХреНрдпрд╛рдВрдЪреЗ Kubernetes" рдирд╛рд╣реА тАФ рд╣реА platform engineer рдЪреА рдХрд╛рдорд╛рдЪреА рд╢рдмреНрджрд╕рдВрдкрджрд╛ рдЖрд╣реЗ.

рдкреБрдвреЗ рдХреБрдареЗ рдЬрд╛рдпрдЪреЗ, рдпрд╛рдЪ repo рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди:

  1. рд╕рдЧрд│реЗ local рд▓рд╛ рдЪрд╛рд▓рд╡рд╛: docker compose up, рдордЧ minikube + manifests.
  2. рдЦрд▒реНрдпрд╛ cloud рд╡рд░ рдЬрд╛: terraform/ тЖТ terraform apply тЖТ .circleci/config.yml рджреНрд╡рд╛рд░реЗ deploy рдХрд░рд╛ (тЪая╕П рдЦрд░реЗ рдкреИрд╕реЗ рд▓рд╛рдЧрддрд╛рдд тАФ рддреНрдпрд╛рдЪ рджрд┐рд╡рд╢реА terraform destroy рдХрд░рд╛!).
  3. Production design doc рд╡рд╛рдЪрд╛: docs/architecture.html тАФ 100 рд╢рд╛рд│рд╛рдВрд╕рд╛рдареА multi-tenancy, рддреБрдореНрд╣реА рдЖрддреНрддрд╛ рд╢рд┐рдХрд▓реЗрд▓реНрдпрд╛ рд╕рдЧрд│реНрдпрд╛рд╡рд░ рдЙрднреА.
  4. рдмреЛрдирд╕ рдзрдбрд╛ тАФ рд╣рд╛рддрд╛рдиреЗ deploy рдХрд░рдгреЗ рдерд╛рдВрдмрд╡рд╛; рдкреНрд░рддреНрдпреЗрдХ git push robots рдирд╛ рдкрд╛рдард╡реВ рджреНрдпрд╛:
git checkout lesson-14-deploy-gitops   # CI/CD pipelines + GitOps with ArgoCD ЁЯдЦ

ЁЯПв Lesson 13 тАФ Under the hood: the school office

ЁЯУН You are here: Lesson 13 of 13 ┬╖ Previous: lesson-12-storage ┬╖ Bonus next: lesson-14-deploy-gitops


ЁЯУж What's in this branch

All 13 lessons тАФ this branch is the complete course. The finale: the control plane тАФ the machinery that made every previous lesson actually happen. Bonus deep-dive with 4K diagrams: docs/under-the-hood.md.

ЁЯзТ Explain like I'm 5

All this time you've been talking to "the school" тАФ but who actually RUNS it? Walk into the school office ЁЯПв and meet the staff:

The magic you've felt all course тАФ self-healing, autoscaling, rollouts тАФ is just these five, endlessly reading and writing one register. No magic. ЁЯкДтЭМ

ЁЯЧ║я╕П Diagram тАФ what kubectl apply really does

sequenceDiagram
    participant You as ЁЯзС kubectl apply
    participant API as ЁЯзСтАНЁЯТ╝ API server
    participant E as ЁЯУЦ etcd
    participant CM as ЁЯФН controllers
    participant S as ЁЯЧУя╕П scheduler
    participant KL as ЁЯзСтАНЁЯПл kubelet on node
    You->>API: "I wish: Deployment, 2 replicas"
    API->>E: write the wish
    CM->>API: sees Deployment тЖТ creates ReplicaSet тЖТ creates 2 Pods, unassigned
    S->>API: sees unassigned pods тЖТ picks best node for each
    KL->>API: "anything for my node?" тЖТ yes!
    KL->>KL: pull image ЁЯН▒, start container, run probes ЁЯЩЛ
    KL->>API: "running & ready" тЖТ written to etcd
    Note over You,KL: kubectl get pods now shows 2/2 Running ЁЯОЙ

тЭУ What

ЁЯдФ Why

Why should you care about the office staff? Because now every behavior you've seen has a mechanical explanation тАФ and debugging becomes deduction, not guessing:

ЁЯФз How (in this repo)

ЁЯзк Try it

kubectl get nodes -o wide                      # the classroom machines
kubectl -n kube-system get pods                # office staff & helpers you can see
kubectl get --raw /healthz && echo             # ask the principal directly: "ok"

# Watch the office gossip live while you break something (lesson 03 chaos):
kubectl -n school get events -w
# in another terminal:  kubectl -n school delete pod -l app=school-api --wait=false
# тЖТ watch: killing тЖТ SuccessfulCreate тЖТ Scheduled тЖТ Pulled тЖТ Started. The whole office, on record.

ЁЯФз kubectl for this lesson

kubectl get events ┬╖ kubectl get componentstatuses ┬╖ kubectl api-resources

ЁЯФЧ Builds on: ЁЯкк AWS L13 (the campus these offices stand in)

тЬЕ Verify тАФ what you should see

kubectl get events --sort-by=.lastTimestamp -n school shows Scheduled тЖТ Pulled тЖТ Created тЖТ Started for a new pod, in that order.

ЁЯз╣ Clean up

nothing тАФ you only read

тЪая╕П Common mistakes

ЁЯОУ You made it!

You now know: containers тЖТ pods тЖТ deployments тЖТ services тЖТ namespaces тЖТ config & secrets тЖТ probes тЖТ resources тЖТ autoscaling тЖТ ingress тЖТ rollouts тЖТ storage тЖТ the control plane. That's not "beginner Kubernetes" тАФ that's the working vocabulary of a platform engineer.

Where to go next, using this very repo:

  1. Run it all locally: docker compose up, then minikube + the manifests.
  2. Go to the real cloud: terraform/ тЖТ terraform apply тЖТ deploy via .circleci/config.yml (тЪая╕П costs real money тАФ terraform destroy the same day!).
  3. Read the production design doc: docs/architecture.html тАФ multi-tenancy for 100 schools, built on everything you just learned.
  4. Bonus lesson тАФ stop deploying by hand; let robots ship every git push:
git checkout lesson-14-deploy-gitops   # CI/CD pipelines + GitOps with ArgoCD ЁЯдЦ
тЖР PreviousstorageNext тЖТdeploy gitops

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