Nextgen Blog
HomeLearnAIQuantumRoboticsSecuritySpaceAbout
Nextgen Blog

By Anubhav — full stack engineer, IIT Mandi CSE. Deep dives into AI, software engineering, and the technologies shaping the next generation of tech.

Navigate

  • Home
  • Learn
  • Blog
  • Archive
  • About

Topics

  • Artificial Intelligence
  • Quantum Computing
  • Robotics
  • Cybersecurity
  • Space Tech

Connect

Built with ❤️ & By - Anubhav

© 2026 Nextgen Blog by Anubhav. All rights reserved.

Privacy PolicyTerms of Service
Phase 03 · Networking & ScalingChapter 18 of 33
17.
Phase 03Read time ~16 minDifficulty intermediate

Kubernetes Scheduling

Warrior, now we reach one of the most important Kubernetes internals.

In this chapter
  • 01Kubernetes Scheduler
  • 02What Is the Kubernetes Scheduler?
  • 03The Basic Scheduling Flow
  • 04What Does "Unscheduled Pod" Mean?
  • 05Scheduler Doesn't Randomly Pick a Node
  • 06Scheduling Has Two Major Ideas
  • 07Step 1 — Filtering
  • 08Step 2 — Scoring
  • 09Resource Requests
  • 10Scheduler Uses Requests
  • 11nodeSelector
  • 12What Is a Node Label?
  • 13nodeSelector Example
  • 14What Happens If the Node Doesn't Exist?
  • 15Node Affinity
  • 16Required vs Preferred Affinity
  • 17Required
  • 18Preferred
  • 19Meaning of IgnoredDuringExecution
  • 20Node Affinity Example
  • 21Taints
  • 22Why Taints?
  • 23Tolerations
  • 24Taint vs Toleration
  • 25Taint Effects
  • 26NoSchedule
  • 27PreferNoSchedule
  • 28NoExecute
  • 29Taint + Toleration Example
  • 30Pod Affinity
  • 31Pod Anti-Affinity
  • 32Anti-Affinity
  • 33Example Pod Anti-Affinity
  • 34topologyKey
  • 35High Availability with Zones
  • 36Topology Spread Constraints
  • 37DoNotSchedule vs ScheduleAnyway
  • 38DoNotSchedule
  • 39ScheduleAnyway
  • 40Real-World Node.js Deployment
  • 41Scheduling Decision Example
  • 42Scheduler Decision Tree
  • 43Why Pods Sometimes Stay Pending
  • 44Insufficient CPU
  • 45Insufficient memory
  • 46Node selector mismatch
  • 47Node affinity mismatch
  • 48Taint without toleration
  • 49Topology constraints
  • 50Volume constraints
  • 51Debugging Scheduling
  • 52Useful Commands
  • 53cordon
  • 54drain
  • 55Cordon vs Drain
  • 56Scheduler vs Kubelet
  • 57Scheduler
  • 58Kubelet
  • 59Interview Questions
  • 60Q1. What is Kubernetes Scheduler?
  • 61Q2. Does scheduler start containers?
  • 62Q3. What is nodeSelector?
  • 63Q4. What is node affinity?
  • 64Q5. What is a taint?
  • 65Q6. What is a toleration?
  • 66Q7. Does toleration force a Pod onto a node?
  • 67Q8. What is pod anti-affinity?
  • 68Q9. What is topology spread?
  • 69Q10. What happens when no node can satisfy a Pod's requirements?
  • 70Remember:
  • 71Next → Chapter 18: Jobs & CronJobs
