Facebook Pixel
Articles

Kubernetes v1.37: Node Lifecycle Conditions Explained

Kubernetes v1.37 introduces five well‑known Node lifecycle conditions—DrainInProgress, Drained, MaintenancePlanned, MaintenanceInProgress, and GracefulNodeShutdownInProgress—to give a shared, Kubernetes‑owned view of node state. Administrators can now publish these conditions for clearer operational communication without waiting for core controller support.

Written by:
APin

Senior Technology Analyst • Verified Expert

More from this author →
Kubernetes v1.37: Node Lifecycle Conditions Explained

Kubernetes v1.37 introduces five well‑known Node lifecycle conditions—DrainInProgress, Drained, MaintenancePlanned, MaintenanceInProgress, and GracefulNodeShutdownInProgress—to give a shared, Kubernetes‑owned view of node state. Administrators can now publish these conditions for clearer operational communication without waiting for core controller support.

Why Node Lifecycle Conditions Matter

Node lifecycle events affect many independent controllers in a Kubernetes cluster. The kubelet, node‑lifecycle controller, scheduler, autoscalers, storage operators, DaemonSet controller, and Job controller each need to know whether a node is being drained, undergoing maintenance, or shutting down gracefully. Today they infer that state from disparate signals such as NodeReady readiness, taints, pod termination phases, or custom labels and annotations. Those signals describe only a slice of the situation and can lead to contradictory actions.

For example, a NotReady node tells the scheduler to stop placing new pods, but it does not indicate whether the node is failing unexpectedly, in a planned maintenance window, or in the middle of a graceful shutdown. A taint like node.kubernetes.io/unreachable:NoSchedule prevents scheduling, yet it does not attest that a drain is in progress or that the administrator’s drain criteria have been satisfied. A pod in Terminating state may be the result of a deliberate drain or a crash‑loop, and downstream controllers cannot reliably differentiate the cause.

  • DaemonSet controller: may recreate a pod that the kubelet intentionally terminated during a graceful shutdown, causing unnecessary churn.
  • Job controller: can wait indefinitely for a pod to reach a terminal phase on a node that is being removed, delaying job completion.
  • Storage operator: might start remediation only after a drain has already begun, missing the opportunity to coordinate safely.

Kubernetes v1.37 introduces five well‑known Node lifecycle conditions—DrainInProgress, Drained, MaintenancePlanned, MaintenanceInProgress, and GracefulNodeShutdownInProgress—that provide a single, Kubernetes‑owned place to publish this context. Each condition uses a status field (True, False, Unknown) together with a stable reason and optional message for human‑readable detail.

Practical usage today involves an administrator or authorized automation setting these conditions directly, for instance:

status:
  conditions:
  - type: MaintenancePlanned
    status: "True"
    reason: MaintenanceWindow
    message: "Hardware maintenance scheduled for this node"

When the condition is True, all interested components can read the same signal and align their behavior: the scheduler can avoid new placements, the DaemonSet controller can pause rollouts, and the storage operator can defer disruptive actions. By converging on a shared, authoritative signal, the cluster avoids the fragmented inference that currently leads to conflicting decisions during drains, maintenance, or graceful shutdowns.

The Five New Conditions in v1.37

Kubernetes v1.37 adds five well‑known NodeConditionType constants that give a single, Kubernetes‑owned place to signal a node’s lifecycle state. Each condition follows the standard condition schema: a type, a status (True, False, Unknown), a machine‑readable reason, and an optional human‑readable message. The status field indicates whether the observed lifecycle state is currently active.

DrainInProgress
Set when an administrator‑authorized drain operation has begun and pods are being evicted according to the chosen drain criteria. Controllers that watch this condition can suppress new scheduling or alert operators that the node is temporarily unavailable for workloads.
Drained
Indicates that the node has satisfied the administrator’s drain criteria—typically, all non‑daemonset pods have terminated and required pod disruption budgets are respected. At this point the node is safe for decommissioning or other disruptive actions.
MaintenancePlanned
Publishes a future maintenance window. The condition is useful for capacity‑planning tools and for alerting users that a node will soon be unavailable.
MaintenanceInProgress
Signals that the node is actively undergoing maintenance, which may include hardware replacement, software rollout, or debugging. Whether a drain is required depends on the maintenance impact; the condition itself does not enforce eviction.
GracefulNodeShutdownInProgress
Reports that the node is executing a graceful shutdown sequence, allowing the kubelet to terminate pods cleanly before power‑off or VM termination.

