{
  "id": 20057300,
  "title": "Why Your Pod Is Stuck in Pending, Explained With a Restaurant Host Stand",
  "url": "https://urgent.news/2026/11/14/why-your-pod-is-stuck-in-pending-explained-with-a-restaurant-host",
  "topic": "culture",
  "section": "Culture",
  "published": "2026-11-14T21:57:10.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/noahcontrolplane/why-your-pod-is-stuck-in-pending-explained-with-a-restaurant-host-stand-12ig"
  },
  "original_language": "en",
  "account": "Imagine a bustling restaurant on a Friday night. As the host, your task is to seat parties based on their requirements. You check for tables that are large enough, reserved, in the requested section, and don't have conflicts with other parties. If no suitable table is found, the party goes on the waiting list. This process resembles Kubernetes scheduling, where each party is a pod, each node is a table, and \"Pending\" is the waiting list.\n\nWhen a party requests a specific number of seats, the host holds a table for that number, regardless of the actual usage. Similarly, when a pod requests a certain amount of CPU and memory, it takes those resources from the node's total capacity, even if it's idle. The scheduler doesn't consider actual usage, but rather the requested resources.\n\nA party's limits are different from their requests. Limits define the maximum amount they can consume. If a party exceeds its CPU limit, it's slowed down; if it exceeds its memory limit, it's closed down and restarted. However, limits don't affect seating. The scheduler only sees the reservation.\n\nThe scheduling process involves two phases: filtering and scoring. Filtering removes nodes that can't accommodate the pod's requirements, such as insufficient CPU or memory, incompatible taints, or affinity rules. The remaining nodes are then scored based on factors like spreading replicas apart or balancing resource usage. The pod is assigned to the highest-scoring node.\n\nIf no nodes pass the filtering phase, the pod remains in \"Pending\" status. The scheduler records why it rejected each node. These reasons can help identify issues like insufficient memory, untolerated taints, or incompatible node affinities.\n\nReserved tables, or nodes with taints, work similarly to a host card on a table. A toleration, or pass, allows a pod to occupy a reserved table, but doesn't necessarily seat it there. To ensure pods only occupy specific nodes, you need both tolerations (permission to enter) and node affinity or nodeSelector (instructions to seat there).\n\nNode affinity is a seating request, while affinity is the host walking you to the table. For example, a pod might request to sit in the patio area.\n\nAnti-affinity and spread constraints are about not placing similar parties or pods together. This can prevent issues like all replicas of a service landing on a single node, which could cause a failure in the entire service.\n\nLastly, persistent volumes, or your coat checked in the coat check, can cause issues if they're not properly bound to the correct zone. This can result in a pod waiting indefinitely, even if other zones are available.",
  "summary": "You're the host at a busy restaurant on a Friday night. A party of four walks in. Before you seat them, you run a quick checklist in your head: which tables are big enough, which ones are reserved, which section they asked for, and who they shouldn't be seated next to. If no table passes, they go on the waiting list. That is the Kubernetes scheduler. Every pod is a party, every node is a table,…",
  "key_points": [
    "Restaurant host analogy mirrors Kubernetes scheduling process",
    "Pods request specific resources, similar to parties requesting seats",
    "Pending status occurs when no suitable node is found for pod"
  ],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}