In this chapter (71 sections)
01Kubernetes Scheduler02What Is the Kubernetes Scheduler?03The Basic Scheduling Flow04What Does "Unscheduled Pod" Mean?05Scheduler Doesn't Randomly Pick a Node06Scheduling Has Two Major Ideas07Step 1 — Filtering08Step 2 — Scoring09Resource Requests10Scheduler Uses Requests11nodeSelector12What Is a Node Label?13nodeSelector Example14What Happens If the Node Doesn't Exist?15Node Affinity16Required vs Preferred Affinity17Required18Preferred19Meaning of IgnoredDuringExecution20Node Affinity Example21Taints22Why Taints?23Tolerations24Taint vs Toleration25Taint Effects26NoSchedule27PreferNoSchedule28NoExecute29Taint + Toleration Example30Pod Affinity31Pod Anti-Affinity32Anti-Affinity33Example Pod Anti-Affinity34topologyKey35High Availability with Zones36Topology Spread Constraints37DoNotSchedule vs ScheduleAnyway38DoNotSchedule39ScheduleAnyway40Real-World Node.js Deployment41Scheduling Decision Example42Scheduler Decision Tree43Why Pods Sometimes Stay Pending44Insufficient CPU45Insufficient memory46Node selector mismatch47Node affinity mismatch48Taint without toleration49Topology constraints50Volume constraints51Debugging Scheduling52Useful Commands53cordon54drain55Cordon vs Drain56Scheduler vs Kubelet57Scheduler58Kubelet59Interview Questions60Q1. What is Kubernetes Scheduler?61Q2. Does scheduler start containers?62Q3. What is nodeSelector?63Q4. What is node affinity?64Q5. What is a taint?65Q6. What is a toleration?66Q7. Does toleration force a Pod onto a node?67Q8. What is pod anti-affinity?68Q9. What is topology spread?69Q10. What happens when no node can satisfy a Pod's requirements?70Remember:71Next → Chapter 18: Jobs & CronJobs

You already know:

  • Deployment creates/manages Pods.
  • Service provides networking.
  • HPA increases/decreases Pods.
  • Cluster Autoscaler increases/decreases Nodes.

But one critical question remains:

When a Pod is created, how does Kubernetes decide which worker node should run it?

The answer is:

Kubernetes Scheduler#


1. What Is the Kubernetes Scheduler?#

The kube-scheduler is a control-plane component responsible for selecting a suitable node for Pods that don't already have a node assigned.

Think of it as a:

Job placement system

For example:

              Pod
               │
               ▼
          kube-scheduler
               │
       ┌───────┼────────┐
       ▼       ▼        ▼
     Node 1  Node 2   Node 3
       ❌       ✅       ❌
                │
                ▼
             Pod runs

The scheduler considers things such as:

  • CPU/memory requests
  • node availability
  • node selectors
  • affinity/anti-affinity
  • taints/tolerations
  • topology constraints
  • other scheduling rules

2. The Basic Scheduling Flow#

Suppose you create:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: app
      image: nginx

The flow is:

kubectl apply
      │
      ▼
API Server
      │
      ▼
Pod created
      │
      ▼
Pod has no node assigned
      │
      ▼
Scheduler
      │
      ▼
Find suitable nodes
      │
      ▼
Select node
      │
      ▼
Bind Pod to node
      │
      ▼
kubelet
      │
      ▼
Container starts

3. What Does "Unscheduled Pod" Mean?#

Initially, a Pod might look like:

NAME       READY   STATUS    NODE
my-app     0/1     Pending   <none>

Notice:

NODE = <none>

That means the scheduler hasn't assigned it to a node yet.

After scheduling:

NAME       READY   STATUS    NODE
my-app     1/1     Running   node-2

Now:

NODE = node-2

4. Scheduler Doesn't Randomly Pick a Node#

Beginners often think:

Pod → random node

That's incorrect.

The scheduler evaluates nodes against constraints.

Conceptually:

Pod
 │
 ▼
Can Node 1 run it?
 │
 ├── No
 │
Can Node 2 run it?
 │
 ├── Yes
 │
Can Node 3 run it?
 │
 ├── Yes
 │
 ▼
Rank suitable nodes
 │
 ▼
Choose a node

5. Scheduling Has Two Major Ideas#

A useful mental model is:

Filtering
    ↓
Scoring
    ↓
Selection

Step 1 — Filtering#

Remove nodes that cannot run the Pod.

Example:

5 Nodes
 
Node 1 → insufficient CPU ❌
Node 2 → wrong architecture ❌
Node 3 → nodeSelector mismatch ❌
Node 4 → suitable ✅
Node 5 → suitable ✅

Remaining:

Node 4
Node 5

Step 2 — Scoring#

Among feasible nodes, Kubernetes considers scheduling preferences and scores candidates.

Node 4 → score 70
Node 5 → score 85

Node 5 may be selected.

The actual scheduler framework has many plugins and details, but this filter → score → select model is an excellent way to understand it.


6. Resource Requests#

This connects directly to Chapters 13 and 16.

