✦ For everyone, free.

Practical knowledge for real and everyday life

Home

4.5 Kubernetes Node Pod Admission

Kubernetes Node Pod Admission ensures only compliant pods are scheduled on nodes, enforcing policies through admission controllers during the creation process.

Kubernetes Node Pod Admission is the process by which a node's kubelet decides whether a pod assigned to it by the scheduler can actually be accepted and started, applying a series of local checks that run independently of the scheduler's own placement decision. It acts as a final gate on the node itself, verifying that resources, constraints, and policies are satisfied before any container creation begins, and it can reject a pod even after the API server has already bound it to that node.


Why Node-Level Admission Exists

The Gap Between Scheduling and Execution

The scheduler makes placement decisions based on a cached view of cluster state, which can become stale between the moment a decision is made and the moment the kubelet actually attempts to run the pod. Node Pod Admission exists to catch discrepancies introduced by this delay, such as resources consumed by other pods that started in the interim, or node conditions that changed after scheduling occurred.

Defense in Depth

Admission at the node level complements admission control at the API server. While API-server-side admission controllers validate and mutate pod specs before persistence, node-level admission re-validates feasibility at the point of actual execution, providing a second layer of protection against inconsistent or unsafe pod placement.


Core Admission Checks

Resource Fit Verification

The kubelet recomputes whether the sum of resource requests from all pods already running or admitted on the node, plus the incoming pod's requests, would exceed the node's allocatable capacity for CPU, memory, and ephemeral storage. If the pod would cause an overcommit beyond allocatable limits, it is rejected locally rather than being forced to run.

NodeAffinity and NodeSelector Re-check

Even though the scheduler filters nodes by affinity rules and node selectors, the kubelet independently re-evaluates these constraints against the current node labels at admission time, guarding against races where labels change between scheduling and binding.

Taints and Tolerations

The kubelet verifies that the pod tolerates any taints currently present on the node. If a taint with effect NoExecute or NoSchedule has been added to the node after the scheduling decision but before admission, and the pod lacks a matching toleration, admission fails.


Admission Handlers

Pluggable Handler Chain

Internally, the kubelet runs pod admission through a chain of handler functions, each of which can approve or reject the pod with a specific reason. This handler chain includes checks for resource availability, hostPort conflicts, node readiness, and volume constraints, evaluated in sequence before the pod is allowed to proceed toward sandbox creation.

hostPort Conflict Detection

If a pod requests a specific host port that is already claimed by another pod on the same node, the admission handler responsible for port allocation rejects the pod, preventing a runtime-level bind failure later in the container startup sequence.

Critical Pod Admission

Pods marked with a critical priority class receive special handling during admission under resource pressure, allowing the kubelet to admit them even when it would otherwise reject lower-priority pods, and potentially triggering preemption of existing lower-priority pods to make room.


Node Conditions and Readiness Gates

NotReady and Unschedulable States

A node reporting NotReady status, or marked unschedulable through cordoning, will generally not receive new pod bindings from the scheduler, but the kubelet's own admission logic also independently refuses to start new pods while the node itself is not in a healthy state, adding a redundant safety check.

Disk and Memory Pressure

If the node is under active disk pressure or memory pressure conditions, as tracked by the kubelet's eviction manager, incoming pod admission can be denied for new BestEffort or Burstable pods to avoid worsening resource contention while the node is already stressed.


Rejection Handling and Status Reporting

Pod Status on Rejection

When admission fails, the kubelet sets the pod's phase to Failed and populates the pod status with a reason and message describing which admission check failed, such as OutOfcpu, OutOfmemory, or NodeAffinity, giving operators and controllers visibility into why the pod never started.

Interaction with Controllers

For pods managed by higher-level controllers such as Deployments or ReplicaSets, an admission rejection at the node typically results in the controller observing the failed pod and creating a replacement, which is then rescheduled, potentially onto a different node with sufficient capacity.


Relationship to Static and Mirror Pods

Static Pods

Static pods, defined directly on the node through manifest files rather than through the API server, bypass scheduler-based binding entirely but still pass through the kubelet's node-level admission checks before being started, since the checks operate on the kubelet's local view of resource usage regardless of how a pod was assigned to the node.

Mirror Pod Representation

Once a static pod is admitted and running, the kubelet creates a corresponding mirror pod object in the API server so that the pod is visible through normal Kubernetes tooling, even though its admission decision was made entirely locally by the node rather than through the scheduler.