@@ -66,10 +66,10 @@ var (
6666 gitTreeState = "unknown"
6767 buildDate = "unknown"
6868
69- // upstreamRestConfig holds the REST config for the upstream federation control
70- // plane (Karmada) . It is populated from --upstream -kubeconfig when set, and
71- // is nil when the flag is omitted.
72- upstreamRestConfig * rest.Config
69+ // federationRestConfig holds the REST config for the Karmada federation control
70+ // plane. It is populated from --federation -kubeconfig when set, and is nil
71+ // when the flag is omitted.
72+ federationRestConfig * rest.Config
7373)
7474
7575func init () {
@@ -86,14 +86,15 @@ func init() {
8686 // +kubebuilder:scaffold:scheme
8787}
8888
89+ //nolint:gocyclo // main wires all controller paths; complexity is inherent to startup sequencing
8990func main () {
9091
9192 var enableLeaderElection bool
9293 var leaderElectionNamespace string
9394 var probeAddr string
9495 var serverConfigFile string
95- var upstreamKubeconfig string
96- var upstreamContext string
96+ var federationKubeconfig string
97+ var federationContext string
9798 var enableManagementControllers bool
9899 var enableCellControllers bool
99100
@@ -102,11 +103,12 @@ func main() {
102103 "Enable leader election for controller manager. " +
103104 "Enabling this will ensure there is only one active controller manager." )
104105 flag .StringVar (& leaderElectionNamespace , "leader-elect-namespace" , "" , "The namespace to use for leader election." )
105- flag .StringVar (& upstreamKubeconfig , "upstream-kubeconfig" , "" ,
106- "Path to the kubeconfig file for the upstream federation control plane (Karmada). " +
106+ flag .StringVar (& federationKubeconfig , "federation-kubeconfig" , "" ,
107+ "Path to the kubeconfig file for the Karmada federation control plane. " +
108+ "Required when --enable-management-controllers is set. " +
107109 "When omitted, federation features are disabled." )
108- flag .StringVar (& upstreamContext , "upstream -context" , "" ,
109- "Context to use from the upstream kubeconfig. When omitted, the current context is used." )
110+ flag .StringVar (& federationContext , "federation -context" , "" ,
111+ "Context to use from the federation kubeconfig. When omitted, the current context is used." )
110112 flag .BoolVar (& enableManagementControllers , "enable-management-controllers" , false ,
111113 "Enable management-plane controllers (WorkloadDeploymentFederator, InstanceProjector)." )
112114 flag .BoolVar (& enableCellControllers , "enable-cell-controllers" , false ,
@@ -123,21 +125,35 @@ func main() {
123125
124126 ctrl .SetLogger (zap .New (zap .UseFlagOptions (& opts )))
125127
126- // Load the downstream REST config when --downstream-kubeconfig is provided.
127- // When the flag is omitted, upstreamRestConfig remains nil and federation
128- // features will be skipped at controller setup time.
129- if upstreamKubeconfig != "" {
128+ // Load the federation (Karmada) control plane REST config when
129+ // --federation-kubeconfig is provided. When the flag is omitted,
130+ // federationRestConfig remains nil; management controllers will refuse to
131+ // start if --enable-management-controllers is also set.
132+ if federationKubeconfig != "" {
130133 loader := clientcmd .NewNonInteractiveDeferredLoadingClientConfig (
131- & clientcmd.ClientConfigLoadingRules {ExplicitPath : upstreamKubeconfig },
132- & clientcmd.ConfigOverrides {CurrentContext : upstreamContext },
134+ & clientcmd.ClientConfigLoadingRules {ExplicitPath : federationKubeconfig },
135+ & clientcmd.ConfigOverrides {CurrentContext : federationContext },
133136 )
134137 var err error
135- upstreamRestConfig , err = loader .ClientConfig ()
138+ federationRestConfig , err = loader .ClientConfig ()
136139 if err != nil {
137- setupLog .Error (err , "unable to load upstream kubeconfig" , "path" , upstreamKubeconfig )
140+ setupLog .Error (err , "unable to load federation kubeconfig" , "path" , federationKubeconfig )
138141 os .Exit (1 )
139142 }
140- setupLog .Info ("upstream kubeconfig loaded" , "path" , upstreamKubeconfig )
143+ setupLog .Info ("federation kubeconfig loaded" , "path" , federationKubeconfig )
144+ }
145+
146+ // Fail loud: management controllers require a federation kubeconfig. Silently
147+ // skipping them when --enable-management-controllers is set would leave
148+ // federation and instance projection broken with no visible signal — the same
149+ // class of failure as the quota P1 issue. An operator who explicitly enables
150+ // management controllers but omits --federation-kubeconfig has a misconfiguration
151+ // that must surface immediately rather than at runtime.
152+ if enableManagementControllers && federationRestConfig == nil {
153+ setupLog .Error (nil ,
154+ "management controllers enabled but no federation kubeconfig configured" ,
155+ "hint" , "set --federation-kubeconfig" )
156+ os .Exit (1 )
141157 }
142158
143159 setupLog .Info ("starting compute" ,
@@ -240,13 +256,15 @@ func main() {
240256 }
241257 }
242258
243- // Build a single downstream client shared across all controllers that need
244- // to read or write to the downstream control plane. Nil when federation is disabled.
245- var downstreamClient client.Client
246- if upstreamRestConfig != nil {
247- downstreamClient , err = client .New (upstreamRestConfig , client.Options {Scheme : scheme })
259+ // Build a single federation client shared across all controllers that need to
260+ // read or write to the Karmada federation control plane. This is the hub that
261+ // the management controllers federate through and that edge cells write back to.
262+ // Nil when --federation-kubeconfig is not set (i.e. federation is disabled).
263+ var federationClient client.Client
264+ if federationRestConfig != nil {
265+ federationClient , err = client .New (federationRestConfig , client.Options {Scheme : scheme })
248266 if err != nil {
249- setupLog .Error (err , "unable to create downstream client" )
267+ setupLog .Error (err , "unable to create federation client" )
250268 os .Exit (1 )
251269 }
252270 }
@@ -262,7 +280,7 @@ func main() {
262280 clusterNameForProject := func (_ string ) multicluster.ClusterName {
263281 return multicluster .ClusterName (singleClusterName )
264282 }
265- instanceReconciler := & controller.InstanceReconciler {UpstreamClient : downstreamClient }
283+ instanceReconciler := & controller.InstanceReconciler {FederationClient : federationClient }
266284 err = instanceReconciler .SetupWithManager (
267285 mgr ,
268286 quotaRestConfig ,
@@ -278,10 +296,11 @@ func main() {
278296 }
279297
280298 // WorkloadDeploymentFederator and InstanceProjector are management-plane
281- // controllers that run on the control-plane cluster. They require a downstream
282- // control plane to be configured (--upstream-kubeconfig provided).
283- if enableManagementControllers && upstreamRestConfig != nil {
284- extra , err := setupManagementControllers (mgr , downstreamClient )
299+ // controllers that run on the control-plane cluster. The fail-loud guard above
300+ // ensures federationRestConfig is non-nil when enableManagementControllers is
301+ // true; the nil check here is a defensive belt-and-suspenders guard.
302+ if enableManagementControllers && federationRestConfig != nil {
303+ extra , err := setupManagementControllers (mgr , federationClient )
285304 if err != nil {
286305 setupLog .Error (err , "unable to set up management controllers" )
287306 os .Exit (1 )
@@ -427,33 +446,33 @@ func ignoreCanceled(err error) error {
427446
428447// setupManagementControllers wires the WorkloadDeploymentFederator and
429448// InstanceProjector onto mgr. It returns any additional Runnable objects that
430- // must be started alongside the main manager (the downstream manager used by
449+ // must be started alongside the main manager (the federation manager used by
431450// InstanceProjector). Called only when management controllers are enabled and
432- // an upstream REST config is available.
433- func setupManagementControllers (mgr mcmanager.Manager , downstreamClient client.Client ) ([]manager.Runnable , error ) {
434- federator := & controller.WorkloadDeploymentFederator {UpstreamClient : downstreamClient }
451+ // a federation REST config is available.
452+ func setupManagementControllers (mgr mcmanager.Manager , federationClient client.Client ) ([]manager.Runnable , error ) {
453+ federator := & controller.WorkloadDeploymentFederator {FederationClient : federationClient }
435454 if err := federator .SetupWithManager (mgr ); err != nil {
436455 return nil , fmt .Errorf ("WorkloadDeploymentFederator: %w" , err )
437456 }
438457
439- // InstanceProjector runs in the Control Plane Cell , watches Instances
440- // written back by POP-cell operators, and projects them into the
441- // corresponding project namespaces via the multicluster manager.
442- downstreamMgr , err := manager .New (upstreamRestConfig , manager.Options {
458+ // InstanceProjector runs in the management plane , watches Instances written
459+ // back by POP-cell operators to the Karmada federation control plane, and
460+ // projects them into the corresponding project namespaces via the multicluster manager.
461+ federationMgr , err := manager .New (federationRestConfig , manager.Options {
443462 Scheme : scheme ,
444463 Metrics : metricsserver.Options {BindAddress : "0" },
445464 })
446465 if err != nil {
447- return nil , fmt .Errorf ("downstream manager for InstanceProjector: %w" , err )
466+ return nil , fmt .Errorf ("federation manager for InstanceProjector: %w" , err )
448467 }
449468 if err = (& controller.InstanceProjector {
450- UpstreamClient : downstreamClient ,
451- MCManager : mgr ,
452- }).SetupWithManager (downstreamMgr ); err != nil {
469+ FederationClient : federationClient ,
470+ MCManager : mgr ,
471+ }).SetupWithManager (federationMgr ); err != nil {
453472 return nil , fmt .Errorf ("InstanceProjector: %w" , err )
454473 }
455474
456- return []manager.Runnable {downstreamMgr }, nil
475+ return []manager.Runnable {federationMgr }, nil
457476}
458477
459478// singleModeProjectID returns an InstanceProjectIDFunc for single-cell mode.
0 commit comments