Suppose:

Node 1:
4 CPU

Existing workloads request:

3 CPU

Available allocatable capacity might only allow:

~1 CPU

Now your Pod requests:

resources:
  requests:
    cpu: "2"

Node 1 isn't suitable.

Pod requires 2 CPU
Node has insufficient allocatable capacity
        ↓
        ❌

Scheduler checks other nodes.


7. Scheduler Uses Requests#

This is extremely important:

Scheduling is primarily based on resource requests, not current real-time CPU usage.

Example:

Node:
8 CPU
 
Existing Pods:
Requests = 6 CPU
Actual usage = 2 CPU

New Pod:

Request = 3 CPU

Scheduler sees approximately:

6 + 3 = 9 CPU

So the Pod doesn't fit based on requested capacity, even though current observed usage might be only 2 CPU.


8. nodeSelector#

Now let's say you have:

Node 1 → general
Node 2 → general
Node 3 → gpu

You want your AI workload on GPU nodes.

You can label the node:

kubectl label node node-3 workload=gpu

Check:

kubectl get nodes --show-labels

Then Pod:

spec:
  nodeSelector:
    workload: gpu

Now:

Pod
 │
 └── workload=gpu
          │
          ▼
       Node 3

9. What Is a Node Label?#

A label is a key-value pair attached to a Kubernetes object.

Example:

workload=gpu
environment=production
team=payments
disk=ssd

Node:

node-3
labels:
  workload=gpu
  environment=production

You can inspect:

kubectl get nodes --show-labels

10. nodeSelector Example#

apiVersion: v1
kind: Pod
 
metadata:
  name: gpu-app
 
spec:
  nodeSelector:
    workload: gpu
 
  containers:
    - name: app
      image: my-ai-app:1.0

This means:

Only schedule this Pod onto nodes with workload=gpu.

If no suitable node exists:

Pod → Pending

11. What Happens If the Node Doesn't Exist?#

Suppose:

nodeSelector:
  workload: gpu

but your cluster has:

Node 1 → workload=general
Node 2 → workload=general

No GPU node.

Result:

Pod
 ↓
Scheduler
 ↓
No matching node
 ↓
Pending

This is why labels and scheduling rules must be designed carefully.


12. Node Affinity#

nodeSelector is simple.

For more expressive rules, Kubernetes provides:

Node Affinity

Example:

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: workload
              operator: In
              values:
                - gpu

This is more powerful than a simple nodeSelector.


13. Required vs Preferred Affinity#

This distinction is important.

Required#

Must satisfy this rule

Example:

requiredDuringSchedulingIgnoredDuringExecution:

If the condition isn't satisfied:

Pod → Pending

Preferred#

Prefer this node if possible

Example:

preferredDuringSchedulingIgnoredDuringExecution:

If preference can't be satisfied, Kubernetes can still schedule the Pod elsewhere if other requirements are met.

Think:

required = MUST
 
preferred = SHOULD

14. Meaning of IgnoredDuringExecution#

This phrase looks complicated:

requiredDuringSchedulingIgnoredDuringExecution

Break it down:

During scheduling
      ↓
Rule must be satisfied
 
During execution
      ↓
Changes to the node label don't necessarily evict the already-running Pod

So the rule primarily affects scheduling decisions.


15. Node Affinity Example#

Suppose you have:

Node 1 → zone=india-north
Node 2 → zone=india-west
Node 3 → zone=india-south

You want the application in:

india-north

You can use node affinity.

Conceptually:

Pod
 │
 ▼
nodeAffinity
 │
 ▼
zone=india-north
 │
 ▼
Node 1

16. Taints#

Now we get to one of the most important scheduling concepts:

Taints repel Pods from nodes.

Suppose you have a GPU node:

Node GPU-1

You don't want normal workloads accidentally using it.

You can taint it:

kubectl taint nodes gpu-1 workload=gpu:NoSchedule

Now:

Normal Pod
    │
    ▼
GPU Node
    │
    ▼
❌ Rejected

17. Why Taints?#

Imagine:

GPU node

GPU resources are expensive.

You want only AI workloads there.

Without protection:

Frontend Pod → GPU node ❌
Backend Pod → GPU node ❌
Redis Pod → GPU node ❌
AI Pod → GPU node ✅

Taint helps reserve the node.


