Your Helm releases were all installed under Helm 3 and now upgrade under Helm 4's auto apply mode. How would you plan a move to server-side apply?
answer
- Doing nothing is a real option here
- auto keeps every legacy release where it is
- Two write paths in one estate
- The switching revision carries all the risk
- Resolve per field, never batch the override
basics
~20 sNothing moves on its own: auto inherits each release's existing method, so the estate can stay client-side indefinitely. Migrate release by release with an otherwise unchanged chart, rehearsed against the API server, ordering by blast radius and settling contested fields in the chart rather than forcing them.
solid answer
~50 sStart by accepting that this is optional and decided per release, not a deadline. `--server-side` defaults to `auto` on upgrade, so every legacy release keeps the client-side merge until someone passes `--server-side=true`; doing nothing is a valid state, it just means the estate runs two write paths and nobody can say which release is on which. If you migrate, treat the switch as its own change: hold the chart and values constant so the apply mode is the only variable, rehearse with `--dry-run=server`, and expect the first switched upgrade to surface every accumulated hand-edit and every field another controller owns as a conflict. Resolve those per field — stop templating what a controller legitimately owns, force only what a human once edited — and never batch `--force-conflicts` across a fleet. Order by blast radius, and record which release switched at which revision so an incident reviewer can tell.
code
bash · 9 lines# what is deployed now, and how long its history is
helm history fraud-scoring -n risk
# rehearse the switch: same chart, same values, apply mode is the only change
helm upgrade fraud-scoring ./vendor-scoring-chart -n risk \
--server-side=true --dry-run=server
# land it once the conflicts are resolved in the chart
helm upgrade fraud-scoring ./vendor-scoring-chart -n risk --server-side=truego deeper
You will not be asked to plan this, but know the fact underneath it: an old release keeps its original apply method under Helm 4, so upgrading the CLI changes nothing about how existing releases are written.
Be able to describe the switch itself — an upgrade with --server-side=true, rehearsed with a server dry run, chart unchanged — and why the first switched upgrade is the one that fails.
Show the runbook thinking: isolate the apply mode as the only variable, sequence by blast radius, resolve each conflict in the chart or with a deliberate one-off override, and leave a record of which revision switched.
Own the decision and its cost: whether the fleet migrates at all, what an estate running two write paths costs in surprise, the written ownership convention the migration produces, and why a standing conflict override is a defect rather than a workaround.
The first judgement to demonstrate is that this migration is not forced on you. Helm 4's `--server-side` is a boolean defaulting to `true` on install, but on upgrade and rollback it is a string defaulting to `"auto"`, and `auto` means inherit the previous revision's apply method. Legacy releases therefore keep the Helm 3 client-side three-way merge under a Helm 4 CLI for as long as nobody intervenes. Nothing breaks. The cost of doing nothing is not an outage; it is that your estate quietly runs two write paths with different failure behaviour, and no dashboard tells you which release is on which. ## Decide whether to migrate at all The argument for moving is that server-side apply turns silent drift into an explicit, named conflict, and stops charts from clobbering fields that other controllers legitimately own. The argument for waiting is that every switch is a one-time renegotiation of ownership on a live object, and the releases most worth protecting are the ones with the longest history of hand-edits. A reasonable position for a large estate is: all new releases install server-side by default and stay there, high-churn services migrate deliberately, and a handful of ancient releases are left alone until they are next re-platformed. What is not reasonable is leaving it undecided and undocumented. ## The shape of the risk Take a concrete one: a chart that wraps a vendor image and drives it from a values-generated config file, running the fraud-scoring endpoint, with a 34-revision release history. Across 34 revisions that object has been edited live during at least a few incidents, and other controllers have written to it. Under the client-side path all of that was absorbed silently. The upgrade that switches it to server-side apply is where the API server first asks who owns each field, and that single upgrade can fail on annotations, on replica count, on anything a controller manages. The risk is not spread across the migration; it is concentrated in one revision per release. ## The mechanics of a safe switch Four rules make the switch boring. First, **isolate the variable**: perform the switching upgrade with the chart version and values identical to the currently deployed revision, so a failure can only be about the apply mode. Second, **rehearse**: `--dry-run=server` sends the request to the API server for validation without persisting a revision, which surfaces conflicts before they land in release history. Third, **sequence by blast radius**: a low-traffic internal service first, then one instance of the pattern you have most of, then the rest — the second release usually teaches you the systemic conflicts and the remainder become mechanical. Fourth, **resolve per field, not per fleet**: for each conflict decide whether the chart or the other actor should own the field. Fields an autoscaler or another controller manages come out of the chart; fields a human edited once are taken with a deliberate `--force-conflicts`, after checking the live value you are about to overwrite. ## The anti-pattern to name explicitly The failure mode a principal is expected to head off is `--force-conflicts` becoming a standing flag in the delivery pipeline. It converts every ownership disagreement back into a silent overwrite — exactly the behaviour you migrated to escape — and it does so without the three-way merge's stored-manifest reasoning behind it. If a release needs the flag on every run, that is a chart defect, and the correct output of the migration is a set of chart changes, not a set of flags. ## What migration does not buy you and what it does not undo Be honest about scope. The apply mode changes how objects are written; it does not change how Helm stores releases, how history and rollback work, or what `helm rollback` restores. It is also not a way back: after a release has been switched, `auto` inherits the new method, so a rollback follows the server-side path too — returning a release to the client-side merge is another explicit `--server-side=false`, not a side effect of undoing the revision. And a switched release does not become drift-free; it becomes drift-*loud*, which is only an improvement if somebody is on the other end of those failures. ## Organisational tail Two things outlive the migration. One is a record — in the release's own change log or your platform inventory — of which revision performed the switch, so a future reviewer reading a 34-entry history knows why revision 35 behaved differently from 34. The other is a written ownership convention: which fields charts may render when a controller also writes them. The migration is the moment that convention gets discovered; if it is not written down, the next chart author rediscovers it as a failed production upgrade.
- A team asks to add --force-conflicts to the shared deployment pipeline so migrations stop failing. What do you say?No, and explain why: a standing override turns every ownership disagreement back into a silent overwrite, which is the behaviour the migration was meant to replace. A release that needs the flag on every run has a chart claiming fields something else owns; the fix is a chart change. Keep the flag as a deliberate, one-off human action with the live value checked first.
- Can you roll a release back to the client-side merge if the switch goes badly?Yes, but only explicitly. `helm rollback` also defaults `--server-side` to `auto`, which inherits the last revision's method — now server-side — so undoing the revision does not undo the apply mode. You return a release to the old path by passing `--server-side=false` on an upgrade. Ownership records the API server already holds do not disappear, so plan the switch to succeed rather than relying on reversal.
- How would you decide the order in which releases migrate?By blast radius and by learning value. Start with a low-traffic internal release to prove the runbook, then one representative of your largest chart pattern, because its conflicts are the ones you will meet repeatedly and fixing that chart migrates dozens of releases cheaply. Leave releases with the longest hand-edit history and the tightest availability requirements until the pattern is well understood, or until they are next re-platformed.
saying these in an interview costs you the question
- Treats the migration as urgent or mandatory
- Switches apply mode and chart version in one upgrade
- Plans a fleet-wide run with the conflict override on
- Expects rollback to restore the old apply mode
- Thinks server-side apply removes drift rather than reporting it
- Leaves no record of which revision switched