如何进行K8S源码分析启动

68次阅读
没有评论

共计 2327 个字符,预计需要花费 6 分钟才能阅读完成。

这篇文章给大家介绍如何进行 K8S 源码分析启动,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Controller Manager 启动的过程比较简单,主要就是依次启动各个 controllers。

启动的代码在 /cmd/kube-controller-manager/app/controllermanager.go 中,核心的是 Run 方法:

// Run runs the CMServer.  This should never exit.

func Run(s *options.CMServer) error {

 // 1. 验证 CM 配置

 if err := s.Validate(KnownControllers(), ControllersDisabledByDefault.List()); err != nil {

 return err

 }

 

 ….

 kubeClient, leaderElectionClient, kubeconfig, err := createClients(s)

 if err != nil {

 return err

 }

 

 go startHTTP(s)

 

 recorder := createRecorder(kubeClient)

 

 // 2. 创建 controllers 启动逻辑。run 是真正用来启动 controllers 的函数

 run := func(stop -chan struct{}) {

 rootClientBuilder := controller.SimpleControllerClientBuilder{

 ClientConfig: kubeconfig,

 }

 var clientBuilder controller.ControllerClientBuilder

 ….

 ctx, err := CreateControllerContext(s, rootClientBuilder, clientBuilder, stop)

 ….

 // NewControllerInitializers 返回所有待启动的 controllers,StartControllers 则依次启动

 if err := StartControllers(ctx, saTokenControllerInitFunc, NewControllerInitializers()); err != nil {

 glog.Fatalf(error starting controllers: %v , err)

 }

 

 ctx.InformerFactory.Start(ctx.Stop)

 close(ctx.InformersStarted)

 

 select {}

 }

 

 …

 // 3. 选主,由 leader 执行 run 函数

 leaderelection.RunOrDie(leaderelection.LeaderElectionConfig{

 Lock:  rl,

 LeaseDuration: s.LeaderElection.LeaseDuration.Duration,

 RenewDeadline: s.LeaderElection.RenewDeadline.Duration,

 RetryPeriod:  s.LeaderElection.RetryPeriod.Duration,

 Callbacks: leaderelection.LeaderCallbacks{

 OnStartedLeading: run,

 OnStoppedLeading: func() {

 glog.Fatalf(leaderelection lost)

 },

 },

 })

 panic(unreachable)

}

NewControllerInitializers() 函数返回一个 map[string]InitFunc 的结构,包含所有需要启动的 controllers 的启动函数。
StartControllers 则依次启动 controllers:

func StartControllers(ctx ControllerContext, startSATokenController InitFunc, controllers map[string]InitFunc) error {

 // 依次调用 controller init funcs

 for controllerName, initFn := range controllers {

 if !ctx.IsControllerEnabled(controllerName) {

 glog.Warningf(%q is disabled , controllerName)

 continue

 }

 

 time.Sleep(wait.Jitter(ctx.Options.ControllerStartInterval.Duration, ControllerStartJitter))

 

 glog.V(1).Infof(Starting %q , controllerName)

 started, err := initFn(ctx)

 if err != nil {

 glog.Errorf(Error starting %q , controllerName)

 return err

 }

 if !started {

 glog.Warningf(Skipping %q , controllerName)

 continue

 }

 glog.Infof(Started %q , controllerName)

 }

 

 return nil

}

关于如何进行 K8S 源码分析启动就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计2327字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)