Debugging Application Delivery: Stuck Rollouts, Failed Releases, and Rollbacks
Debugging application delivery means answering one question: did the new version actually roll out, and is it serving traffic? A Kubernetes rolling update only makes progress when new Pods become Ready, so a bad image tag, a failing readiness probe, unschedulable resource requests, or a quota that blocks Pod creation all produce the same visible symptom - a rollout that hangs while the old ReplicaSet keeps serving. Your diagnostic loop is kubectl rollout status to see the hang, the Deployment's conditions (Progressing, Available and ReplicaFailure, including the ProgressDeadlineExceeded reason) to see what Kubernetes concluded, kubectl get, describe and logs to find the root cause, and kubectl rollout undo or helm rollback to recover. Kubernetes never rolls back a Deployment automatically; it stops safely and waits for you. This lesson works through the rollout mechanics that make delivery failures safe, the failure modes that stall releases and how to tell them apart, the rollback commands for both raw Deployments and Helm releases (including Helm 4's renamed flags), and the observability signals that confirm a deploy is genuinely healthy.
On this page9 sections
- Delivery debugging is its own problem
- Watching a rollout with kubectl
- Deployment conditions: Progressing, Available, ProgressDeadlineExceeded
- Why rollouts get stuck: the usual suspects
- Probes during a rollout: readiness, liveness and startup
- Rolling back with kubectl rollout undo
- Scenario: the rollout that never finished
- Helm release failures: status, history, rollback
- Observability during delivery: is the new version actually serving?
- Monitor a Deployment rollout with kubectl rollout status and interpret a stalled rollout
- Predict how far a broken rolling update gets from maxSurge and maxUnavailable, including their default rounding
- Read Deployment conditions - Progressing, Available and ReplicaFailure - and explain how ProgressDeadlineExceeded is timed
- Diagnose the common causes of a stuck rollout: bad image tags, failing probes, unschedulable Pods and quota rejections
- Choose a remedy that matches the diagnosis, and explain why rollback or a restart does not fix every cause
- Roll back with kubectl rollout undo, read rollout history, and relate revisions to revisionHistoryLimit and change-cause
- Inspect and recover a failed Helm release with helm status, helm history and helm rollback, and use Helm 4 failure flags
- Explain which observability signals verify a release and which mechanisms can actually stop a bad one
Delivery debugging is its own problem
Generic Pod troubleshooting asks why a container is crashing. Delivery debugging asks a different question: you shipped a new version - did it arrive, and is it serving? The failure modes are specific to the rollout machinery: a new ReplicaSet that never becomes healthy, a rollout frozen halfway, a Helm upgrade stuck in a failed state, or a release that technically completed but doubled the error rate. The KCNA delivery domain probes this distinction, so keep the two mindsets separate.
The single most important fact is that a rolling update is gated on readiness. The Deployment controller creates a new ReplicaSet and scales it up in steps, but it only continues - and only scales the old ReplicaSet down - as new Pods pass their readiness probes and count as available. The bounds maxSurge and maxUnavailable guarantee a minimum serving capacity at every step.
Both default to 25% of the desired replicas, and they round in opposite directions: maxSurge rounds up (extra Pods allowed above the desired count) and maxUnavailable rounds down (Pods allowed below it). With 4 replicas that means at most 5 Pods in total and at least 3 available. You can use this to predict where a broken rollout stops: the controller adds 1 surge Pod and removes 1 old Pod (old Pods are still the available ones, so 3 remain), then fills the freed slot with a second new Pod. If the new Pods never become Ready, the rollout freezes at 3 old + 2 new - no more old Pods can go without dropping below 3 available, and no more new Pods fit under the 5-Pod ceiling.
That gating is what makes delivery failures survivable. If the new Pods never become Ready, the rollout simply stops making progress: the new ReplicaSet sits with a few broken Pods, and the old ReplicaSet stays up and keeps serving traffic. Users are usually unaffected by a completely broken release; what you have is a stuck rollout, not an outage. Your job as the debugger is to notice the hang, find out why the new Pods are not Ready, and either fix forward or roll back. The rest of this lesson is that workflow, in order.
Watching a rollout with kubectl
The first tool is kubectl rollout status deployment/web. It blocks and prints progress while the rollout proceeds, exits successfully when the Deployment reaches its desired state, and simply keeps waiting - printing something like Waiting for deployment web rollout to finish: 1 out of 3 new replicas have been updated... - when the rollout is stuck. A status command that never returns is your first signal that the new version is not becoming healthy.
Next, look at the Deployment summary and its ReplicaSets:
kubectl get deployment web kubectl get replicasets kubectl describe deployment web
kubectl get deployment shows the columns READY, UP-TO-DATE, and AVAILABLE. During a healthy rollout UP-TO-DATE climbs to the desired count and AVAILABLE follows; in a stuck rollout UP-TO-DATE stalls at a low number while AVAILABLE reflects the old Pods still serving. kubectl get replicasets makes the mechanism visible: mid-rollout you will see two ReplicaSets for the Deployment - the old one still holding most replicas and the new one with a small number that refuse to become ready. That two-ReplicaSet picture is the signature of a stalled rolling update and a favorite exam scenario.
kubectl describe deployment adds the events history - each scale-up and scale-down decision the controller made - and the conditions block covered in the next section. From there the trail leads downward: the Deployment tells you the rollout is stuck, but the reason lives in the Pods of the new ReplicaSet, which you inspect with kubectl get pods and kubectl describe pod.
Deployment conditions: Progressing, Available, ProgressDeadlineExceeded
A Deployment reports its health through conditions in its status, and three condition types matter for delivery debugging:
| Condition type | Question it answers | What a problem looks like |
|---|---|---|
| Available | Is the app serving now? True when at least the minimum number of replicas (desired minus maxUnavailable) are available - Ready for at least minReadySeconds | False with reason MinimumReplicasUnavailable |
| Progressing | Is the rollout moving, or has it completed? | False with reason ProgressDeadlineExceeded |
| ReplicaFailure | Could the ReplicaSet controller create the Pods at all? | Present (True) when Pod creation is rejected, for example by a ResourceQuota or a missing ServiceAccount |
ReplicaFailure is easy to forget because it only appears when something goes wrong; a healthy Deployment shows just Available and Progressing. Note that ProgressDeadlineExceeded is a reason on the Progressing condition, not a condition type of its own, and condition types such as Initialized or ContainersReady belong to Pods, not Deployments.
The controller does not wait forever. progressDeadlineSeconds - default 600 seconds - is the maximum time a rollout may go without making progress. The clock is not measured from the start of the rollout: every sign of progress - a new ReplicaSet being created or scaled, a new Pod becoming available - resets it. A slow rollout that brings up one Pod every few minutes never trips the deadline, while a rollout whose new Pods never become available trips it 600 seconds after its last step forward. When the window passes without progress, the controller sets Progressing to False with the reason ProgressDeadlineExceeded. You will see it in kubectl describe deployment output and in kubectl rollout status, which exits with an error message that the deployment exceeded its progress deadline.
Two properties of this mechanism are exam bait. First, ProgressDeadlineExceeded triggers no automatic action: Kubernetes does not roll back, does not delete the new ReplicaSet, and does not stop retrying the Pods. The condition is a report, not a remedy - recovery is on you (or on automation you add that watches the condition), typically via kubectl rollout undo or a corrected manifest. Second, the conditions are independent: a Deployment can be Available=True (old Pods still serving) and Progressing=False (new version failed) at the same time. That combination - app up, rollout dead - is precisely the stuck-rollout state from the previous section, now expressed in the API.
Read the conditions before anything else when a delivery misbehaves: they tell you in a few lines whether you are facing a stalled rollout, a capacity loss, a Pod-creation rejection, or a combination.
Why rollouts get stuck: the usual suspects
Almost every stuck rollout reduces to one cause: the new Pods never become Ready - or are never created - so the readiness gate never opens. What differs is why, and each why has a distinct fingerprint.
| Symptom of the new version | Likely cause | Where to confirm |
|---|---|---|
| ImagePullBackOff or ErrImagePull | Bad image tag, missing image, or registry auth failure | kubectl describe pod, Events section |
| Running but 0/1 Ready, RESTARTS stays at 0 | Readiness probe failing (wrong port or path, app not healthy) | kubectl describe pod probe failures, container logs |
| Running, RESTARTS climbing | Liveness probe failing, so the kubelet keeps killing the container | kubectl describe pod (Liveness probe failed, Killing events) |
| CrashLoopBackOff | New version crashes at startup (bad config, missing dependency) | kubectl logs with --previous |
| CreateContainerConfigError | Referenced ConfigMap or Secret missing | kubectl describe pod, Events section |
| Pending | Unschedulable: no node has enough free allocatable CPU or memory, or placement constraints exclude every node | kubectl describe pod, FailedScheduling event |
| No new Pod at all; new ReplicaSet DESIRED above CURRENT | Pod creation rejected, for example by a namespace ResourceQuota | kubectl describe replicaset (FailedCreate event); ReplicaFailure condition on the Deployment |
A bad image tag is the classic release mistake - a typo in the tag or an image that was never pushed - and it can never self-heal; the kubelet retries the pull with backoff forever. A failing readiness probe is subtler: the containers run, logs may look normal, but the Pod shows 0/1 Ready, it is never added to the Service's endpoints, and the rollout cannot progress - the textbook example of readiness blocking a rollout.
Capacity problems come in three shapes worth separating. Surge needs headroom: maxSurge makes a rollout briefly need more capacity than steady state, so a cluster that fits the app may not fit it mid-rollout, and the surge Pods sit Pending. A Pod whose request is larger than any single node's allocatable capacity stays Pending forever whatever the surge settings - lowering maxSurge or waiting for other Pods to finish does not help; only larger nodes or a smaller request do. And a ResourceQuota rejection is different again: the API server refuses to create the Pod, so there is no Pending Pod to describe. The evidence lives one level up, as a FailedCreate event on the new ReplicaSet (kubectl describe replicaset) and a ReplicaFailure condition on the Deployment.
In every case the old ReplicaSet remains up, bounded by maxUnavailable. The rollout machinery has already contained the blast radius; your task is diagnosis, then the decision to fix forward or roll back.
Probes during a rollout: readiness, liveness and startup
Kubernetes has three probe types, and each produces a different symptom when a new version misbehaves. Only one of them - readiness - is what a rolling update waits on.
| Probe | What happens when it fails | Visible symptom | Effect on the rollout |
|---|---|---|---|
| Readiness | The Pod is marked not Ready and removed from Service endpoints; the container keeps running | STATUS Running, READY 0/1, RESTARTS 0 | Blocks it - the Pod never counts as available |
| Liveness | The kubelet kills and restarts the container | RESTARTS climbing, often ending in CrashLoopBackOff | Blocks it - a restarting container is not Ready for long |
| Startup | Until it succeeds, liveness and readiness checks are held off; if it never succeeds, the container is restarted | Slow starters stop being killed early | Delays readiness (the Pod is not Ready until it succeeds) but does not judge health |
The quick tell between the first two is the RESTARTS column: a readiness failure leaves the count at zero, a liveness failure makes it climb. A startupProbe exists for applications that take a long time to boot; it protects them from a liveness probe that would otherwise kill them mid-start. It says nothing about whether the app is healthy afterwards, so it cannot be what gates a rollout on real health - that remains the readiness probe's job.
Because the readiness probe is the gate, its design decides how much protection a rollout gives you. A probe that exercises the real serving path stops more bad releases than one that returns 200 unconditionally. There is a caveat, though: if readiness also checks a shared dependency such as a database, an outage of that dependency marks every Pod - old and new - not Ready at once, and the Service is left with no endpoints. Check what the Pod itself needs to serve; leave shared-dependency failures to alerting and graceful error handling.
Rolling back with kubectl rollout undo
When the new version is the problem, the fastest recovery is usually to return to the version that worked. Every time a Deployment's Pod template changes, the controller keeps the previous ReplicaSet - scaled to zero - as a numbered revision. Rollback re-instates an old revision's Pod template:
kubectl rollout history deployment/web kubectl rollout history deployment/web --revision=3 kubectl rollout undo deployment/web kubectl rollout undo deployment/web --to-revision=2 kubectl rollout status deployment/web
The two revision flags look alike but do opposite kinds of work:
| Command | What it does | Changes the cluster? |
|---|---|---|
| kubectl rollout history --revision=N | Shows the Pod template recorded for revision N | No - read-only |
| kubectl rollout undo | Returns to the immediately previous revision | Yes - starts a rolling update |
| kubectl rollout undo --to-revision=N | Returns to revision N | Yes - starts a rolling update |
A rollback is itself a rolling update - the Deployment scales the old ReplicaSet back up under the same readiness gating - and it creates a new revision number rather than rewinding the counter. Because the old ReplicaSet still exists, rollback usually only needs to start Pods from an image nodes have already pulled, which makes it fast.
revisionHistoryLimit controls how many old ReplicaSets the Deployment retains - the default is 10 - so --to-revision can reach back across any of those retained revisions, not just the previous one. Setting it to 0 deletes history and makes rollout undo impossible, a trade-off question KCNA can pose. (The long-removed extensions/v1beta1 Deployment API kept every old ReplicaSet by default; current apps/v1 Deployments default to 10.)
The CHANGE-CAUSE column in rollout history is read from one annotation only, and several similar-looking annotations do other jobs:
| Annotation | Set by | Purpose |
|---|---|---|
| kubernetes.io/change-cause | You (for example kubectl annotate) | The text shown in CHANGE-CAUSE |
| deployment.kubernetes.io/revision | The Deployment controller | The revision number on the Deployment and its ReplicaSets |
| kubectl.kubernetes.io/last-applied-configuration | kubectl apply | The last applied manifest, used to compute the next apply's changes |
| kubernetes.io/description | You | A free-text description of the object; not shown by rollout history |
Without a change-cause, history shows revision numbers with no explanation, which is why teams that rely on manual rollbacks annotate their deploys.
Finally, match the remedy to the diagnosis. If the rollout is stuck because the cluster lacks capacity, a quota is exhausted, or a referenced ConfigMap or Secret is missing, rolling back the image will not create nodes, quota or objects - though returning to a template that does not need them can. Recreating Pods does not help either: deleting Pods or running kubectl rollout restart starts fresh Pods from the same image and the same references (restart only stamps a restart timestamp on the template), so a bad tag or a missing ConfigMap fails again exactly as before. The fix is a changed template - a corrected manifest, or a rollback to a revision that worked.
Scenario: the rollout that never finished
Walk through a realistic failure end to end. Your team ships version 2.1.0 of a web API by updating the Deployment's image to shop/api:2.10 - a typo, since the registry only has 2.1.0. The deploy pipeline applies the manifest and runs kubectl rollout status deployment/api, which prints that 2 out of 4 new replicas have been updated and then hangs.
You look at the workload:
kubectl get pods -l app=api NAME READY STATUS RESTARTS AGE api-5f7c9b6d4-x2kqp 0/1 ImagePullBackOff 0 6m api-5f7c9b6d4-k7d2n 0/1 ImagePullBackOff 0 6m api-7d9f8c5b21-8xj4w 1/1 Running 0 3d api-7d9f8c5b21-p9z6t 1/1 Running 0 3d api-7d9f8c5b21-w4m2r 1/1 Running 0 3d
The picture tells the whole story: two new Pods from the new ReplicaSet are stuck in ImagePullBackOff, while three old Pods keep running. That is exactly where the default 25% bounds freeze a 4-replica rollout: one surge Pod, one old Pod removed, one more new Pod in its place - and since neither new Pod becomes Ready, the controller can remove no further old Pods. Users have noticed nothing. kubectl describe pod api-5f7c9b6d4-x2kqp confirms it in the Events: failed to pull image, manifest for tag 2.10 not found. Ten minutes after the last progress, the Deployment's Progressing condition flips to False with reason ProgressDeadlineExceeded - and nothing else happens, because Kubernetes does not auto-rollback.
Recovery is a choice. Fix forward: push a corrected manifest with shop/api:2.1.0, and the controller replaces the broken ReplicaSet with a healthy one. Or roll back first: kubectl rollout undo deployment/api returns the Deployment to the previous template, the stuck Pods are deleted, and the rollout completes quickly since the old image is already on the nodes. Restarting the Pods would achieve nothing - they would pull the same missing tag. Either way, the lesson generalizes: stuck rollout, old version serving, diagnosis in the new Pods' events.
Helm release failures: status, history, rollback
When the application was installed as a Helm release, debug at the release level first, because Helm tracks its own state independent of any single Deployment. Three commands cover it:
helm status api helm history api helm rollback api 4
helm status shows the release's current state and the notes the chart prints. helm history lists every numbered revision with a status per revision: deployed (the current good state), superseded (replaced by a later revision), failed (the operation errored), and pending states such as pending-upgrade (an operation that started and never completed, often because the Helm process was killed mid-run). A release stuck in a pending state blocks further upgrades until it is resolved, typically by rolling back.
helm rollback returns the release to a previous revision - like kubectl rollout undo, it creates a new revision recording the rollback rather than erasing history.
Two flags shape failure behaviour, and Helm 4 (the current major version) changed both:
| Behaviour | Helm 3 | Helm 4 |
|---|---|---|
| Undo automatically when the operation fails or times out | --atomic | --rollback-on-failure (it also defaults waiting to the watcher strategy) |
| Wait for resources to be ready before reporting success | --wait (off unless set) | --wait takes a strategy: watcher (what --wait alone selects), hookOnly, or legacy. When the flag is omitted the default is hookOnly, which waits for hooks but not for resource readiness |
What the automatic undo does depends on the operation. On a failed upgrade, Helm rolls the release back to the previous successful revision. On a failed first install there is no earlier revision to return to, so the release is uninstalled instead. Apart from progressive-delivery tools such as Argo Rollouts (covered below), this is the only automatic rollback in the toolchain covered here - the Kubernetes Deployment controller never does one.
Keep the layering straight: a helm upgrade that submits a Deployment with a bad image will often report success when it is not waiting for resource readiness - Helm applied the manifests; Kubernetes could not realize them. Debugging then proceeds exactly as in the previous sections, at the Deployment and Pod level, and you choose helm rollback or a corrected helm upgrade to recover.
Observability during delivery: is the new version actually serving?
A rollout that completes is not the same as a release that works. Every readiness probe can pass while the new version returns HTTP 500 on a code path the probe never exercises, doubles latency, or silently drops a downstream integration. The final stage of delivery debugging is therefore observational: compare the system's signals immediately after the deploy against its baseline before it.
The signals to watch are the standard ones - error rate, latency, and traffic - scoped to the moment of the rollout. A step change in the error-rate graph that aligns with the deploy timestamp is the classic post-release signature. At the recognition level KCNA expects: metrics tell you something regressed, logs from the new Pods tell you what, and kubectl logs deployment/api (or logs filtered to the new ReplicaSet's Pods) is the quick path to the latter. During a rollout, remember that old and new Pods serve side by side, so mixed log output and partially-degraded error rates are expected mid-transition.
Readiness probes are your automated gate during the rollout, but they only see what a single Pod reports about itself. A regression in error rate is a fleet-level metric, and it is worth being precise about which tools can act on it:
| Mechanism | What it does with an error-rate signal | Stops a bad release? |
|---|---|---|
| Prometheus alerting rule routed through Alertmanager | Notifies people (chat, paging) | No - someone must still act |
| HorizontalPodAutoscaler on a custom metric | Changes the replica count | No - it scales the bad version, it does not remove it |
| Metric-gated progressive delivery (for example Argo Rollouts analysis) | Evaluates a query while a canary takes traffic | Yes - aborts and rolls back automatically when the analysis fails |
So if a release must be stopped with no one watching, the answer is a metric-gated rollout, not an alert or an autoscaler.
The delivery debugging loop, end to end: watch the rollout (rollout status), read the conditions, diagnose the new Pods, roll back or fix forward, then verify with metrics and logs that the version now serving is actually healthy.
Tip. KCNA frames this topic as short scenarios: a rollout that hangs, new Pods in ImagePullBackOff or Running 0/1 while old Pods keep serving, a ReplicaSet that cannot create Pods, and which command or tool recovers it. Trigger words include rollout status, rollout undo and --to-revision, ProgressDeadlineExceeded, ReplicaFailure, maxSurge and maxUnavailable, revisionHistoryLimit, change-cause, helm history, helm rollback and --rollback-on-failure. Expect to be tested on the facts that Kubernetes never rolls back a Deployment automatically, that readiness probe failures block rollout progress, that the remedy must match the diagnosis, and that only a metric-gated rollout stops a bad release without a human.
- A rolling update only progresses as new Pods become available; a bad release stalls while the old ReplicaSet keeps serving
- maxSurge and maxUnavailable default to 25% (surge rounds up, unavailable rounds down), so a broken 4-replica rollout freezes at 3 old + 2 new Pods
- Deployment conditions: Available, Progressing and, when Pod creation is rejected, ReplicaFailure; ProgressDeadlineExceeded is a reason on Progressing
- progressDeadlineSeconds (default 600) counts from the last progress, and exceeding it triggers no automatic rollback
- ImagePullBackOff = bad image; Running 0/1 with no restarts = readiness failing; climbing RESTARTS = liveness failing; Pending = unschedulable; FailedCreate on the ReplicaSet = quota rejection
- kubectl rollout history --revision=N only shows a revision; rollout undo --to-revision=N restores it, within revisionHistoryLimit (default 10); CHANGE-CAUSE reads kubernetes.io/change-cause
- Match the remedy to the diagnosis: rollback cannot add capacity, and restarting Pods reuses the same broken template
- Helm 4 renamed --atomic to --rollback-on-failure (a failed install is uninstalled) and --wait now takes a strategy; the default hookOnly does not wait for resource readiness
- Alerts notify and HPAs scale; only a metric-gated rollout such as Argo Rollouts analysis aborts a bad release automatically
Frequently asked questions
Why is my Kubernetes rollout stuck?
A rollout stalls when the new Pods never become Ready - or are never created - because a rolling update is gated on availability. Check the new ReplicaSet's Pods with kubectl get pods: ImagePullBackOff means a bad or missing image tag, Running but 0/1 Ready with no restarts means a failing readiness probe, climbing restarts mean a failing liveness probe, Pending means the Pods cannot be scheduled, and CrashLoopBackOff means the new version crashes at startup. If no new Pod exists at all, run kubectl describe replicaset: a FailedCreate event usually means a ResourceQuota rejected it. The old ReplicaSet keeps serving traffic while you diagnose.
Does Kubernetes automatically roll back a failed Deployment?
No. When a rollout makes no progress for progressDeadlineSeconds (600 seconds by default, counted from the last progress), the Deployment's Progressing condition becomes False with reason ProgressDeadlineExceeded, but that is only a status report - Kubernetes does not undo the change, delete the new ReplicaSet, or stop retrying. Recovery is manual or comes from automation you add: run kubectl rollout undo, or apply a corrected manifest to fix forward. Automatic rollback only comes from tooling layered on top: helm upgrade --rollback-on-failure (called --atomic in Helm 3) rolls a release back if the upgrade fails, and progressive-delivery tools such as Argo Rollouts abort a release whose metric analysis fails.
What does ProgressDeadlineExceeded mean?
ProgressDeadlineExceeded is the reason set on a Deployment's Progressing condition when a rollout has made no progress within progressDeadlineSeconds, which defaults to 600 seconds. The window restarts every time the rollout progresses - for example when a new Pod becomes available - so it measures time since the last step forward, not total rollout time. When it fires, the controller marks Progressing=False and kubectl rollout status exits with an error. Nothing else changes: the new ReplicaSet is kept and the old ReplicaSet continues serving, so the Deployment can be Available and ProgressDeadlineExceeded at the same time.
How do I roll back a failed Helm release?
Run helm history, then helm rollback with the revision number you want to restore, for example helm rollback api 4. Helm re-applies that revision's manifests and records the rollback as a new revision, so history is preserved. helm history shows each revision's state - deployed, superseded, failed, or pending states like pending-upgrade - and a release stuck in a pending state usually needs a rollback before further upgrades will proceed. To recover automatically, Helm 4's --rollback-on-failure (Helm 3's --atomic) rolls a failed upgrade back, or uninstalls a failed first install.
What happens to the old ReplicaSet during a rolling update?
The Deployment controller scales the old ReplicaSet down only as new Pods become available, within the maxUnavailable bound, so if the new version never becomes Ready the old ReplicaSet keeps running and serving traffic indefinitely. After a successful rollout the old ReplicaSet is retained at zero replicas as a numbered revision, which is what makes kubectl rollout undo fast. revisionHistoryLimit, default 10, controls how many of these old ReplicaSets are kept before the oldest are garbage collected.
How can I tell if a new release is actually healthy after the rollout completes?
Compare observability signals against the pre-deploy baseline: error rate, latency, and traffic, scoped to the deploy timestamp. A step change in errors aligned with the rollout is the classic bad-release signature even when every readiness probe passed, because probes rarely exercise every code path. Then read logs from the new Pods to find the cause. Progressive delivery tools automate this check - Argo Rollouts can evaluate a metrics query while a canary takes traffic and abort the release if it fails.
What changed in Helm 4 for --atomic and --wait?
Helm 4 renamed the --atomic flag to --rollback-on-failure: on a failed upgrade it rolls the release back to the previous successful revision, and on a failed first install it uninstalls the release, because there is nothing to roll back to. The --wait flag now takes a strategy - watcher (what --wait alone selects), hookOnly or legacy. When the flag is omitted the default is hookOnly, which waits for hooks but not for resources to become ready, so an upgrade can report success while its Deployment is still stuck. Setting --rollback-on-failure defaults waiting to watcher.
What is the difference between a liveness and a readiness probe failure during a rollout?
A failing readiness probe leaves the container running: the Pod shows STATUS Running, READY 0/1 and zero restarts, it is kept out of Service endpoints, and the rollout stalls because the Pod never counts as available. A failing liveness probe makes the kubelet kill and restart the container, so the RESTARTS count climbs and the Pod often ends in CrashLoopBackOff. A startup probe only holds off the other two checks until a slow application has started, so it does not gate a rollout on health.
Source
This lesson covers the "Cloud Native Application Delivery" domain of the official KCNA exam guide. Vendors revise their guides — check the source for the current version.
- KCNA certification page and curriculum — The Linux Foundation
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.