In this episode you'll learn migration strategies toward FluxCD: from manual deployments, Helm 2, and other GitOps tools. Including a comparison of Flux v1 to v2 and ArgoCD to Flux migrations, complete with safe incremental migration practices.

In episode 32 you mastered FluxCD troubleshooting. Now it's time to face the scenario most often seen in the field: legacy systems that must be moved to Flux. In this episode 33 you'll learn migration strategies — from moving manual deployments and Helm 2, understanding the differences in the Flux v1 to v2 migration, mapping ArgoCD concepts to Flux, to incremental migration best practices that don't panic the team.
Organizations that have been deploying with manual kubectl apply have one advantage: the configuration is already in YAML form. The steps: gather all the manifests scattered in shell history and documentation, organize them into one repository, then create a GitRepository and Kustomization to pull them.
flux create source git apps \
--url=https://github.com/devvnull/apps \
--branch=main
flux create kustomization apps \
--source=apps \
--path=./deploy \
--prune=true \
--interval=5mNote
Enable --prune=true with care: Flux will delete resources that exist in the cluster but not in Git. That's the correct behavior, but it needs to be communicated to the team before the migration.
Helm 2 stores state in Tiller (server-side). Before migrating, convert the Helm 2 releases to static manifests or to Helm 3 charts. Flux v2 supports Helm 3 through HelmRepository and HelmRelease, so teams already using charts can still use Flux:
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: nginx
namespace: apps
spec:
interval: 5m
chart:
spec:
chart: ingress-nginx
sourceRef:
kind: HelmRepository
name: ingress-nginx
interval: 1hWhatever the origin, do thorough planning first: inventory the resources, identify dependencies, decide the migration order, and build a rollback path. Never start a migration without knowing how to return to the previous state.
Flux v1 is a single monolithic container. Flux v2 is built from the GitOps Toolkit — a set of controllers that stand on their own (source-controller, kustomize-controller, helm-controller, and others). As a consequence, the way to configure also changes: from a single config file to declarative custom resources.
Flux provides flux bootstrap which at the same time creates the v2 foundation, then the old resources are moved one by one. Run the migration in a non-production environment first:
flux check --pre
flux export kustomization flux-system > flux-system.yamlDuring the transition, Flux v1 and v2 can run side by side on different clusters. After all applications are successfully pulled by v2 and observed to be stable, the cutover is done by stopping v1 and fully moving the GitOps traffic to v2.
Important
Don't let both versions write to the same environment at the same time for long. Coexistence is only safe as a bridge, not as a permanent condition.
ArgoCD and Flux use different models: ArgoCD is based on an Application that references one source with one destination; Flux separates the source (GitRepository) from the application (Kustomization or HelmRelease). The mapping is roughly as follows:
| ArgoCD Concept | Flux v2 Concept |
|---|---|
| Application | Kustomization / HelmRelease |
| Repository | GitRepository / HelmRepository |
| Sync policy (manual/auto) | spec.interval + spec.suspend |
| Sync window | suspend/resume |
| App of Apps | Nested Kustomization (root kustomization) |
| Prune | spec.prune: true |
| Sync hooks | preBuild/postBuild + healthChecks |
An example of translating an ArgoCD Application to a Flux Kustomization:
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: web
namespace: apps
spec:
interval: 5m
path: ./web
prune: true
sourceRef:
kind: GitRepository
name: apps
healthChecks:
- apiVersion: apps/v1
kind: Deployment
name: web
namespace: appsBuild a parallel cluster managed by Flux, test all the applications there without touching the ArgoCD production. Once the results are equivalent, move the applications one by one to the Flux cluster in a low-activity change window.
Tip
Compare the status differences between the two systems with kubectl get and a diff against the manifests. Small differences like labels and annotations are often the culprit during cutover.
Warning
A migration without a rollback plan isn't a migration, it's a leap of faith. Allocate as much time for planning the way back as for moving forward.
In this episode you learned migration strategies to FluxCD from various starting points: manual deployments, Helm 2, other GitOps tools, the Flux v1 to v2 move, and mapping ArgoCD concepts to Flux with an incremental approach.
The key takeaways:
In episode 34, we enter the final stage before production: production checklist & best practices — making sure HA, RBAC, secrets, monitoring, backup, and DR are ready before your applications launch. See you!