01 · What is still on v1
Legacy releases, found in the cluster.
Every HelmRelease on the old helm.fluxcd.io/v1 API is
listed from the live cluster, then matched to its file in git. A v1
release with no Ready v2 counterpart is a migration candidate.
Here: payments/invoice-renderer, still reconciled by
the Flux v1 Helm operator.
02 · Translate, don't rewrite
Same chart, same version, same values.
The v1 spec is restructured into the v2 shape:
chart.spec.chart, chart.spec.version, a
sourceRef. The values block is carried over
verbatim. A migration is not the moment to change behaviour.
When the model's diff is unusable, a deterministic template built
from the v1 release produces the same result without it.
03 · Sources and wiring
One HelmRepository per chart source, and a file Flux will apply.
v1 embedded the chart repository URL in each release. v2 needs a
HelmRepository object. One is added only when that URL is not
already declared in the repo, so ten releases from one repository
share one source.
New files are wired into the directory's
kustomization.yaml, or left to a Flux Kustomization that
already walks the directory.
04 · A safe cut-over
Two controllers must never fight over one release.
The v2 HelmRelease is only activated when the v1 release is proven
inactive, or proven equivalent and suspended in the same
change. Anything the assistant cannot prove leaves the proposal
held for review with the evidence, not shipped.
A new release landing under a Kustomization with
wait: true gets a banner and high risk: one stuck
release there stalls every sibling.
05 · The v2 file nobody switched on
Which way should the drift be fixed?
Sometimes a v2 file exists in git but was never wired in, while the
live v1 release kept being upgraded by hand. Copying git over the
cluster would be a downgrade.
The running pod's image tag is compared with the chart's
appVersion table to decide the direction. The result is a
values-merge MR held for your confirmation, never shipped on its
own.
06 · Delete second
The v1 object goes only after v2 reports Ready.
Once the v2 HelmRelease for the same release is Ready in the
cluster, the old v1 object is strictly redundant. A separate,
low-risk MR removes it.
Two MRs, two risks: the migration can be reverted without
resurrecting anything, and the deletion never races the cut-over.
07 · Deprecated Flux APIs
One bundled MR per cluster, one line per file.
The cluster reports which versions of each Flux CRD it serves. Every
manifest still on an older served version gets a one-line
apiVersion bump, with comments and key order untouched.
All of them ride one MR per cluster.
When a version is on Flux's published removal schedule, the MR says
which Flux release will stop serving it.
08 · Flux itself
Upgrade the controllers, in the right order.
The Flux version in gotk-components.yaml is compared
with the current flux CLI. When it is behind, the
install manifest is regenerated with the same components and
proposed as an MR.
If deprecated API versions are still in the repo, the upgrade MR
lists them as prerequisites and carries high risk until the bundled
bump MR is merged.