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

ЁЯкС рдзрдбрд╛ 02 тАФ Pods: рд╢рд╛рд│реЗрддрд▓рд╛ рдПрдХ рдмрд╛рдХ

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-01-containers ┬╖ рдкреБрдврдЪрд╛: lesson-03-deployments


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

рдзрдбрд╛ 01 рдордзрд▓реЗ рд╕рдЧрд│реЗ, рдЖрдгрд┐ рд╣рд╛ рдзрдбрд╛: Pod тАФ Kubernetes рдЪрд╛рд▓рд╡рдд рдЕрд╕рд▓реЗрд▓реА рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди рдЧреЛрд╖реНрдЯ. рдпрд╛ рдзрдбреНрдпрд╛рдд рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рдЦрд▒реНрдпрд╛ files:

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

рд╢рд╛рд│реЗрдд рддреБрдореНрд╣реА рдХрдзреАрдЪ рд╣рд╡реЗрдд рддрд░рдВрдЧрдд рдирд╛рд╣реА тАФ рддреБрдореНрд╣реА рдмрд╛рдХрд╛рд╡рд░ ЁЯкС рдмрд╕рддрд╛. рдмрд╛рдХ рддреБрдореНрд╣рд╛рд▓рд╛ рдЬрд╛рдЧрд╛ рджреЗрддреЛ: рддреБрдордЪреА рдЦреБрд░реНрдЪреА, рддреБрдордЪреНрдпрд╛ рдирд╛рд╡рд╛рдЪреА рдкрд╛рдЯреА, рддреБрдордЪреА рдЫреЛрдЯреА рдлрд│реА. рдХрдзреА рдХрдзреА рджреЛрди рдЬрд┐рд╡рд▓рдЧ рдореИрддреНрд░рд┐рдгреА рдПрдХрд╛рдЪ рджреБрд╣реЗрд░реА рдмрд╛рдХрд╛рд╡рд░ рдмрд╕рддрд╛рдд рдЖрдгрд┐ рд▓рдЧреЗрдЪ рдПрдХрдореЗрдХреАрдВрдЪреНрдпрд╛ рдХрд╛рдирд╛рдд рдХреБрдЬрдмреБрдЬреВ рд╢рдХрддрд╛рдд.

Pod рдореНрд╣рдгрдЬреЗ рддреБрдордЪреНрдпрд╛ container рд╕рд╛рдареАрдЪрд╛ рдмрд╛рдХ. Kubernetes рдХрдзреАрдЪ container рдереЗрдЯ рдЪрд╛рд▓рд╡рдд рдирд╛рд╣реА тАФ рддреЛ рдЖрдзреА рддреНрдпрд╛рд▓рд╛ рдиреЗрд╣рдореА рдПрдХ рдмрд╛рдХ рджреЗрддреЛ. рддреНрдпрд╛ рдмрд╛рдХрд╛рдХрдбреЗ рдЕрд╕рддреЗ:

рдЖрдгрд┐ рдЖрддрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рднрд╛рдЧ: рдмрд╛рдХ рдмрджрд▓рддрд╛ рдпреЗрддрд╛рдд. рддреБрдордЪрд╛ рдмрд╛рдХ рддреБрдЯрд▓рд╛ рддрд░ рд╢рд╛рд│рд╛ рддреЛ рджреБрд░реБрд╕реНрдд рдХрд░рдд рдирд╛рд╣реА тАФ рддреЛ рдлреЗрдХреВрди рджреЗрддреЗ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд╡реНрдпрд╛ рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдкрд╛рдЯреАрд╕рд╣ рдирд╡рд╛ рдмрд╛рдХ рджреЗрддреЗ. Pods рдкрдг рддрд╕реЗрдЪ рдЖрд╣реЗрдд: рддреЗ cattle рдЖрд╣реЗрдд, pets рдирд╛рд╣реАрдд. рддреЗ рдпреЗрддрд╛рдд рдЖрдгрд┐ рдЬрд╛рддрд╛рдд; рдХреЛрдгреА рд░рдбрдд рдирд╛рд╣реА.

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

flowchart TB
    subgraph pod["ЁЯкС Pod - one desk, IP 10.0.4.7"]
        direction LR
        c1["ЁЯУж main container<br/>school-api"]
        c2["ЁЯУж optional sidecar<br/>e.g. log collector"]
        v["ЁЯЧДя╕П shared shelf<br/>volume"]
        c1 --- v
        c2 --- v
    end
    net["ЁЯМР Cluster network"] -->|"talks to the desk,<br/>not the kid"| pod

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

