skip to content

Server-Side Apply

Helm 4 writes with server-side apply by default: true on install, and auto on upgrade, meaning inherit whatever the last revision used. A conflict with another field manager is the probe.

part ofHelmoverview, primer and where to startread it →
on this pageshow

questions

4

In Helm 4, what does --server-side default to on helm install versus helm upgrade?

level: middleimportance: must knowfreq 55%

answer

  1. The default write path changed in Helm 4
  2. The flag is not the same type everywhere
  3. Install decides; upgrade inherits
  4. auto reads the previous revision's method
  5. A Helm 3 release stays client-side

basics

~20 s

Helm 4 installs with server-side apply: on helm install --server-side is a boolean defaulting to true. On helm upgrade and helm rollback it is a string defaulting to auto, which reuses whatever apply method the previous revision used.

solid answer

~40 s

The flag does not have the same type on both commands. On `helm install`, `--server-side` is a **boolean** and defaults to **true**, so a fresh Helm 4 install writes through server-side apply unless you pass `--server-side=false`. On `helm upgrade` and `helm rollback` it is a **string** defaulting to **`"auto"`**, and `auto` means *inherit the apply method the previous revision used*. The practical consequence is that upgrading your CLI to Helm 4 does not move existing releases onto server-side apply: a release first installed by Helm 3 keeps being written with the old client-side three-way merge on every subsequent upgrade until somebody explicitly passes `--server-side=true`. So in a mixed estate the write path is decided per release at install time, not per CLI version.

code

bash · 9 lines
bash
# install: --server-side is a bool and is already true
helm install fraud-scoring ./vendor-scoring-chart -n risk

# upgrade: --server-side is a string defaulting to "auto" = reuse the last revision's method
helm upgrade fraud-scoring ./vendor-scoring-chart -n risk

# rehearse, then deliberately move an old release onto server-side apply
helm upgrade fraud-scoring ./vendor-scoring-chart -n risk --server-side=true --dry-run=server
helm upgrade fraud-scoring ./vendor-scoring-chart -n risk --server-side=true

go deeper

for a junior

Remember the headline: Helm 4 installs with server-side apply by default, and you normally pass no flag at all. Know that --server-side exists and that false is the opt-out.

for a middle

Be ready to state both defaults precisely — boolean true on install, string "auto" on upgrade and rollback — and explain that auto means inherit the previous revision's method rather than pick the best one.

for a senior

Show that you know what this means for a real estate: releases installed under Helm 3 stay on the old client-side path indefinitely, so the write path varies per release, and moving one is a deliberate upgrade you rehearse with a server dry run.

for a principal

Own the policy question: whether the fleet standardises on one apply mode, who is allowed to flip a release, and how you keep an estate from carrying two write paths for years without anyone tracking which release is on which.

