diff --git a/lib/manager/flux/artifacts.spec.ts b/lib/manager/flux/artifacts.spec.ts
index 16e81ce062910b2d231919c3bf74a0298a9bc31f..393c43724514cde0cc42f31ebbe7e9b5b3f0cf6a 100644
--- a/lib/manager/flux/artifacts.spec.ts
+++ b/lib/manager/flux/artifacts.spec.ts
@@ -14,13 +14,21 @@ describe('manager/flux/artifacts', () => {
   });
 
   it('replaces existing value', async () => {
-    mockExecAll(exec, { stdout: '', stderr: '' });
+    const snapshots = mockExecAll(exec, { stdout: '', stderr: '' });
     fs.readLocalFile.mockResolvedValueOnce('old');
     fs.readLocalFile.mockResolvedValueOnce('test');
 
     const res = await updateArtifacts({
       packageFileName: 'clusters/my-cluster/flux-system/gotk-components.yaml',
-      updatedDeps: [{ newVersion: '1.0.1' }],
+      updatedDeps: [
+        {
+          newVersion: '1.0.1',
+          managerData: {
+            components:
+              'source-controller,kustomize-controller,helm-controller,notification-controller',
+          },
+        },
+      ],
       newPackageFileContent: undefined,
       config: {},
     });
@@ -34,6 +42,9 @@ describe('manager/flux/artifacts', () => {
         },
       },
     ]);
+    expect(snapshots[0].cmd).toBe(
+      'flux install --export --components source-controller,kustomize-controller,helm-controller,notification-controller > clusters/my-cluster/flux-system/gotk-components.yaml'
+    );
   });
 
   it('ignores non-system manifests', async () => {
diff --git a/lib/manager/flux/artifacts.ts b/lib/manager/flux/artifacts.ts
index 85f984c422e9ad0b1930ddc681caafda9b009207..d543603759949dc8869f25ba83c85666c5310d4e 100644
--- a/lib/manager/flux/artifacts.ts
+++ b/lib/manager/flux/artifacts.ts
@@ -10,13 +10,18 @@ export async function updateArtifacts({
   packageFileName,
   updatedDeps,
 }: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {
-  if (!isSystemManifest(packageFileName) || !updatedDeps[0]?.newVersion) {
+  const systemDep = updatedDeps[0];
+  if (!isSystemManifest(packageFileName) || !systemDep?.newVersion) {
     return null;
   }
   const existingFileContent = await readLocalFile(packageFileName);
   try {
     logger.debug(`Updating Flux system manifests`);
-    const cmd = `flux install --export > ${quote(packageFileName)}`;
+    const args: string[] = ['--export'];
+    if (systemDep.managerData?.components) {
+      args.push('--components', quote(systemDep.managerData.components));
+    }
+    const cmd = `flux install ${args.join(' ')} > ${quote(packageFileName)}`;
     const execOptions: ExecOptions = {
       docker: {
         image: 'sidecar',
diff --git a/lib/manager/flux/extract.spec.ts b/lib/manager/flux/extract.spec.ts
index 92d2edeca73b3c9aa125f0c162b96280dc7f0fd6..2b2e2b18393569db2abf1528df633deea56d95fd 100644
--- a/lib/manager/flux/extract.spec.ts
+++ b/lib/manager/flux/extract.spec.ts
@@ -29,7 +29,7 @@ describe('manager/flux/extract', () => {
         ],
       });
     });
-    it('extracts version from system manifests', () => {
+    it('extracts version and components from system manifests', () => {
       const result = extractPackageFile(
         loadFixture('system.yaml'),
         'clusters/my-cluster/flux-system/gotk-components.yaml'
@@ -40,10 +40,21 @@ describe('manager/flux/extract', () => {
             currentValue: 'v0.24.1',
             datasource: 'github-releases',
             depName: 'fluxcd/flux2',
+            managerData: {
+              components:
+                'source-controller,kustomize-controller,helm-controller,notification-controller',
+            },
           },
         ],
       });
     });
+    it('considers components optional in system manifests', () => {
+      const result = extractPackageFile(
+        `# Flux Version: v0.27.0`,
+        'clusters/my-cluster/flux-system/gotk-components.yaml'
+      );
+      expect(result.deps[0].managerData.components).toBeUndefined();
+    });
     it('ignores system manifests without a version', () => {
       const result = extractPackageFile(
         'not actually a system manifest!',
diff --git a/lib/manager/flux/extract.ts b/lib/manager/flux/extract.ts
index 7c1cb51b53fc992338330235a8590ad1791137d7..bc58a0dfe15a4df4895eca1f48a50989dd9c5447 100644
--- a/lib/manager/flux/extract.ts
+++ b/lib/manager/flux/extract.ts
@@ -10,7 +10,9 @@ import type { FluxManifest, FluxResource, ResourceFluxManifest } from './types';
 
 function readManifest(content: string, file: string): FluxManifest | null {
   if (isSystemManifest(file)) {
-    const versionMatch = regEx(/#\s*Flux\s+Version:\s*(\S+)/).exec(content);
+    const versionMatch = regEx(
+      /#\s*Flux\s+Version:\s*(\S+)(?:\s*#\s*Components:\s*([A-Za-z,-]+))?/
+    ).exec(content);
     if (!versionMatch) {
       return null;
     }
@@ -18,6 +20,7 @@ function readManifest(content: string, file: string): FluxManifest | null {
       kind: 'system',
       file: file,
       version: versionMatch[1],
+      components: versionMatch[2],
     };
   }
 
@@ -79,6 +82,9 @@ function resolveManifest(
           depName: 'fluxcd/flux2',
           datasource: GithubReleasesDatasource.id,
           currentValue: manifest.version,
+          managerData: {
+            components: manifest.components,
+          },
         },
       ];
     case 'resource':
diff --git a/lib/manager/flux/types.ts b/lib/manager/flux/types.ts
index 69e88a4631edf1f203cbb53ef912b8fb6675942b..b048afea8a2b4b77bf4d8b4df64f6905482aa7c1 100644
--- a/lib/manager/flux/types.ts
+++ b/lib/manager/flux/types.ts
@@ -48,6 +48,7 @@ export interface ResourceFluxManifest extends FluxFile {
 export interface SystemFluxManifest extends FluxFile {
   kind: 'system';
   version: string;
+  components: string;
 }
 
 export type FluxManifest = ResourceFluxManifest | SystemFluxManifest;