ЁЯдФ рдХрд╛

Containers рдереЗрдЯ рдХрд╛ рдЪрд╛рд▓рд╡реВ рдирдпреЗрдд? рдХрд╛рд░рдг рдХреЛрдгрддреНрдпрд╛рд╣реА container рд▓рд╛ IP, storage, health-checking рдЖрдгрд┐ machine рд╡рд░ рдЬрд╛рдЧрд╛ рджреЗрдгреНрдпрд╛рд╕рд╛рдареА Kubernetes рд▓рд╛ рдПрдХ рд╕рдорд╛рди рдЖрд╡рд░рдг рд╣рд╡реЗ. Pod рд╣реЗрдЪ рддреЗ рдЖрд╡рд░рдг тАФ рдкреНрд░рддреНрдпреЗрдХ program рдЬреНрдпрд╛рд╡рд░ рдмрд╕рддреЛ рддреЛ рдард░рд▓реЗрд▓рд╛ рдмрд╛рдХ, рдЬреНрдпрд╛рдореБрд│реЗ рд╢рд╛рд│рд╛ Node.js app рдЖрдгрд┐ Python app рдЕрдЧрджреА рдПрдХрд╛рдЪ рдкрджреНрдзрддреАрдиреЗ рд╕рд╛рдВрднрд╛рд│реВ рд╢рдХрддреЗ.

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

рдЖрдкрдг рдХрдзреАрдЪ рд╕реНрд╡рддрдВрддреНрд░ Pod file рд▓рд┐рд╣рд┐рдд рдирд╛рд╣реА тАФ рдЖрдгрд┐ рд╣рд╛рдЪ рдПрдХ рдЦрд░рд╛ рдзрдбрд╛ рдЖрд╣реЗ: k8s/deployment.yaml рдордзреНрдпреЗ template: рдЦрд╛рд▓рдЪрд╛ рднрд╛рдЧ рд╣рд╛рдЪ pod рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ рдЖрд╣реЗ:

template:              # тЖР the pod blueprint ("desk design")
  metadata:
    labels:
      app: school-api  # тЖР sticker on the desk (lesson 03 explains why)
  spec:
    containers:
      - name: school-api
        image: IMAGE_PLACEHOLDER
        ports:
          - containerPort: 3000

Deployment (рдзрдбрд╛ 03) рдпрд╛ design рд╡рд░реВрди рдмрд╛рдХ рддрдпрд╛рд░ рдХрд░рддреЛ.

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

рдХреЛрдгрддреНрдпрд╛рд╣реА local cluster рд╕реЛрдмрдд (Docker Desktop рдордзрд▓реЗ built-in Kubernetes, minikube start, рдХрд┐рдВрд╡рд╛ kind create cluster):

# Run a single throwaway pod by hand тАФ the ONLY time you'll do this manually:
kubectl run hello --image=nginx --restart=Never

kubectl get pods -o wide     # see its IP and which node it sits on
kubectl describe pod hello   # the pod's full report card
kubectl delete pod hello     # throw the desk away тАФ and notice:
kubectl get pods             # ...nothing brings it back. That's lesson 03's job.

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

kubectl get pods ┬╖ kubectl describe pod ┬╖ kubectl logs ┬╖ kubectl exec -it POD -- sh

ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L07 (node рдореНрд╣рдгрдЬреЗ рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрддрд▓реЗрд▓рд╛ рдмрд╛рдХ)

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

kubectl get pods -n school рдордзреНрдпреЗ Running 1/1 рджрд┐рд╕рддреЗ; kubectl get pod POD -o wide рддреНрдпрд╛рдЪрд╛ IP рджрд╛рдЦрд╡рддреЗ.

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

kubectl delete pod POD тАФ рдПрдХрдЯрд╛ (controller рд╢рд┐рд╡рд╛рдпрдЪрд╛) pod рдкреБрдиреНрд╣рд╛ рддрдпрд╛рд░ рд╣реЛрдд рдирд╛рд╣реА (рддреЗ рдзрдбрд╛ 03 рдЪреЗ рдХрд╛рдо рдЖрд╣реЗ)

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

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