For each condition the status semantics are:

  • True – the lifecycle state described by the condition is currently observed.
  • False – the state is not observed; the condition may be omitted entirely when False.
  • Unknown – the kubelet or controller cannot determine the state, often because required information is missing.

Example of publishing a planned maintenance condition:

apiVersion: v1
kind: Node
metadata:
  name: worker-01
status:
  conditions:
  - type: MaintenancePlanned
    status: "True"
    reason: MaintenanceWindow
    message: "Hardware maintenance scheduled for this node"
    lastTransitionTime: "2026-12-09T12:00:00Z"

Administrators should assign ownership of each condition to avoid conflicting writes, and continue to use existing mechanisms (kubectl cordon, kubectl drain, taints, etc.) for the actual scheduling or eviction actions. The conditions act as a read‑only status channel that dashboards, alerts, and automation can consume for operational clarity.

How to Publish and Use Conditions Today

Kubernetes v1.37 adds five well‑known NodeConditionType values—DrainInProgress, Drained, MaintenancePlanned, MaintenanceInProgress, and GracefulNodeShutdownInProgress. Each condition lives in node.status.conditions and follows the standard condition schema: type, status (True, False, Unknown), reason, message, and lastTransitionTime. The reason field is intended to be a stable, machine‑readable identifier, while message provides free‑form context for operators and dashboards.

Administrators can publish these conditions today without enabling the Alpha feature gate, because the gate is a no‑op in the initial release. The responsibility for setting and clearing the fields rests with an authorized controller or a human operator. No core workload controller reads the conditions yet, but they become a common visibility channel for any tooling that monitors node health.

Typical workflow to set a condition uses kubectl patch or a custom controller that updates the node object. For example, to announce a planned hardware maintenance window:

kubectl patch node my-node -p '{
  "status": {
    "conditions": [
      {
        "type": "MaintenancePlanned",
        "status": "True",
        "reason": "MaintenanceWindow",
        "message": "Hardware maintenance scheduled for this node",
        "lastTransitionTime": "2026-12-09T12:00:00Z"
      }
    ]
  }
}' --type=merge

When the maintenance actually starts, the same field is updated to MaintenanceInProgress with an appropriate reason such as OperatorAction. After work completes, the condition can be set to False or removed entirely.

  • Publish early: set MaintenancePlanned as soon as a window is known.
  • Use stable reasons: choose a short, immutable string (e.g., MaintenanceWindow, OperatorAction).
  • Provide clear messages: include human‑readable details for alerts and dashboards.
  • Clear or set False: when the lifecycle state ends, remove the condition or set status: "False".

These conditions complement, rather than replace, existing mechanisms such as kubectl cordon, kubectl drain, and taints. Operators should continue to use cordon to stop new pod scheduling and drain (or custom eviction logic) to evict workloads. The condition fields then act as a read‑only status indicator that can be consumed by monitoring systems, alerting pipelines, or automation that needs to know whether a node is being drained, under maintenance, or shutting down gracefully.

By separating the operational action (cordon/drain/taint) from the visibility signal (Node lifecycle condition), clusters gain consistent, machine‑readable context without altering the proven tooling that already performs the work.

Operational Benefits and Best Practices

Kubernetes v1.37 introduces five well‑known Node lifecycle conditions—DrainInProgress, Drained, MaintenancePlanned, MaintenanceInProgress, and GracefulNodeShutdownInProgress. Each condition is stored on the Node object as a status.conditions entry with a type, a status field (True, False, Unknown), a stable reason, and an optional human‑readable message. The status field indicates whether the observed lifecycle state is currently active; True means the condition is in effect, False means it is not, and Unknown signals that the controller cannot determine the state.

