Wednesday, February 25, 2026

Kubernetes request flow

 Let’s explain the super beginner level, with clear analogy, simple flow, and easy memory tricks.


🧠 Big Picture First (Overview)

When you create a Pod, Kubernetes must decide:

👉 “On which worker machine should this Pod run?”

That decision is made by the Scheduler.


🏫 Beginner Analogy: School Classroom Example

Imagine:

  • 🧑‍🎓 Pod = A student

  • 🏫 Node = A classroom

  • 👨‍🏫 Scheduler = School principal

  • 📋 API Server = School office register

When a new student joins:

  1. Student arrives (Pod created).

  2. Student has no classroom yet (nodeName = empty).

  3. Principal checks:

    • Which classrooms have space?

    • Any classroom restricted?

    • Any special requirement?

  4. Principal assigns best classroom.

  5. Office writes it in register (Binding).

That’s it. That’s Kubernetes scheduling.


🔁 Real Kubernetes Flow (Simple Version)

Step 1 — You create a Pod

kubectl apply -f pod.yaml

Pod is stored in cluster database (etcd).


Step 2 — Pod has no node

Inside Pod object:

nodeName: ""

Meaning:

“I don’t know where to run yet.”


Step 3 — Scheduler sees this

Scheduler constantly watches for:

Pods with nodeName empty.

When it finds one, it starts thinking:

“Which node can run this pod?”


🧠 What Does Scheduler Check? (Filters Phase)

Think of this as elimination round.


1️⃣ CPU & Memory Check

Beginner analogy:

Student needs 2 seats.
Classroom must have 2 free seats.

If Pod requests:

resources:
requests:
cpu: 500m
memory: 256Mi

Scheduler checks:

  • Does node have that much free CPU?

  • Does node have that much free memory?

If NO → reject node ❌
If YES → keep node ✅


2️⃣ Taints & Tolerations

Analogy:

Some classrooms have a board:

🚫 “Only Science students allowed”

That’s a taint.

If a student doesn’t have matching permission (toleration),
he cannot enter.

Node has:

kubectl taint nodes node1 dedicated=ml:NoSchedule

Pod must have:

tolerations:
- key: "dedicated"
value: "ml"
effect: "NoSchedule"

Otherwise → rejected ❌


3️⃣ nodeSelector / Affinity

Analogy:

Student says:

“I want only AC classroom.”

Node label:

disktype=ssd

Pod:

nodeSelector:
disktype: ssd

If node doesn't match → rejected ❌

Affinity is smarter version:

  • Required → Must match

  • Preferred → Try to match


4️⃣ Topology Constraints

Analogy:

School rule:

“Don’t put all students in one building.”

In real world:
Don’t put all Pods in one zone.

Example:

topologySpreadConstraints:
topologyKey: topology.kubernetes.io/zone

Scheduler tries to spread Pods across zones.


🧮 After Filtering

Now scheduler has:

👉 List of nodes that CAN run the Pod.


⭐ Scoring Phase (Picking Best Node)

Now scheduler asks:

“Among possible nodes, which one is BEST?”

It scores based on:

  • Less loaded node

  • Better spread

  • Preferred affinity match

Highest score wins 🏆


📝 Final Step — Binding

Scheduler writes decision via API Server:

Pod → node1

Now inside Pod:

nodeName: node1

This is called Binding.


🚀 After Binding

Now:

  1. Kubelet on node1 sees the Pod.

  2. Pulls container image.

  3. Starts container.

  4. Pod becomes Running.

Scheduler’s job is done.


📦 Full Flow (End-to-End Overview)

You create Pod

API Server stores Pod

nodeName = empty

Scheduler sees unscheduled Pod

Filter nodes:
- CPU/Mem?
- Taints?
- nodeSelector?
- Affinity?
- Topology?

Remaining nodes

Score nodes

Pick best

Write Binding (Pod → Node)

Kubelet runs container

🧠 Memory Trick (Very Important)

Think:

Filter → Score → Bind → Run

Or even shorter:

Can it run? → Where best? → Assign → Start


🎯 Ultra Simple One-Line Definition

Scheduler = Brain that decides where a Pod should run based on rules and resources.