рдорд░рдгрд╛рд░рд╛ рдПрдХрдЯрд╛ pod рдореЗрд▓реЗрд▓рд╛рдЪ рд░рд╛рд╣рддреЛ. рдпреЛрдЧреНрдп рд╕рдВрдЦреНрдпреЗрдиреЗ рдмрд╛рдХ рдиреЗрд╣рдореА рдЬрд┐рд╡рдВрдд рдХреЛрдг рдареЗрд╡рддреЛ? Deployment тАФ рдХрдбрдХ рд╡рд░реНрдЧ-рдкреНрд░рдореБрдЦ.

git checkout lesson-03-deployments

ЁЯкС Lesson 02 тАФ Pods: one school desk

ЁЯУН You are here: Lesson 02 of 13 ┬╖ Previous: lesson-01-containers ┬╖ Next: lesson-03-deployments


ЁЯУж What's in this branch

Everything from lesson 01, plus this lesson: the Pod тАФ the smallest thing Kubernetes ever runs. Real files this lesson uses:

ЁЯзТ Explain like I'm 5

In school, you never just float in the air тАФ you sit at a desk ЁЯкС. The desk gives you a place: your chair, your name tag, your little shelf. Sometimes two best friends share one double desk and can whisper to each other instantly.

A Pod is a desk for your container. Kubernetes never runs a container directly тАФ it always gives it a desk first. The desk has:

And here's the important part: desks are replaceable. If your desk breaks, the school doesn't repair it тАФ it throws it away and gives you a new desk with a new name tag. Pods are the same: they are cattle, not pets. They come and go; nobody cries.

ЁЯЧ║я╕П Diagram

flowchart TB
    subgraph pod["ЁЯкС Pod - one desk, IP 10.0.4.7"]
        direction LR
        c1["ЁЯУж main container<br/>school-api"]
        c2["ЁЯУж optional sidecar<br/>e.g. log collector"]
        v["ЁЯЧДя╕П shared shelf<br/>volume"]
        c1 --- v
        c2 --- v
    end
    net["ЁЯМР Cluster network"] -->|"talks to the desk,<br/>not the kid"| pod

тЭУ What

ЁЯдФ Why

Why not run containers directly? Because Kubernetes needs one common wrapper to give any container an IP, storage, health-checking and a place on a machine. The Pod is that wrapper тАФ the standard desk every program sits at, so the school can manage a Node.js app and a Python app the exact same way.

ЁЯФз How (in this repo)

We never write a standalone Pod file тАФ and that's a real lesson in itself: in k8s/deployment.yaml the section under template: is the pod blueprint:

template:              # тЖР the pod blueprint ("desk design")
  metadata:
    labels:
      app: school-api  # тЖР sticker on the desk (lesson 03 explains why)
  spec:
    containers:
      - name: school-api
        image: IMAGE_PLACEHOLDER
        ports:
          - containerPort: 3000

The Deployment (lesson 03) stamps out desks from this design.

ЁЯзк Try it

With any local cluster (Docker Desktop's built-in Kubernetes, minikube start, or kind create cluster):

# Run a single throwaway pod by hand тАФ the ONLY time you'll do this manually:
kubectl run hello --image=nginx --restart=Never

kubectl get pods -o wide     # see its IP and which node it sits on
kubectl describe pod hello   # the pod's full report card
kubectl delete pod hello     # throw the desk away тАФ and notice:
kubectl get pods             # ...nothing brings it back. That's lesson 03's job.

ЁЯФз kubectl for this lesson

kubectl get pods ┬╖ kubectl describe pod ┬╖ kubectl logs ┬╖ kubectl exec -it POD -- sh

ЁЯФЧ Builds on: ЁЯкк AWS L07 (a node is a rented desk)

тЬЕ Verify тАФ what you should see

kubectl get pods -n school shows Running 1/1; kubectl get pod POD -o wide shows its IP.

ЁЯз╣ Clean up

kubectl delete pod POD тАФ a bare pod is NOT recreated (that's lesson 03's job)

тЪая╕П Common mistakes

тПня╕П Next

A lone pod that dies stays dead. Who keeps the right number of desks alive at all times? The Deployment тАФ the strict class monitor.

git checkout lesson-03-deployments
тЖР PreviouscontainersNext тЖТdeployments

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