Skip to content

Commit 8a283d5

Browse files
scotwellsclaude
andcommitted
fix: drive companion GC off WorkloadDeployment events to avoid cluster-wide informer OOM
The CompanionGCReconciler previously registered For(&corev1.ConfigMap{}) which established a cluster-wide ConfigMap informer with no label-scoped cache on the cell manager. On a cell cluster this caused controller-runtime to sync and hold every ConfigMap (and, via lazy cache reads, every Secret) in the cluster, pushing the cell compute-manager well past its 128Mi limit → OOMKilled / CrashLoopBackOff. Fix: change the For type to WorkloadDeployment. WorkloadDeployments are already cached on the cell by the sibling WorkloadDeploymentReconciler, so this adds no new cluster-wide informer. A WD delete event still enqueues the object's namespace and fires Reconcile, which is the deletion trigger the GC needs. All companion reads (ConfigMap/Secret List) inside Reconcile go through cl.GetAPIReader() (uncached). A one-shot List via the API reader does not establish a persistent informer, so it does not re-introduce the OOM. WD liveness checks use the cached client because WDs are already in the cell cache. Reconcile now sweeps the entire WD namespace (listing companions by label via the uncached reader) rather than reconciling a single named object, and returns ctrl.Result{} (event-driven only, no per-WD requeue). The periodic backstop coverage gap is closed by a companionGCBackstop Runnable (implements mcmanager.Runnable = manager.Runnable + multicluster.Aware). On Engage it records each cell cluster; on each ticker interval it lists ALL companions cluster-wide via the uncached APIReader, collects distinct namespaces, and sends namespace-keyed GenericEvents into a buffered channel wired via WatchesRawSource(source.TypedChannel). This covers namespaces whose last WD was deleted before the controller started, which For(WD) would never enqueue. The steady-state load is bounded to one cross-namespace List per interval regardless of WD history, and no persistent CM/Secret informer is ever created. The federator's companionsStillPresent check (workloaddeployment_federator.go) reads from FederationClient (the Karmada hub client) and is unaffected by this change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> (cherry picked from commit 9a064cc)
1 parent aefc415 commit 8a283d5

2 files changed

Lines changed: 477 additions & 107 deletions

File tree

0 commit comments

Comments
 (0)