karmada/cmd/controller-manager/app/controllermanager.go

146 lines
4.7 KiB
Go

package app
import (
"flag"
"fmt"
"os"
"github.com/spf13/cobra"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/component-base/logs"
"k8s.io/klog/v2"
"sigs.k8s.io/controller-runtime"
"github.com/huawei-cloudnative/karmada/cmd/controller-manager/app/options"
memberclusterv1alpha1 "github.com/huawei-cloudnative/karmada/pkg/apis/membercluster/v1alpha1"
propagationv1alpha1 "github.com/huawei-cloudnative/karmada/pkg/apis/propagationstrategy/v1alpha1"
"github.com/huawei-cloudnative/karmada/pkg/controllers/binding"
"github.com/huawei-cloudnative/karmada/pkg/controllers/execution"
"github.com/huawei-cloudnative/karmada/pkg/controllers/membercluster"
"github.com/huawei-cloudnative/karmada/pkg/controllers/policy"
karmadaclientset "github.com/huawei-cloudnative/karmada/pkg/generated/clientset/versioned"
)
// aggregatedScheme aggregates all Kubernetes and extended schemes used by controllers.
var aggregatedScheme = runtime.NewScheme()
func init() {
var _ = scheme.AddToScheme(aggregatedScheme) // add Kubernetes schemes
var _ = propagationv1alpha1.AddToScheme(aggregatedScheme) // add propagation schemes
var _ = memberclusterv1alpha1.AddToScheme(aggregatedScheme) // add membercluster schemes
}
// NewControllerManagerCommand creates a *cobra.Command object with default parameters
func NewControllerManagerCommand(stopChan <-chan struct{}) *cobra.Command {
verFlag := false
opts := options.NewOptions()
cmd := &cobra.Command{
Use: "controller-manager",
Long: `The controller manager runs a bunch of controllers`,
Run: func(cmd *cobra.Command, args []string) {
if verFlag {
os.Exit(0)
}
opts.Complete()
if err := Run(opts, stopChan); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
},
}
cmd.Flags().AddGoFlagSet(flag.CommandLine)
cmd.Flags().BoolVar(&verFlag, "version", false, "Prints the version info of controller manager.")
return cmd
}
// Run runs the controller-manager with options. This should never exit.
func Run(opts *options.Options, stopChan <-chan struct{}) error {
logs.InitLogs()
defer logs.FlushLogs()
var err error
// TODO(RainbowMango): need to change to shim kube-apiserver config.
opts.KubeConfig, err = clientcmd.BuildConfigFromFlags("", "")
if err != nil {
panic(err)
}
controllerManager, err := controllerruntime.NewManager(opts.KubeConfig, controllerruntime.Options{
Scheme: aggregatedScheme,
LeaderElection: true, // TODO(RainbowMango): Add a flag '--enable-leader-election' for this option.
LeaderElectionID: "41db11fa.karmada.io",
})
if err != nil {
klog.Errorf("failed to build controller manager: %v", err)
return err
}
setupControllers(controllerManager)
// blocks until the stop channel is closed.
if err := controllerManager.Start(stopChan); err != nil {
klog.Errorf("controller manager exits unexpectedly: %v", err)
return err
}
// never reach here
return nil
}
func setupControllers(mgr controllerruntime.Manager) {
resetConfig := mgr.GetConfig()
dynamicClientSet := dynamic.NewForConfigOrDie(resetConfig)
karmadaClient := karmadaclientset.NewForConfigOrDie(resetConfig)
kubeClientSet := kubernetes.NewForConfigOrDie(resetConfig)
MemberClusterController := &membercluster.Controller{
Client: mgr.GetClient(),
KubeClientSet: kubeClientSet,
EventRecorder: mgr.GetEventRecorderFor(membercluster.ControllerName),
}
if err := MemberClusterController.SetupWithManager(mgr); err != nil {
klog.Fatalf("Failed to setup membercluster controller: %v", err)
}
policyController := &policy.PropagationPolicyController{
Client: mgr.GetClient(),
DynamicClient: dynamicClientSet,
KarmadaClient: karmadaClient,
EventRecorder: mgr.GetEventRecorderFor(policy.ControllerName),
}
if err := policyController.SetupWithManager(mgr); err != nil {
klog.Fatalf("Failed to setup policy controller: %v", err)
}
bindingController := &binding.PropagationBindingController{
Client: mgr.GetClient(),
DynamicClient: dynamicClientSet,
KarmadaClient: karmadaClient,
EventRecorder: mgr.GetEventRecorderFor(binding.ControllerName),
}
if err := bindingController.SetupWithManager(mgr); err != nil {
klog.Fatalf("Failed to setup binding controller: %v", err)
}
executionController := &execution.Controller{
Client: mgr.GetClient(),
KubeClientSet: kubeClientSet,
KarmadaClient: karmadaClient,
EventRecorder: mgr.GetEventRecorderFor(execution.ControllerName),
RESTMapper: mgr.GetRESTMapper(),
}
if err := executionController.SetupWithManager(mgr); err != nil {
klog.Fatalf("Failed to setup execution controller: %v", err)
}
}