01 · What is still on v1
Legacy releases, found in the cluster.
The assistant lists every HelmRelease on the old
helm.fluxcd.io/v1 API from the live cluster. A
HelmRelease is the Flux object that installs a Helm chart (a
packaged application). The assistant then matches each one 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 assistant restructures the v1 spec into the v2 shape:
chart.spec.chart, chart.spec.version and a
sourceRef. It copies the values block
verbatim. A migration is not the moment to change behaviour.
Sometimes the AI model (LLM) writes a diff that nobody can use. Then
a rule-based (deterministic) template, built from the v1 release,
produces the same result without the model.
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. The assistant adds one only when the
repository does not yet declare that URL. So ten releases from one
chart repository share one source.
If a Flux Kustomization already walks the directory, the assistant
leaves new files to it. Otherwise it adds them to the directory's
kustomization.yaml.
04 · A safe cut-over
Two controllers must never fight over one release.
The assistant activates the v2 HelmRelease only in two cases. In
the first, it has proven that the v1 release is inactive. In the
second, it has proven that v1 is equivalent and suspended
in the same change. If the assistant cannot prove either case, it
holds the proposal for review with the evidence. It does not ship
the proposal.
A new release can land under a Kustomization with
wait: true. Then it gets a banner and high risk,
because 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 nobody wired it in. Meanwhile
people kept upgrading the live v1 release by hand. Copying git over
the cluster would then be a downgrade.
The assistant compares the running pod's image tag with the chart's
appVersion table to find the direction of the fix. The result is a
values-merge MR that the assistant holds for your confirmation. It
never ships it 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.
So two MRs carry two separate risks. You can revert the migration
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 (a custom
resource type) it serves. Every manifest that still uses an older
served version gets a one-line apiVersion bump. The
bump leaves comments and key order untouched. All bumps go into one
MR for each cluster.
Flux publishes a removal schedule. When a version is on that
schedule, the MR says which Flux release will stop serving it.
08 · Flux itself
Upgrade the controllers, in the right order.
The assistant compares the Flux version in
gotk-components.yaml with the current
flux CLI. When the file is behind, the assistant
regenerates the install manifest with the same components. It
proposes the result as an MR.
If deprecated API versions are still in the repository, the upgrade
MR lists them as prerequisites. It carries high risk until you
merge the bundled bump MR.