======================================================================

Now let’s continue exactly from where scheduler finished — beginner level, simple analogies, clear flow, same style.

We start from:

✅ Scheduler has written: nodeName: node1

Now what happens next?


🏫 Same School Analogy (Continue Story)

Earlier:

  • 👨‍🏫 Principal (Scheduler) assigned student to classroom (node1)

  • 📋 Office wrote it in register (Binding)

Now:

👩‍🏫 Classroom teacher (Kubelet) sees new student assigned.

Teacher prepares everything and makes student sit.

That is what Kubelet does.


🔁 Real Kubernetes Flow (After Binding)


🟢 Step 1 — Kubelet on node1 sees the Pod

Each node runs a process called:

👉 Kubelet

Kubelet constantly asks API Server:

“Are there any Pods assigned to me?”

When scheduler sets:

nodeName: node1

Kubelet on node1 detects:

“Oh! I need to run this Pod.”


Beginner analogy:

Teacher checks attendance register.

Sees:

New student assigned to my classroom.


🟢 Step 2 — Kubelet Checks the Container Image

Pod definition contains:

containers:
- name: app
image: nginx:1.27

Kubelet now checks:

“Do I already have this image on my machine?”

If not…

It asks the Container Runtime (Docker / containerd):

“Please download this image.”


Analogy:

Student needs a textbook.

Teacher checks:

  • If book already in class → use it

  • If not → order from library (Docker Hub)


🟢 Step 3 — Pulling the Container Image

Container runtime contacts:

  • Docker Hub

  • ECR

  • GCR

  • Any private registry

Downloads image layers.

If imagePullPolicy is:

  • Always → always download

  • IfNotPresent → only if not local

  • Never → don’t download


🟢 Step 4 — Creating the Container

Now Kubelet says:

“Start container using this image.”

Container runtime:

  1. Creates container sandbox

  2. Sets up networking

  3. Mounts volumes

  4. Applies CPU/memory limits

  5. Starts container process


Analogy:

Teacher:

  • Gives student a seat (CPU/memory)

  • Gives notebook (volume)

  • Connects to classroom network

  • Tells student to start writing


🟢 Step 5 — Networking Setup

Kubernetes gives Pod:

  • IP address

  • Connects to cluster network

Each Pod gets:

Its own IP inside cluster


Analogy:

Student gets:

  • Roll number

  • Desk number

  • Connected to classroom group


🟢 Step 6 — Health Checks Begin

If Pod has:

livenessProbe:
readinessProbe:

Kubelet starts checking:

  • Is container alive?

  • Is container ready to accept traffic?

If probe fails:

  • Restart container (if needed)


🟢 Step 7 — Pod Status Changes

Initially:

Pending

After container starts:

ContainerCreating

Then:

Running

API Server updates status.

Now kubectl get pods shows:

demo-pod Running

🧠 Full Flow From Binding to Running

Scheduler assigns node

API Server updates Pod (nodeName set)

Kubelet on that node detects Pod

Check image locally

Pull image (if needed)

Create container

Setup network + volumes

Apply CPU/Mem limits

Start container process

Run health checks

Pod status = Running

🔥 Who Does What (Clear Separation)

ComponentResponsibility
SchedulerDecides WHERE Pod runs
API ServerStores decision
KubeletActually runs the Pod
Container RuntimeCreates container
etcdStores cluster state

🧠 Memory Trick

Think:

Scheduler = Brain 🧠
Kubelet = Worker 👷
Container Runtime = Machine 🏭

Brain decides → Worker executes → Machine builds


🎯 One-Line Definition

Scheduler assigns the Pod, Kubelet brings it to life.


💡 Very Important Production Understanding

Scheduler’s job is finished after binding.

If container crashes:

👉 Scheduler is NOT involved.

Kubelet restarts it.

If node dies:

👉 Controller creates new Pod
👉 Scheduler schedules again


========================================================================

Now we complete the FULL Kubernetes Pod Life Cycle — from creation → running → scaling → failure → termination → deletion.

I’ll explain:

  • Beginner level

  • Clear analogies

  • Step-by-step flow

  • Complete lifecycle


