• kubecontrollermanager


    cmd\kube-controller-manager\controller-manager.go
    func main() {
    	command := app.NewControllerManagerCommand() --->cmd\kube-controller-manager\app\controllermanager.go
    	code := cli.Run(command)
    	os.Exit(code)
    }
    
    cmd\kube-controller-manager\app\controllermanager.go
    NewControllerManagerCommand
    	cmd := &cobra.Command{
    		Run: func(cmd *cobra.Command, args []string) {
    			c, err := s.Config(KnownControllers(), ControllersDisabledByDefault.List())
    			if err := Run(c.Complete(), wait.NeverStop); err != nil {
    				fmt.Fprintf(os.Stderr, "%v\n", err)
    				os.Exit(1)
    			}
    		}
    
    
    Run
    	run := func(ctx context.Context, startSATokenController InitFunc, initializersFunc ControllerInitializersFunc) {
    
    		controllerContext, err := CreateControllerContext(c, rootClientBuilder, clientBuilder, ctx.Done())
    		if err != nil {
    			klog.Fatalf("error building controller context: %v", err)
    		}
    		controllerInitializers := initializersFunc(controllerContext.LoopMode) --->ControllerInitializersFunc --->NewControllerInitializers
    		if err := StartControllers(ctx, controllerContext, startSATokenController, controllerInitializers, unsecuredMux, healthzHandler); err != nil {
    			klog.Fatalf("error starting controllers: %v", err)
    		}
    
    		controllerContext.InformerFactory.Start(stopCh)
    		controllerContext.ObjectOrMetadataInformerFactory.Start(stopCh)
    		close(controllerContext.InformersStarted)
    
    		select {}
    	}
    	...
    	// 没开选举直接开跑
    	if !c.ComponentConfig.Generic.LeaderElection.LeaderElect {
    		run(context.TODO(), saTokenControllerInitFunc, NewControllerInitializers)
    		panic("unreachable")
    	}
    	...
    	// 以主机名+随机字符串为id进行参选
    	id, err := os.Hostname()
    	id = id + "_" + string(uuid.NewUUID())
    	...
    	go leaderElectAndRun(c, id, electionChecker,
    		c.ComponentConfig.Generic.LeaderElection.ResourceLock,
    		c.ComponentConfig.Generic.LeaderElection.ResourceName,
    		leaderelection.LeaderCallbacks{
    			OnStartedLeading: func(ctx context.Context) {
    				initializersFunc := NewControllerInitializers
    				if leaderMigrator != nil {
    					// If leader migration is enabled, we should start only non-migrated controllers
    					//  for the main lock.
    					initializersFunc = createInitializersFunc(leaderMigrator.FilterFunc, leadermigration.ControllerNonMigrated)
    					klog.Info("leader migration: starting main controllers.")
    				}
    				// 竞选成功则开启主控制器
    				run(ctx, startSATokenController, initializersFunc)
    			},
    			OnStoppedLeading: func() {
    				// 失败则结束
    				klog.Fatalf("leaderelection lost")
    			},
    		})
    		...
    		go leaderElectAndRun(c, id, electionChecker,
    			c.ComponentConfig.Generic.LeaderMigration.ResourceLock,
    			c.ComponentConfig.Generic.LeaderMigration.LeaderName,
    			leaderelection.LeaderCallbacks{
    				OnStartedLeading: func(ctx context.Context) {
    					klog.Info("leader migration: starting migrated controllers.")
    					// DO NOT start saTokenController under migration lock
    					run(ctx, nil, createInitializersFunc(leaderMigrator.FilterFunc, leadermigration.ControllerMigrated))
    				},
    				OnStoppedLeading: func() {
    					klog.Fatalf("migration leaderelection lost")
    				},
    			})
    
    **// 内置默认的所有控制器**
    // 共38个,其中4个有条件开启,34个默认开启
    // 所有控制器开启逻辑代码都在cmd\kube-controller-manager\app\core.go,一一对应,主体逻辑相同,开goroutine无限loop自己关注的资源对象进行相应动作
    func NewControllerInitializers(loopMode ControllerLoopMode) map[string]InitFunc {
    	controllers := map[string]InitFunc{}
    	controllers["endpoint"] = startEndpointController
    	controllers["endpointslice"] = startEndpointSliceController
    	controllers["endpointslicemirroring"] = startEndpointSliceMirroringController
    	controllers["replicationcontroller"] = startReplicationController
    	controllers["podgc"] = startPodGCController
    	controllers["resourcequota"] = startResourceQuotaController
    	controllers["namespace"] = startNamespaceController --->cmd\kube-controller-manager\app\core.go
    	controllers["serviceaccount"] = startServiceAccountController
    	controllers["garbagecollector"] = startGarbageCollectorController
    	controllers["daemonset"] = startDaemonSetController
    	controllers["job"] = startJobController
    	controllers["deployment"] = startDeploymentController
    	controllers["replicaset"] = startReplicaSetController
    	controllers["horizontalpodautoscaling"] = startHPAController
    	controllers["disruption"] = startDisruptionController
    	controllers["statefulset"] = startStatefulSetController
    	controllers["cronjob"] = startCronJobController
    	controllers["csrsigning"] = startCSRSigningController
    	controllers["csrapproving"] = startCSRApprovingController
    	controllers["csrcleaner"] = startCSRCleanerController
    	controllers["ttl"] = startTTLController
    	controllers["bootstrapsigner"] = startBootstrapSignerController
    	controllers["tokencleaner"] = startTokenCleanerController
    	controllers["nodeipam"] = startNodeIpamController
    	controllers["nodelifecycle"] = startNodeLifecycleController
    	if loopMode == IncludeCloudLoops {
    		controllers["service"] = startServiceController
    		controllers["route"] = startRouteController
    		controllers["cloud-node-lifecycle"] = startCloudNodeLifecycleController
    		// TODO: volume controller into the IncludeCloudLoops only set.
    	}
    	controllers["persistentvolume-binder"] = startPersistentVolumeBinderController
    	controllers["attachdetach"] = startAttachDetachController
    	controllers["persistentvolume-expander"] = startVolumeExpandController
    	controllers["clusterrole-aggregation"] = startClusterRoleAggregrationController
    	controllers["pvc-protection"] = startPVCProtectionController
    	controllers["pv-protection"] = startPVProtectionController
    	controllers["ttl-after-finished"] = startTTLAfterFinishedController
    	controllers["root-ca-cert-publisher"] = startRootCACertPublisher
    	controllers["ephemeral-volume"] = startEphemeralVolumeController
    	if utilfeature.DefaultFeatureGate.Enabled(genericfeatures.APIServerIdentity) &&
    		utilfeature.DefaultFeatureGate.Enabled(genericfeatures.StorageVersionAPI) {
    		controllers["storage-version-gc"] = startStorageVersionGCController
    	}
    
    	return controllers
    }
    
  • 相关阅读:
    win10下安装scrapy不成功的问题解决
    python方法和函数区别
    关于Django 报错 ImportError: cannot import name RegexUrlResolver解决
    Django+Vue后端解决跨域问题
    python中yield的用法
    启动后、路由加载之前定制一段代码(基于admin原理)
    Hadoop期末复习
    python爬虫期末复习
    idea开发环境搭建ssh
    intelliJ破解及JavaEE搭建
  • 原文地址:https://www.cnblogs.com/bfmq/p/15656200.html
Copyright © 2020-2023  润新知