Server-side apply is the write path in which the client sends the whole object it wants to exist and the API server performs the merge, recording which manager set which field. Helm 4 made that its default way of writing rendered manifests, in place of the client-side patch that Helm 3 constructed itself. The flag that controls it is `--server-side`, and its most surprising property is that it is not the same *kind* of flag on every command. ## install: a boolean that is already true On `helm install`, `--server-side` is a plain boolean whose default is `true`. Nothing needs to be passed: a Helm 4 install applies server-side out of the box, and the opt-out is the explicit `--server-side=false`. That is the whole story for a brand-new release, and it is why teams that adopted Helm 4 on a greenfield cluster often never think about the flag at all. ## upgrade and rollback: a string whose default is "auto" On `helm upgrade` and `helm rollback` the same flag name takes a **string**, and its default is `"auto"`. `auto` is not a synonym for `true`. It means *use whatever apply method the previous revision of this release used*. Helm records the method a revision was written with, and `auto` reads it back and reuses it. The values `true` and `false` are also accepted on those commands and force the choice regardless of history. ## Why inheritance instead of a flat default A release is long-lived; the CLI that drives it is not. If the first Helm 4 upgrade of an existing release silently switched the write path, a routine chart bump would become an ownership renegotiation across every object in the release. Under server-side apply the API server begins tracking which manager owns each field, and every field some other actor already owns is a candidate for a conflict that stops the upgrade. Inheriting keeps the version bump boring: your first Helm 4 upgrade of a Helm 3 release writes exactly the way the previous one did, and you choose a separate, deliberate moment to change the write path. ## The consequence people trip on Because `auto` is sticky, a release installed under Helm 3 stays on the client-side three-way merge indefinitely, even after every operator in the team has been on Helm 4 for months. Two releases sitting side by side in the same namespace can be written by two different mechanisms, and they will behave differently the first time somebody hand-edits a field on a live object or another controller writes to one. "We are on Helm 4, so we are on server-side apply" is therefore false for exactly the releases that have been around longest, which are usually the ones that matter. The same stickiness applies in reverse: once a revision has been applied server-side, `auto` keeps later upgrades — and rollbacks — server-side. ## Flipping a release over To move an existing release, pass `--server-side=true` on an upgrade. That is the moment every accumulated hand-edit and every field owned by another controller can surface as a conflict, so rehearse it: `--dry-run=server` sends the request to the API server for validation without persisting a revision, which is the closest you get to a preview of the switch. Keep the chart identical across that upgrade so the apply mode is the only variable; if it fails, you know why. After it succeeds, the recorded method carries forward on its own. ## Do not confuse it with the force flags Three Helm 4 flags live near each other and are routinely muddled. `--server-side` chooses the write path. `--force-conflicts` overrides field-manager conflicts *within* server-side apply — it does not enable server-side apply and it is meaningless without it. `--force-replace` (whose deprecated alias is the bare `--force`) is an entirely different idea, and Helm rejects `--force-replace` and `--force-conflicts` together because they are mutually exclusive. A candidate who says "`--force` makes Helm win the server-side conflict" has merged three mechanisms into one. ## What it does not change The apply mode changes how the object reaches the cluster; it does not change Helm's own bookkeeping. Each revision is still stored as a release record with the rendered manifest inside it, history and rollback still read that record, and the release's identity, namespace and revision numbering are untouched. Reading `--server-side=auto` as "Helm decides intelligently what is best for this object" is the other common misreading: `auto` is a lookup of one recorded fact about the previous revision, nothing more.

  • How do you move a release that has always been applied client-side onto server-side apply?
    Pass `--server-side=true` on the next `helm upgrade`, with the chart otherwise unchanged so the apply mode is the only variable. Rehearse it first with `--dry-run=server`, because that upgrade is where fields owned by other managers turn into conflicts. Once the revision is recorded as server-side applied, the default `auto` keeps later upgrades on that path without the flag.
  • Does helm rollback follow the same rule?
    Yes. On `helm rollback`, `--server-side` is the same string flag defaulting to `auto`, so a rollback reuses the apply method the previous revision used rather than switching paths. That also means a rollback is not a way back to the client-side merge after you have moved a release to server-side apply — you would have to ask for `--server-side=false` explicitly.
  • Does --server-side=false on an upgrade break anything about history or rollback?
    No. The apply mode only decides how the object is written to the API server. Helm still stores a release record per revision with the rendered manifest in it, `helm history` still lists every revision, and `helm rollback` still restores from the stored manifest. What changes is who computes the merge and whether field ownership is tracked.

Install is where you pick the lane; upgrade with auto just stays in the lane the last driver was in, however new your car is.

saying these in an interview costs you the question

  • Says Helm 4 needs --server-side passed explicitly to use it
  • Assumes upgrading the CLI moves existing releases to server-side apply
  • Treats --server-side as a boolean on upgrade too
  • Reads auto as Helm choosing the best mode per object
  • Claims --force turns on server-side conflict resolution
  • Thinks the apply mode changes how revisions are stored

context

open as a page

How does Helm 4's server-side apply differ from Helm 3's client-side three-way merge on upgrade?

level: middleimportance: should knowfreq 38%

basics

~20 s

Helm 3 built the patch itself from three inputs: the manifest stored with the previous revision, the newly rendered manifest, and the live object. Helm 4 sends the whole rendered object and the API server merges it, tracking which manager owns each field.

open as a page

A Helm 4 upgrade fails on an apply conflict with another field manager. What does --force-conflicts do, and when is it the wrong fix?

level: seniorimportance: should knowfreq 44%

basics

~20 s

The conflict means another manager already owns the fields Helm is trying to set. --force-conflicts tells the API server to override that and hand ownership to Helm. It is wrong when the other owner is a controller that will immediately write the field back.

open as a page

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?

level: principalimportance: nice to knowfreq 24%

basics

~20 s

Nothing 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.

open as a page