Because the conditions are Kubernetes‑owned and machine‑readable, they become a single source of truth for operational tooling. Dashboards can render a node’s lifecycle column directly from the condition list, eliminating the need to infer state from readiness, taints, or pod termination. Alerting systems can trigger on status: True for MaintenanceInProgress or DrainInProgress, reducing false positives that arise from transient NotReady signals. Automation pipelines—such as CI/CD rollouts, storage operators, or autoscalers—can query the same field to pause actions until a node reports Drained or GracefulNodeShutdownInProgress is False, ensuring safe coordination without custom heuristics.

Best‑practice patterns for consuming these conditions include:

  • Explicit ownership: Assign a single controller (e.g., a maintenance scheduler) to set each condition. Document the owner in the reason field to prevent concurrent writes.
  • Avoid conflicting writes: Use Kubernetes RBAC to restrict patch permissions on status.conditions to the designated owner. Competing controllers should read the condition and act, not rewrite it.
  • True/False discipline: Set the condition to True only while the lifecycle activity is ongoing; transition to False (or remove the entry) immediately after completion. This guarantees that downstream alerts fire once and do not linger.
  • Stable reasons and messages: Choose immutable reason strings (e.g., ScheduledWindow, OperatorDrain) and concise messages so that both humans and automated parsers can reliably interpret changes.

Integrating Node lifecycle conditions with existing controls—kubectl cordon, taints, and pod eviction—preserves compliance with standards such as SOC 2 and ISO 27001, which require auditable change management and clear separation of duties. By centralizing state, organizations can meet NIST and OWASP guidance for secure, observable infrastructure operations.

Looking Ahead: Future Integration and Community Involvement

The Alpha NodeLifecycleConditions feature gate is introduced in Kubernetes v1.37 and is disabled by default. In this release the gate is a no‑op: it does not restrict who can set the new well‑known node condition types (DrainInProgress, Drained, MaintenancePlanned, MaintenanceInProgress, GracefulNodeShutdownInProgress) and no core component reads them. Administrators or authorized controllers can already publish these conditions to convey operational intent, for example by patching a node:

kubectl patch node my-node -p '{"status":{"conditions":[{"type":"MaintenancePlanned","status":"True","reason":"MaintenanceWindow","message":"Hardware maintenance scheduled"}}]}' --type=merge

Future releases will enable core controllers to consume the conditions once the gate is turned on. The scheduler can avoid placing new pods on nodes marked MaintenanceInProgress, autoscalers can factor graceful shutdowns into scaling decisions, and storage operators can defer disruptive actions until a node reports Drained. This shared signal reduces the need for each component to infer lifecycle state from disparate sources such as taints, readiness, or pod termination.

DaemonSet rollouts illustrate a concrete enhancement path. Currently a node undergoing maintenance still counts against the rollout’s availability budget, potentially stalling progress. When MaintenanceInProgress is observed, the DaemonSet controller could:

  • Exclude the node from the max‑unavailable calculation.
  • Delay creating the new revision pod until the node reports Drained or GracefulNodeShutdownInProgress clears.
  • Emit a status condition on the DaemonSet indicating that rollout pacing is waiting on node‑level maintenance.

Engineers interested in shaping these behaviors can join the Node Lifecycle Working Group, SIG Node, or SIG Apps. The design proposal is tracked in KEP‑5683. Contribution steps include:

  • Reviewing the KEP and providing feedback on the proposed consumption model.
  • Submitting prototype controller code that reads the new conditions.
  • Participating in WG meetings to discuss ownership, locking, and API extensions.
  • Sharing real‑world use cases to validate the semantics of each condition.

By adopting the Alpha gate now and contributing to the downstream design, teams can achieve consistent node‑state visibility across the control plane while preparing for the next generation of lifecycle‑aware controllers.

APPWORKS ENGINEERING

Looking for Custom Software or AI Solutions?

Appworks Technologies designs, builds, and scales production enterprise platforms, microservices, and AI agent workflows tailored to your business goals.

Editorial Policy & Research Methodology

Our findings are based on rigorous internal research, verified industry benchmarks, and direct technical implementation experience from our enterprise client projects. All statistics and technical claims are reviewed by senior engineers before publication to ensure accuracy, transparency, and helpfulness for our readers.

Have an Idea? we offer services in Lucknow, Bangalore, Delhi NCR and other locations