✦ For everyone, free.

Practical knowledge for real and everyday life

Home

Kubernetes Namespace Lifecycle Admission

Kubernetes Namespace Lifecycle Admission controls namespace creation, deletion, and access via admission controllers in Kubernetes.

Kubernetes Namespace Lifecycle Admission is the built-in admission plugin, NamespaceLifecycle, that enforces correct behavior around the creation, existence, and termination of namespaces themselves. It prevents two specific classes of invalid operations: creating objects within a namespace that does not exist, and creating new objects within a namespace that is in the process of being deleted, both of which would otherwise leave the cluster in an inconsistent state.


What NamespaceLifecycle Enforces

Rejecting Objects in Nonexistent Namespaces

Without this plugin, a client could submit an object referencing a namespace that was never created, or was already deleted, resulting in orphaned objects with no valid parent namespace. NamespaceLifecycle checks that the target namespace exists and is active before permitting the creation of any namespaced object within it.

kubectl apply -f pod.yaml -n nonexistent-namespace
# Error from server (Forbidden): namespaces "nonexistent-namespace" not found

Blocking New Objects in Terminating Namespaces

When a Namespace object is deleted, it first transitions to a Terminating phase while its contents are cleaned up asynchronously; NamespaceLifecycle rejects any attempt to create new objects within a namespace in this phase, preventing new work from being introduced into a namespace that is actively being torn down.

kubectl get namespace payments -o jsonpath='{.status.phase}'
# Terminating
kubectl apply -f new-pod.yaml -n payments
# Error from server (Forbidden): unable to create new content in namespace payments because it is being terminated

Protecting Default System Namespaces

NamespaceLifecycle also prevents deletion of certain foundational namespaces (default, kube-system, kube-public), ensuring the cluster's own core operational namespaces cannot be accidentally removed through an ordinary delete request.


Interaction With Namespace Deletion

The Termination Sequence

When a namespace is deleted, the API server marks it Terminating, then the namespace controller removes contained resources (respecting finalizers along the way), and only once all contents are cleaned up and finalizers are cleared does the namespace object itself get removed. NamespaceLifecycle operates throughout this window, consistently rejecting new object creation the entire time.

Finalizers and Stuck Terminations

A namespace can become stuck in Terminating indefinitely if a resource within it has a finalizer that never completes (often due to a missing or malfunctioning controller responsible for clearing it); NamespaceLifecycle's enforcement continues to apply during this stuck state, meaning legitimate attempts to create new objects will keep failing until the underlying finalizer issue is resolved.

kubectl get namespace payments -o json | \
  jq '.spec.finalizers, .status.conditions'

Operational Implications

Diagnosing Rejected Object Creation

When a deployment pipeline fails with a namespace-related admission error, checking the target namespace's phase is the first diagnostic step — a Terminating phase indicates the namespace is mid-deletion (potentially from an unintended or automated cleanup process), while a "not found" error indicates the namespace was never created or was fully removed before the deployment ran.

Race Conditions in Automated Pipelines

Automation that creates a namespace and immediately deploys resources into it should account for eventual consistency in namespace creation propagation across API server replicas in a highly available control plane, since a create-then-immediately-deploy sequence can occasionally race against NamespaceLifecycle's existence check if the namespace has not yet been observed by the API server instance handling the subsequent request.


Why This Plugin Is Foundational

Always Effectively Required

Because NamespaceLifecycle prevents fundamentally invalid cluster states rather than enforcing an organization-specific policy choice, it is enabled by default and should not be disabled in any production cluster; doing so removes a basic consistency guarantee that much of the rest of the platform's namespaced-resource model implicitly assumes holds true.

Complementary to, Not a Replacement for, RBAC

NamespaceLifecycle governs whether an operation on a namespace is structurally valid at all, entirely independent of whether the requesting identity is authorized to perform it — RBAC still separately determines who may create, delete, or modify resources within a given namespace, with NamespaceLifecycle enforcing consistency on top of whatever RBAC has already permitted.