🌱 FULL POD LIFE CYCLE (Simple Overview)

Create → Schedule → Start → Running → Serving
→ Scaling → Failure Handling → Termination → Deleted

🏫 Master Analogy: Student Full School Life

Pod = Student
Node = Classroom
Scheduler = Principal
Kubelet = Teacher
Controller = School Management

We already covered:

✔ Principal assigns classroom
✔ Teacher starts class

Now let’s continue full life.


🟢 PHASE 1 — Running & Serving Traffic

Once Pod becomes Running:

  • It gets IP

  • It joins Service (if defined)

  • It can receive traffic

If behind a Service:

Client → Service → Pod IP

Analogy:

Student is now attending class and answering questions.


🟢 PHASE 2 — Readiness & Liveness Monitoring

Kubelet keeps checking:

🟢 Liveness Probe

"Is student alive?"

If fails → restart container.

🟢 Readiness Probe

"Is student ready to answer?"

If fails → stop sending traffic (but don’t restart).


🟢 PHASE 3 — Scaling Happens

If Deployment has:

replicas: 3

Controller ensures 3 Pods always exist.

If traffic increases:

  • HPA (Horizontal Pod Autoscaler) increases replicas

Flow:

More CPU usage

HPA increases replicas

New Pods created

Scheduler schedules them

Analogy:

More students enroll → school opens more classrooms.


🟢 PHASE 4 — Pod Crash Scenario

If container crashes:

  • Kubelet detects exit

  • Restarts container (based on restartPolicy)

RestartPolicy options:

  • Always

  • OnFailure

  • Never

Important:

Scheduler NOT involved.

Analogy:

Student faints → teacher wakes him up.


🟢 PHASE 5 — Node Failure Scenario

If entire node crashes:

  • Node becomes NotReady

  • Controller detects Pods unavailable

  • New Pods created

  • Scheduler reschedules to other nodes

Analogy:

Entire classroom building collapses → principal assigns new classrooms.


🟢 PHASE 6 — Rolling Update (Deployment)

When you update image:

image: nginx:1.28

Deployment does:

  1. Create new Pod

  2. Wait until ready

  3. Delete old Pod

  4. Continue gradually

This is:

👉 Zero downtime deployment


🟢 PHASE 7 — Pod Termination

When Pod is deleted:

kubectl delete pod demo

Flow:

  1. API server marks Pod as "Terminating"

  2. Kubelet sends SIGTERM to container

  3. Waits for terminationGracePeriodSeconds (default 30 sec)

  4. Container stops

  5. Pod removed


SIGTERM vs SIGKILL

  • SIGTERM → polite shutdown

  • SIGKILL → forced kill


Analogy:

Teacher tells student:

“Class over, pack and leave.”

Waits 30 seconds.
If student doesn’t leave → force remove.


🟢 PHASE 8 — PreStop Hook (Optional)

Pod can define:

lifecycle:
preStop:
exec:
command: ["sleep", "10"]

Used for:

  • Finish requests

  • Close connections

  • Save state


🟢 PHASE 9 — Pod Deleted

After termination:

  • Removed from etcd

  • Removed from Service endpoints

  • Gone from cluster


🟢 PHASE 10 — Garbage Collection

If controlled by Deployment:

  • ReplicaSet ensures desired count maintained

If standalone Pod:

  • Fully gone


🔁 COMPLETE FLOW (Full Technical Diagram)

kubectl apply

API Server

Pod created (Pending)

Scheduler assigns node

Kubelet pulls image

Container starts

Pod Running

Readiness OK

Serving traffic

Scaling / Restart / Monitoring

Crash? → Restart

Node fail? → Reschedule

Update? → Rolling update

Delete? → SIGTERM → Grace period

Pod terminated

Removed from cluster

📊 Pod Status Lifecycle States

PhaseMeaning
PendingWaiting for scheduling
ContainerCreatingPulling image
RunningContainer active
SucceededCompleted successfully
FailedError
TerminatingBeing deleted


Configuring Java and Maven

  1️⃣ Configure Java Environment Open the Java environment file. sudo vi /etc/profile.d/java.sh Add these lines inside the file: expor...