@@ -31,6 +31,7 @@ import (
31
31
"k8s.io/client-go/informers"
32
32
"k8s.io/client-go/kubernetes"
33
33
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
34
+ "k8s.io/client-go/tools/clientcmd"
34
35
"k8s.io/klog/v2"
35
36
"k8s.io/klog/v2/textlogger"
36
37
"open-cluster-management.io/addon-framework/pkg/addonmanager"
@@ -70,6 +71,7 @@ func main() {
70
71
var signerSecretNamespace , signerSecretName string
71
72
var agentInstallAll bool
72
73
var enableKubeApiProxy bool
74
+ var mcKubeconfig string
73
75
74
76
logger := textlogger .NewLogger (textlogger .NewConfig ())
75
77
klog .SetOutput (os .Stdout )
@@ -93,37 +95,70 @@ func main() {
93
95
"Configure the install strategy of agent on managed clusters. " +
94
96
"Enabling this will automatically install agent on all managed cluster." )
95
97
flag .BoolVar (& enableKubeApiProxy , "enable-kube-api-proxy" , true , "Enable proxy to agent kube-apiserver" )
98
+ flag .StringVar (& mcKubeconfig , "multicluster-kubeconfig" , "" ,
99
+ "The path to multicluster-controlplane kubeconfig" )
96
100
97
101
flag .Parse ()
98
102
99
103
// pipe controller-runtime logs to klog
100
104
ctrl .SetLogger (logger )
101
105
102
- mgr , err := ctrl .NewManager (ctrl .GetConfigOrDie (), ctrl.Options {
106
+ hostManager , err := ctrl .NewManager (ctrl .GetConfigOrDie (), ctrl.Options {
103
107
Scheme : scheme ,
104
108
Metrics : metricsserver.Options {BindAddress : metricsAddr },
105
109
HealthProbeBindAddress : probeAddr ,
106
110
LeaderElection : enableLeaderElection ,
107
111
LeaderElectionID : "cluster-proxy-addon-manager" ,
108
112
})
109
113
if err != nil {
110
- setupLog .Error (err , "unable to start manager" )
114
+ setupLog .Error (err , "unable to create host manager" )
111
115
os .Exit (1 )
112
116
}
113
117
114
- nativeClient , err := kubernetes .NewForConfig (mgr .GetConfig ())
118
+ hostNativeClient , err := kubernetes .NewForConfig (hostManager .GetConfig ())
115
119
if err != nil {
116
120
setupLog .Error (err , "unable to set up kubernetes native client" )
117
121
os .Exit (1 )
118
122
}
119
123
120
- addonClient , err := addonclient .NewForConfig (mgr .GetConfig ())
124
+ mcMode := mcKubeconfig != ""
125
+ var mcManager ctrl.Manager
126
+ var mcNativeClient kubernetes.Interface
127
+ if mcMode {
128
+ mcConfig , err := clientcmd .BuildConfigFromFlags ("" , mcKubeconfig )
129
+ if err != nil {
130
+ setupLog .Error (err , "unable to build multicluster rest config" )
131
+ os .Exit (1 )
132
+ }
133
+ mcManager , err = ctrl .NewManager (mcConfig , ctrl.Options {
134
+ Scheme : scheme ,
135
+ Metrics : metricsserver.Options {BindAddress : "" },
136
+ HealthProbeBindAddress : "" ,
137
+ LeaderElection : enableLeaderElection ,
138
+ LeaderElectionID : "cluster-proxy-addon-manager" ,
139
+ })
140
+ if err != nil {
141
+ setupLog .Error (err , "unable to create mc manager" )
142
+ os .Exit (1 )
143
+ }
144
+
145
+ mcNativeClient , err = kubernetes .NewForConfig (mcManager .GetConfig ())
146
+ if err != nil {
147
+ setupLog .Error (err , "unable to set up multicluster native client" )
148
+ os .Exit (1 )
149
+ }
150
+ } else {
151
+ mcManager = hostManager
152
+ mcNativeClient = hostNativeClient
153
+ }
154
+
155
+ addonClient , err := addonclient .NewForConfig (mcManager .GetConfig ())
121
156
if err != nil {
122
157
setupLog .Error (err , "unable to set up ocm addon client" )
123
158
os .Exit (1 )
124
159
}
125
160
126
- supportsV1CSR , supportsV1beta1CSR , err := addonutil .IsCSRSupported (nativeClient )
161
+ supportsV1CSR , supportsV1beta1CSR , err := addonutil .IsCSRSupported (mcNativeClient )
127
162
if err != nil {
128
163
setupLog .Error (err , "unable to detect available CSR API versions" )
129
164
os .Exit (1 )
@@ -138,43 +173,45 @@ func main() {
138
173
os .Exit (1 )
139
174
}
140
175
141
- nativeInformer := informers .NewSharedInformerFactoryWithOptions (nativeClient , 0 )
176
+ hostNativeInformer := informers .NewSharedInformerFactoryWithOptions (hostNativeClient , 0 )
142
177
143
178
// loading self-signer
144
179
selfSigner , err := selfsigned .NewSelfSignerFromSecretOrGenerate (
145
- nativeClient , signerSecretNamespace , signerSecretName )
180
+ hostNativeClient , signerSecretNamespace , signerSecretName )
146
181
if err != nil {
147
182
setupLog .Error (err , "failed loading self-signer" )
148
183
os .Exit (1 )
149
184
}
150
185
151
186
if err := controllers .RegisterClusterManagementAddonReconciler (
152
- mgr ,
187
+ hostManager ,
153
188
selfSigner ,
154
- nativeClient ,
155
- nativeInformer .Core ().V1 ().Secrets (),
189
+ hostNativeClient ,
190
+ hostNativeInformer .Core ().V1 ().Secrets (),
191
+ mcManager ,
192
+ mcMode ,
156
193
supportsV1CSR ,
157
194
); err != nil {
158
195
setupLog .Error (err , "unable to create controller" , "controller" , "ClusterManagementAddonReconciler" )
159
196
os .Exit (1 )
160
197
}
161
198
162
- if err := controllers .RegisterServiceResolverReconciler (mgr ); err != nil {
199
+ if err := controllers .RegisterServiceResolverReconciler (mcManager ); err != nil {
163
200
setupLog .Error (err , "unable to create controller" , "controller" , "ServiceResolverReconciler" )
164
201
os .Exit (1 )
165
202
}
166
203
167
204
//+kubebuilder:scaffold:builder
168
- if err := mgr .AddHealthzCheck ("healthz" , healthz .Ping ); err != nil {
205
+ if err := hostManager .AddHealthzCheck ("healthz" , healthz .Ping ); err != nil {
169
206
setupLog .Error (err , "unable to set up health check" )
170
207
os .Exit (1 )
171
208
}
172
- if err := mgr .AddReadyzCheck ("readyz" , healthz .Ping ); err != nil {
209
+ if err := hostManager .AddReadyzCheck ("readyz" , healthz .Ping ); err != nil {
173
210
setupLog .Error (err , "unable to set up ready check" )
174
211
os .Exit (1 )
175
212
}
176
213
177
- addonManager , err := addonmanager .New (mgr .GetConfig ())
214
+ addonManager , err := addonmanager .New (mcManager .GetConfig ())
178
215
if err != nil {
179
216
setupLog .Error (err , "unable to set up ready check" )
180
217
os .Exit (1 )
@@ -184,8 +221,9 @@ func main() {
184
221
selfSigner ,
185
222
signerSecretNamespace ,
186
223
supportsV1CSR ,
187
- mgr .GetClient (),
188
- nativeClient ,
224
+ mcManager .GetClient (),
225
+ mcNativeClient ,
226
+ hostNativeClient ,
189
227
agentInstallAll ,
190
228
enableKubeApiProxy ,
191
229
addonClient ,
@@ -202,16 +240,19 @@ func main() {
202
240
203
241
ctx , cancel := context .WithCancel (ctrl .SetupSignalHandler ())
204
242
defer cancel ()
205
- go nativeInformer .Start (ctx .Done ())
243
+ go hostNativeInformer .Start (ctx .Done ())
206
244
go func () {
207
245
if err := addonManager .Start (ctx ); err != nil {
208
246
setupLog .Error (err , "unable to start addon manager" )
209
247
os .Exit (1 )
210
248
}
211
249
}()
212
- setupLog .Info ("starting manager" )
213
- if err := mgr .Start (ctx ); err != nil {
214
- setupLog .Error (err , "problem running manager" )
250
+ if mcMode {
251
+ go mcManager .Start (ctx )
252
+ }
253
+ setupLog .Info ("starting host manager" )
254
+ if err := hostManager .Start (ctx ); err != nil {
255
+ setupLog .Error (err , "problem running host manager" )
215
256
os .Exit (1 )
216
257
}
217
258
}
0 commit comments