Reference¶
Scope
Look-up facts for Flux 2.x: release and support matrix, bundled controller versions, every CRD with its served API version, removed APIs, controller ports and default resources, multi-tenancy flags, authentication and notification options, Flux Operator APIs, and the hardening checklist. Facts are pinned to Flux v2.9.5 (2026-08-31) unless a row says otherwise.
Release and Support Matrix¶
Flux ships a minor release roughly two weeks after each Kubernetes minor release (at least three per year). The project supports the last three minor releases. Each new minor supports Kubernetes N-2 (Flux releases policy).
| Flux minor | GA date | Latest patch (date) | Kubernetes supported | OpenShift | APIs removed in this minor | Status (2026-09) |
|---|---|---|---|---|---|---|
| 2.9 | 2026-06-30 | v2.9.5 (2026-08-31) | 1.34, 1.35, 1.36 | 4.21 | image.toolkit.fluxcd.io/v1beta2, notification.toolkit.fluxcd.io/v1beta2 |
Supported (current) |
| 2.8 | 2026-02-24 | v2.8.8 (2026-05-20) | 1.33, 1.34, 1.35 | 4.20 | source.toolkit.fluxcd.io/v1beta2, kustomize.toolkit.fluxcd.io/v1beta2, helm.toolkit.fluxcd.io/v2beta2 |
Supported |
| 2.7 | 2025-09-30 | TBD — not checked | 1.32, 1.33, 1.34 | 4.19 | source/v1beta1, kustomize/v1beta1, helm/v2beta1, image/v1beta1, notification/v1beta1 |
Supported until the next minor ships |
| 2.6 | 2025-05-29 | — | — | — | — | End of life (announced with 2.9) |
| 2.5 | 2025-02-20 | — | — | — | — | End of life (announced with 2.8) |
Removed APIs block upgrades
Run flux migrate (cluster) or flux migrate -f . (Git checkout) before upgrading to 2.8 or 2.9. The official step-by-step path is Upgrade Procedure for Flux v2.7+. See How-to Guides: Upgrade Flux.
Sources: Flux 2.9 announcement, Flux 2.8 announcement, Flux 2.7 announcement, flux2 releases.
Release Artifacts¶
Every release publishes: CLI binaries (Linux, macOS, Windows), multi-arch CLI images (ghcr.io/fluxcd/flux-cli, docker.io/fluxcd/flux-cli), controller manifests, OCI artifacts with the manifests, an SPDX SBOM, SLSA provenance, and Cosign-signed checksums (Flux releases).
Flux v2.9.5 Component Versions¶
Controller versions bundled in the release/v2.9.x branch of fluxcd/flux2 (manifests/bases/*/kustomization.yaml).
| Component | Version | Installed by default | Notes |
|---|---|---|---|
source-controller |
v1.9.5 | Yes | Helm v4.2.4 (upstream; the temporary Flux fork was dropped in 2.9.5) |
kustomize-controller |
v1.9.5 | Yes | Kustomize API v0.21.x |
helm-controller |
v1.6.4 | Yes | Helm v4 SDK since Flux 2.8 |
notification-controller |
v1.9.4 | Yes | |
image-reflector-controller |
v1.2.5 | Opt-in (--components-extra) |
|
image-automation-controller |
v1.2.5 | Opt-in (--components-extra) |
|
source-watcher |
v2.2.4 | Opt-in (--components-extra=source-watcher) |
Serves ArtifactGenerator, added in Flux 2.7 |
| Kubernetes libraries | 1.36.4 | — | k8s.io/* v0.36.4 |
Controllers and CRDs¶
Served (and storage) API version per CRD, read from each controller's config/crd/bases at the tag bundled with Flux v2.9.5. Every CRD serves exactly one version.
| Controller | Kind | API version | Purpose |
|---|---|---|---|
| source-controller | GitRepository |
source.toolkit.fluxcd.io/v1 |
Clone Git at a branch/tag/semver/commit, package as tarball artifact |
| source-controller | OCIRepository |
source.toolkit.fluxcd.io/v1 |
Pull OCI artifacts (manifests or Helm charts) from container registries |
| source-controller | HelmRepository |
source.toolkit.fluxcd.io/v1 |
Index an HTTP/S Helm repository (or OCI repo, legacy mode) |
| source-controller | HelmChart |
source.toolkit.fluxcd.io/v1 |
Package a chart from a HelmRepository, GitRepository or Bucket |
| source-controller | Bucket |
source.toolkit.fluxcd.io/v1 |
Fetch objects from S3-compatible storage, GCS, Azure Blob |
| source-controller | ExternalArtifact |
source.toolkit.fluxcd.io/v1 |
Artifact produced by a third-party controller (for example source-watcher) |
| source-watcher | ArtifactGenerator |
source.extensions.fluxcd.io/v1beta1 |
Compose several sources into one artifact or split a monorepo into many |
| kustomize-controller | Kustomization |
kustomize.toolkit.fluxcd.io/v1 |
Build with Kustomize, SOPS-decrypt, substitute, server-side apply, prune, health-check |
| helm-controller | HelmRelease |
helm.toolkit.fluxcd.io/v2 |
Install/upgrade/test/rollback/uninstall Helm releases with remediation |
| notification-controller | Provider |
notification.toolkit.fluxcd.io/v1beta3 |
Outbound target (Slack, Teams, Git commit status, OTel) |
| notification-controller | Alert |
notification.toolkit.fluxcd.io/v1beta3 |
Route events from Flux objects to Providers |
| notification-controller | Receiver |
notification.toolkit.fluxcd.io/v1 |
Inbound webhook that triggers reconciliation |
| image-reflector-controller | ImageRepository |
image.toolkit.fluxcd.io/v1 |
Scan a registry for tags |
| image-reflector-controller | ImagePolicy |
image.toolkit.fluxcd.io/v1 |
Select the latest tag (semver, alphabetical, numerical) |
| image-automation-controller | ImageUpdateAutomation |
image.toolkit.fluxcd.io/v1 |
Commit and push tag updates to Git using setter markers |
Two API versions still in beta
Alert and Provider remain v1beta3, and ArtifactGenerator is v1beta1 (under the separate source.extensions.fluxcd.io group). Everything else is GA. Referencing an ExternalArtifact from a Kustomization or HelmRelease requires --feature-gates=ExternalArtifact=true on kustomize-controller and helm-controller; flux install/flux bootstrap add this patch automatically when source-watcher is among the components (flux2 pkg/manifestgen/install/templates.go).
API Version History¶
| API group | Stable version | Beta versions removed |
|---|---|---|
source.toolkit.fluxcd.io |
v1 (GitRepository GA in 2.0; OCIRepository GA in 2.6) | v1beta1 (2.7), v1beta2 (2.8) |
kustomize.toolkit.fluxcd.io |
v1 (2.0) | v1beta1 (2.7), v1beta2 (2.8) |
helm.toolkit.fluxcd.io |
v2 (2.3) | v2beta1 (2.7), v2beta2 (2.8) |
image.toolkit.fluxcd.io |
v1 (2.7) | v1beta1 (2.7), v1beta2 (2.9) |
notification.toolkit.fluxcd.io |
v1 for Receiver; v1beta3 for Alert/Provider | v1beta1 (2.7), v1beta2 (2.9) |
Note: the "GA in" versions for GitRepository (2.0), HelmRelease v2 (2.3) and OCIRepository (2.6) come from earlier release announcements and were not re-verified in this pass.
Flux Operator APIs¶
The Flux Operator is a separate project from ControlPlane (AGPL-3.0). Latest release v0.60.0 (2026-09-11) (releases).
| Kind | API version | Purpose |
|---|---|---|
FluxInstance |
fluxcd.controlplane.io/v1 |
Declarative install, configure, and upgrade of the Flux controllers (spec.distribution.version: "2.x"), plus optional cluster sync (spec.sync) from Git, OCI or Bucket |
FluxReport |
fluxcd.controlplane.io/v1 |
Read-only report of Flux readiness, distribution, CRD versions, reconciler stats, sync status |
ResourceSet |
fluxcd.controlplane.io/v1 |
Template a group of Flux and Kubernetes objects over a matrix of inputs (<< inputs.x >> syntax) |
ResourceSetInputProvider |
fluxcd.controlplane.io/v1 |
Feed ResourceSet inputs from external systems (for example GitHub pull requests, GitLab merge requests) |
Other Flux Operator features: the Flux Web UI (port 9080 on svc/flux-operator, OIDC SSO), the Flux MCP Server for AI assistants, and a flux-operator CLI (README).
Ports and Default Resources¶
From each controller's config/manager/deployment.yaml at the version bundled with Flux v2.9.5.
| Controller | Ports | CPU request / limit | Memory request / limit | Volumes |
|---|---|---|---|---|
| source-controller | 9090 http (artifact server), 8080 metrics, 9440 healthz |
50m / 1000m | 64Mi / 1Gi | /data emptyDir (artifacts), /tmp emptyDir |
| kustomize-controller | 8080 metrics, 9440 healthz | 100m / 1000m | 64Mi / 1Gi | /tmp emptyDir |
| helm-controller | 8080 metrics, 9440 healthz | 100m / 1000m | 64Mi / 1Gi | /tmp emptyDir |
| notification-controller | 9090 http (events), 9292 http-webhook (Receivers), 8080 metrics, 9440 healthz |
100m / 1000m | 64Mi / 1Gi | /tmp emptyDir |
| image-reflector-controller | 8080 metrics, 9440 healthz | 100m / 1000m | 64Mi / 1Gi | /tmp emptyDir |
| image-automation-controller | 8080 metrics, 9440 healthz | 100m / 1000m | 64Mi / 1Gi | /tmp emptyDir |
| source-watcher | 9090 http (artifact server), 8080 metrics, 9440 healthz |
50m / 1000m | 64Mi / 1Gi | /data emptyDir |
Performance and Scaling¶
Reconciliation Profiles¶
Unsourced estimates
The two tables below are rough, unverified estimates carried over from an earlier version of this page. They do not come from controlled benchmarks with recorded hardware, versions, or methodology. Use them only as orientation and benchmark your own workload. The flux2 project publishes no official per-object scaling limits (as of 2026-09).
| Scale | GitRepositories | HelmReleases | Kustomizations | Reconcile interval |
|---|---|---|---|---|
| Small | 10 | 20 | 10 | 1m |
| Medium | 50 | 100 | 50 | 5m |
| Large | 200 | 500 | 200 | 10m |
| Dimension | Tested | Recommended | Bottleneck |
|---|---|---|---|
| GitRepositories per cluster | 500 | 200 | source-controller memory |
| HelmReleases per cluster | 1,000 | 500 | helm-controller CPU |
| Kustomizations per cluster | 500 | 200 | API server load |
Scaling Levers (Documented)¶
| Lever | Where | Effect |
|---|---|---|
--concurrent |
each controller | Number of parallel reconciles per controller |
| Interval jitter | controller flag (see each controller's options page) | Spreads objects that share the same spec.interval |
| Sharding | label sharding.fluxcd.io/key + extra controller replicas |
Splits objects across controller instances (Flux sharding) |
cluster.size / sharding in FluxInstance |
Flux Operator | Operator presets for vertical scaling and shards (Flux Operator docs) |
GitRepository.spec.sparseCheckout |
source-controller | Checks out only listed directories |
GitRepository.spec.ignore / .sourceignore |
source-controller | Shrinks the packaged artifact (fetch still full) |
Multi-Tenancy Lockdown Flags¶
From Flux multi-tenancy lockdown.
| Flag | Controllers | Effect |
|---|---|---|
--no-cross-namespace-refs=true |
kustomize-, helm-, notification-, image-reflector-, image-automation-controller | Objects can only reference sources and events in their own namespace |
--no-remote-bases=true |
kustomize-controller | Blocks Kustomize remote bases, so only Flux sources can change cluster state |
--default-service-account=default |
kustomize-, helm-controller | Objects without spec.serviceAccountName impersonate the tenant namespace's default SA (no permissions) |
spec.serviceAccountName: kustomize-controller on the flux-system Kustomization |
— | Keeps the platform-admin sync running with cluster-admin |
GitRepository Authentication¶
From the GitRepository v1 spec.
| Method | Configuration | Typical use |
|---|---|---|
| SSH | Secret with identity (private key) and known_hosts |
Deploy keys created by flux bootstrap |
| HTTPS basic auth | Secret with username, password (PAT) |
GitHub/GitLab PATs, self-hosted Git |
| HTTPS bearer token | Secret with bearerToken |
Token-only Git servers |
| HTTPS mTLS / custom CA | Secret with tls.crt, tls.key, ca.crt |
Private Git servers |
| GitHub App | spec.provider: github + Secret with githubAppID, githubAppPrivateKey, and one of githubAppInstallationID / githubAppInstallationOwner (githubAppBaseURL for GHES) |
Short-lived installation tokens, no user PAT |
| Azure DevOps Workload Identity | spec.provider: azure (+ optional spec.serviceAccountName) |
Keyless on AKS |
| AWS CodeCommit Workload Identity | spec.provider: aws |
Keyless on EKS (new in 2.9) |
Git commit verification (spec.verify.mode: HEAD, Tag, TagAndHEAD) accepts PGP public keys (*.asc keys) and, since 2.9, SSH public keys (*.sshpub keys).
OCIRepository Verification¶
| Provider | Key material | Notes |
|---|---|---|
cosign (key-based) |
Secret with *.pub keys |
|
cosign (keyless) |
spec.verify.matchOIDCIdentity (issuer, subject regex) |
Custom Sigstore trusted root for self-hosted Rekor/Fulcio since 2.9; Cosign v3 since 2.8 |
notation |
Secret with trust policy and CA certs | Notary Project signatures |
SOPS Decryption Backends¶
Kustomization.spec.decryption.provider supports only sops (Kustomization spec).
| Backend | Secret entry / auth | Notes |
|---|---|---|
| age | key ending in .agekey |
Recommended. Post-quantum age cipher supported since 2.9 |
| OpenPGP | key ending in .asc |
Legacy |
| AWS KMS | static credentials or Workload Identity (spec.decryption.serviceAccountName) |
|
| Azure Key Vault | static credentials or Workload Identity | |
| GCP KMS | static credentials or Workload Identity | |
| OpenBao / HashiCorp Vault | token, or Kubernetes auth via Workload Identity (2.9) |
Controller-global decryption (one key set for all Kustomizations) exists for age keys (2.7) and cloud KMS / Vault.
Notification Provider Types¶
Provider.spec.type values in notification-controller v1.9.4: alertmanager, azuredevops, bitbucket, bitbucketserver, datadog, discord, forwarder, gitea, github, githubdispatch, gitlab, grafana, matrix, msteams, opsgenie, pagerduty, rocket, sentry, slack, webex, zulip, otel. Flux 2.8 added PR/MR comment providers githubpullrequestcomment, gitlabmergerequestcomment and giteapullrequestcomment (Flux 2.8 announcement).
Receiver.spec.type values: generic, generic-hmac, generic-oidc (2.9), github (also used for Gitea), gitlab, bitbucket (Bitbucket Server), harbor, dockerhub, quay, nexus, acr, gcr, cdevents (Receiver spec).
Feature Gates of Note¶
| Feature gate | Controller(s) | Default (v2.9.5) | Purpose |
|---|---|---|---|
CancelHealthCheckOnNewRevision |
kustomize-controller (2.7), helm-controller (2.8) | Off | Abort running health checks when a new revision or spec change arrives |
DefaultToRetryOnFailure |
helm-controller | Off | Retry-on-failure remediation by default; recommended with the gate above |
UseHelm3Defaults |
helm-controller | Off | Restore Helm 3 behaviour: client-side apply, legacy readiness, nohooks post-render |
ExternalArtifact |
kustomize-controller, helm-controller | Off (auto-enabled by the CLI when source-watcher is installed) | Allow ExternalArtifact source references (needed for ArtifactGenerator output) |
DisableChartDigestTracking |
helm-controller | Off | Stop appending the OCI digest to the chart version |
StrictPostBuildSubstitutions |
kustomize-controller | On (opt-out since 2.9) | Fail on unresolved ${VAR} substitutions without defaults |
GitSparseCheckout |
image-automation-controller | Off | Sparse checkout for ImageUpdateAutomation clones (2.7) |
GitShallowClone, GitAllBranchReferences, GitForcePushBranch |
image-automation-controller | On | Git behaviour of image automation |
Defaults read from each controller's internal/features/features.go at the bundled tag.
Hardening Checklist¶
- Enable
--no-cross-namespace-refs=trueon all controllers for multi-tenancy - Enable
--no-remote-bases=trueon kustomize-controller - Set
--default-service-account=defaulton kustomize-controller and helm-controller - Use SOPS or External Secrets Operator for secrets management (never commit plaintext)
- Enable Git commit (PGP or SSH) or OCI (Cosign or Notation) verification on
GitRepositoryandOCIRepositoryresources - Store SOPS decryption keys in K8s Secrets with strict RBAC (only controller SA has read), or use Workload Identity with a cloud KMS
- Apply NetworkPolicies to restrict controller traffic (
flux install/bootstrapgenerate default NetworkPolicies;--network-policydefaults totrue); add egress rules for Git/registry hosts if needed - Run controllers with
SecurityContext(non-root, read-only root filesystem, drop all capabilities); upstream manifests already do this - Verify Flux controller image signatures with Cosign or an admission policy (Kyverno, Sigstore policy-controller)
- Prefer GitHub App or Workload Identity auth over long-lived PATs and SSH keys
- Keep
flux-systemnamespace restricted. Tenants must not have access to it - Secure webhook Receivers with HMAC or (2.9+) OIDC tokens
- Stay on a supported minor (last three) and the latest patch (for example CVE-2026-40109 fixed in 2.9)