Kubernetes Helm Values Diff

Compare two values.yaml files by leaf path rather than line by line, so a key moved in the file is not reported as a change. A key present in only one side falls back to the chart's own default there, which is a third value neither file states.

The one you are comparing against, usually the base or the production values.

Paste below, or drop a file anywhere on this panel

Or drop a file anywhere on this panel. Nothing is uploaded: the analysis runs in this tab.

The answer appears here

Paste on the left and press Compare. Nothing leaves this tab.

Examples

Real input you can load into the tool above. Each one shows a different thing going wrong, because that is what the tool is for.

What an upgrade changes

The values that differ between two files, including ones removed entirely

replicas: 3
image:
  tag: "2.0"

A nested override

A deep key changed, shown by path rather than as a line diff

replicas: 1
image:
  tag: "1.0"
resources:
  limits:
    memory: 512Mi

Common mistakes

These are the ones that fail silently. The config is accepted, nothing raises an error, and the consequence arrives later.

  1. Reading a values diff as a manifest diff

    Values feed templates. A changed value may produce no manifest change, or change ten resources.

    Instead:Diff the rendered output when it matters.

  2. Assuming an absent key means default

    A key removed from values falls back to the chart default, which may differ from the previous explicit value.

    Instead:Compare against the chart's values.yaml, not only against the previous file.

  3. Editing values without checking types

    A tag written as 1.0 unquoted becomes a number and renders as 1.

    Instead:Quote version-like values.

A missing key is not the same as an equal key

When a path is absent from one side, that side takes the chart's own default. That default is a third value neither file mentions, and it is where an override silently stops applying.

Lists replace, they never merge

Helm merges values by key, and a list is a value. An override that supplies a two-item list where the base had five does not append or patch: it replaces, and the other three are gone. There is no way to append to a list through values, which is why charts that need it take a map keyed by name instead.

A type change is the one to look at first

A path that is a string in one file and a list in the other, or a map in one and a scalar in the other, nearly always means one of the two was written against a different chart version. This page reports those separately from ordinary value changes for that reason.

What this cannot see

The chart's own values.yaml, which supplies every default and is the third input to any real comparison. Whether a value is used at all, since only the templates know. Run `helm template` with each file to see what actually differs in the output, which is the question underneath this one.