18. Tolerations#

A Pod can be given permission to tolerate a taint.

Node:

workload=gpu:NoSchedule

Pod:

tolerations:
  - key: workload
    operator: Equal
    value: gpu
    effect: NoSchedule

Now:

GPU Node
   │
   │ taint
   ▼
workload=gpu
   │
   ▲
   │ toleration
AI Pod

The Pod is allowed to be considered for that node.


19. Taint vs Toleration#

Memorize this:

Taint is on the Node. Toleration is on the Pod.

Node
 ↓
Taint
 ↓
"Don't schedule ordinary Pods here."
 
Pod
 ↓
Toleration
 ↓
"I'm allowed to tolerate this taint."

But an important nuance:

A toleration allows a Pod to be scheduled onto a tainted node; it does not by itself force the Pod onto that node.

You may combine toleration with node affinity/selector if you want to both allow and target a specific node group.


20. Taint Effects#

There are three common taint effects:

NoSchedule
PreferNoSchedule
NoExecute

NoSchedule#

New Pods without matching tolerations won't be scheduled there.

New Pod
 ↓
No toleration
 ↓
❌

Existing Pods generally aren't automatically removed merely because this taint is added.


PreferNoSchedule#

Kubernetes tries to avoid placing Pods there, but it's a preference rather than a hard prohibition.

Think:

"Please avoid this node if possible."

NoExecute#

Stronger.

It can affect existing Pods that don't tolerate the taint and may cause them to be evicted.

Node gets NoExecute taint
       ↓
Existing incompatible Pod
       ↓
Evicted

21. Taint + Toleration Example#

Node:

kubectl taint nodes gpu-1 workload=gpu:NoSchedule

Pod:

apiVersion: v1
kind: Pod
 
metadata:
  name: ai-worker
 
spec:
  tolerations:
    - key: workload
      operator: Equal
      value: gpu
      effect: NoSchedule
 
  containers:
    - name: worker
      image: my-ai-worker:1.0

The Pod tolerates the taint.

But again, if you specifically want it on GPU nodes, combine that with:

nodeSelector:
  workload: gpu

or appropriate node affinity.


22. Pod Affinity#

So far we talked about:

Pod → Node

Now let's discuss:

Pod → Pod

Pod affinity means:

Prefer or require placing a Pod near other Pods matching certain labels.

Example:

Frontend Pod
     │
     │ affinity
     ▼
Backend Pod

Why might you want this?

Potentially:

  • latency-sensitive workloads
  • tightly coupled services
  • locality requirements

23. Pod Anti-Affinity#

This is extremely useful for high availability.

Suppose you have:

3 replicas

You don't want all replicas on one node.

Without anti-affinity:

Node 1
├── Pod A
├── Pod B
└── Pod C
 
Node 2
└── empty

If Node 1 fails:

All replicas lost

24. Anti-Affinity#

You can tell Kubernetes:

Prefer not to place replicas together.

Conceptually:

Node 1
└── Pod A
 
Node 2
└── Pod B
 
Node 3
└── Pod C

Now if Node 1 fails:

Pod A lost
 
Pod B → still running
Pod C → still running

This improves resilience.


25. Example Pod Anti-Affinity#

affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          topologyKey: kubernetes.io/hostname
          labelSelector:
            matchExpressions:
              - key: app
                operator: In
                values:
                  - node-api

This says, roughly:

Prefer not to place this Pod on the same node as another app=node-api Pod.


26. topologyKey#

This is an important concept.

It tells Kubernetes the topology domain across which the rule applies.

Common examples:

kubernetes.io/hostname

means:

different nodes

Another common topology dimension:

topology.kubernetes.io/zone

means:

different availability zones

27. High Availability with Zones#

Imagine:

Zone A
├── Node 1
└── Node 2
 
Zone B
├── Node 3
└── Node 4
 
Zone C
├── Node 5
└── Node 6

You have:

3 API Pods

A resilient placement might be:

Zone A → Pod A
Zone B → Pod B
Zone C → Pod C

Now losing one zone doesn't necessarily take down every replica.

This is one reason topology-aware scheduling matters in production.


28. Topology Spread Constraints#

Modern Kubernetes also provides:

Topology Spread Constraints

These let you express how evenly Pods should be distributed across topology domains.

Example:

topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: topology.kubernetes.io/zone
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        app: node-api

Conceptually:

Zone A → 2 Pods
Zone B → 2 Pods
Zone C → 1 Pod

The goal is to keep the distribution reasonably balanced according to the configured constraint.


29. DoNotSchedule vs ScheduleAnyway#

With topology spread constraints, you may see:

DoNotSchedule
ScheduleAnyway

DoNotSchedule#

If the constraint cannot be satisfied:

Don't schedule the Pod.

ScheduleAnyway#

Try to honor the constraint, but schedule the Pod anyway if necessary.

Think:

DoNotSchedule = hard
 
ScheduleAnyway = soft

30. Real-World Node.js Deployment#

Suppose:

Node.js API
3 replicas

You want:

Node 1 → Pod A
Node 2 → Pod B
Node 3 → Pod C

You could use anti-affinity or topology spread constraints.

A simplified Deployment might look like:

apiVersion: apps/v1
kind: Deployment
 
metadata:
  name: node-api
 
spec:
  replicas: 3
 
  selector:
    matchLabels:
      app: node-api
 
  template:
    metadata:
      labels:
        app: node-api
 
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                topologyKey: kubernetes.io/hostname
                labelSelector:
                  matchLabels:
                    app: node-api
 
      containers:
        - name: node-api
          image: my-node-api:1.0
 
          resources:
            requests:
              cpu: "250m"
              memory: "256Mi"
 
            limits:
              cpu: "1"
              memory: "512Mi"

This encourages replicas to spread across different nodes.


31. Scheduling Decision Example#

Suppose we have:

Node 1
CPU available: 1
zone: A
workload: general
 
Node 2
CPU available: 2
zone: B
workload: general
 
Node 3
CPU available: 4
zone: A
workload: gpu

Pod:

resources:
  requests:
    cpu: "2"
 
nodeSelector:
  workload: general

Scheduler:

Node 1
CPU 1 < required 2
❌
 
Node 2
CPU 2 >= required 2
workload=general
✅
 
Node 3
CPU sufficient
BUT workload=gpu
❌

Result:

Pod → Node 2

32. Scheduler Decision Tree#

Here's the mental model you should remember:

                   Pod
                    │
                    ▼
             Scheduler
                    │
                    ▼
          ┌─────────────────┐
          │ Filter Nodes    │
          └─────────────────┘
                    │
       ┌────────────┼────────────┐
       ▼            ▼            ▼
   Resources     Selector      Taints
       │            │            │
       └────────────┼────────────┘
                    ▼
             Feasible Nodes
                    │
                    ▼
              Score Nodes
                    │
                    ▼
              Select Node
                    │
                    ▼
                Bind Pod
                    │
                    ▼
                 kubelet
                    │
                    ▼
              Container runs

33. Why Pods Sometimes Stay Pending#

Now you know many possible reasons.

Insufficient CPU#

Insufficient cpu

Insufficient memory#

Insufficient memory

Node selector mismatch#

No node matches selector

Node affinity mismatch#

Affinity requirements not satisfied

Taint without toleration#

Node has taint
Pod doesn't tolerate it

Topology constraints#

Cannot satisfy topology rule

Volume constraints#

Storage may only be available in certain zones/nodes.

So:

Pending does not automatically mean "need more nodes."


34. Debugging Scheduling#

First:

kubectl get pods

If:

STATUS = Pending

run:

kubectl describe pod <pod-name>

Look at:

Events:

For example:

Warning  FailedScheduling
0/3 nodes are available:
2 Insufficient cpu,
1 node(s) didn't match Pod's node affinity.

Now you have the reason.


35. Useful Commands#

List nodes:

kubectl get nodes

Detailed:

kubectl get nodes -o wide

Labels:

kubectl get nodes --show-labels

Describe node:

kubectl describe node <node-name>

Add label:

kubectl label node <node-name> workload=gpu

Remove label:

kubectl label node <node-name> workload-

Add taint:

kubectl taint nodes <node-name> workload=gpu:NoSchedule

Remove taint:

kubectl taint nodes <node-name> workload=gpu:NoSchedule-

36. cordon#

Another useful node command:

kubectl cordon <node-name>

This marks a node as:

Unschedulable for new Pods.

Existing Pods aren't automatically removed.

Conceptually:

Node 1
├── Existing Pod A ✅
├── Existing Pod B ✅
└── New Pod ❌

37. drain#

Now:

kubectl drain <node-name>

is more aggressive.

It attempts to safely evict supported workloads from the node so the node can be maintained.

Conceptually:

Node
├── Pod A
├── Pod B
└── Pod C
 
       drain
         ↓
 
Pod A → another node
Pod B → another node
Pod C → another node

Then the node can be taken out of service.

drain has important options and exceptions, so don't blindly run it against production nodes.


38. Cordon vs Drain#

Very common interview question:

Command Meaning
cordon Don't schedule new Pods
drain Evict/move suitable existing workloads and make node unschedulable

Simple memory trick:

cordon = STOP NEW
 
drain = MOVE EXISTING + STOP NEW

39. Scheduler vs Kubelet#

Don't confuse these.

Scheduler#

Decides:

"Pod should run on Node 2."

Kubelet#

Runs on Node 2 and ensures:

"Pod actually runs here."

Architecture:

Scheduler
   │
   ▼
Node 2
   │
   ▼
kubelet
   │
   ▼
Container Runtime
   │
   ▼
Container

40. Interview Questions#

Q1. What is Kubernetes Scheduler?#

A control-plane component that selects suitable nodes for unscheduled Pods.

Q2. Does scheduler start containers?#

No.

The scheduler assigns the Pod to a node. The kubelet and container runtime handle execution.

Q3. What is nodeSelector?#

A simple way to restrict a Pod to nodes having specific labels.

Q4. What is node affinity?#

A more expressive mechanism for defining required or preferred node placement rules.

Q5. What is a taint?#

A node-side mechanism that repels Pods unless they have a matching toleration.

Q6. What is a toleration?#

A Pod-side declaration allowing it to be considered for nodes with matching taints.

Q7. Does toleration force a Pod onto a node?#

No.

It only permits it to tolerate the taint.

Q8. What is pod anti-affinity?#

A scheduling rule used to avoid placing certain Pods close together, commonly to spread replicas across nodes.

Q9. What is topology spread?#

A mechanism for distributing Pods across topology domains such as nodes or zones.

Q10. What happens when no node can satisfy a Pod's requirements?#

The Pod generally remains:

Pending

until scheduling conditions change.


🧠 Chapter 17 Cheat Sheet#

Scheduler
   │
   ├── Resources
   ├── nodeSelector
   ├── Node Affinity
   ├── Taints
   ├── Tolerations
   ├── Pod Affinity
   ├── Pod Anti-Affinity
   └── Topology Spread

Remember:#

nodeSelector
→ Simple node requirement
 
nodeAffinity
→ Advanced node placement
 
taint
→ Node repels Pods
 
toleration
→ Pod can tolerate taint
 
podAffinity
→ Put Pods near matching Pods
 
podAntiAffinity
→ Keep Pods apart
 
topologySpread
→ Distribute Pods across topology

🎯 The Most Important Mental Model#

If an interviewer asks:

"How does Kubernetes decide where to run a Pod?"

Think:

                  Pod
                   │
                   ▼
              Scheduler
                   │
                   ▼
             Filter Nodes
                   │
       ┌───────────┼───────────┐
       ▼           ▼           ▼
   Resources    Affinity     Taints
       │           │           │
       └───────────┼───────────┘
                   ▼
            Feasible Nodes
                   │
                   ▼
                Scoring
                   │
                   ▼
              Best Node
                   │
                   ▼
              Bind Pod
                   │
                   ▼
                kubelet
                   │
                   ▼
              Container

And when things don't fit:

Pod
 ↓
No suitable node
 ↓
Pending
 ↓
Cluster Autoscaler may add nodes
 ↓
Scheduler retries
 ↓
Pod gets placed

Next → Chapter 18: Jobs & CronJobs#

We'll move from long-running applications to one-time and scheduled workloads:

Deployment
→ continuously running application
 
Job
→ run task until completion
 
CronJob
→ run Job on a schedule

We'll build practical examples such as database migrations, background processing, cleanup jobs, scheduled reports, and Node.js scripts.

Finished this chapter?

Mark it as complete to track your mastery.

Previous ChapterChapter 16 — Cluster AutoscalerNext ChapterChapter 18 — Jobs & CronJobs
PrevNext