zoukankan      html  css  js  c++  java
  • 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
    }
    
  • 相关阅读:
    为图片指定区域添加链接
    数值取值范围问题
    【leetcode】柱状图中最大的矩形(第二遍)
    【leetcode 33】搜索旋转排序数组(第二遍)
    【Educational Codeforces Round 81 (Rated for Div. 2) C】Obtain The String
    【Educational Codeforces Round 81 (Rated for Div. 2) B】Infinite Prefixes
    【Educational Codeforces Round 81 (Rated for Div. 2) A】Display The Number
    【Codeforces 716B】Complete the Word
    一个简陋的留言板
    HTML,CSS,JavaScript,AJAX,JSP,Servlet,JDBC,Structs,Spring,Hibernate,Xml等概念
  • 原文地址:https://www.cnblogs.com/bfmq/p/15656200.html
Copyright © 2011-2022 走看看