带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.2 Kubebuilder 模块分析(四)

简介: 带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.2 Kubebuilder 模块分析

3.2.3         Client初始化

实现 Controller 时,不可避免地需要对某些资源类型进行创建、删除、更新和查询,这些操作就是通过Client实现的,查询功能实际查询的是本地的 Cache,写操作是直接访APIServer。Client是进行初始化的过程见代码清单 3-11。

//ctrl.NewManager⽤于创建 Manager,在创建Manager的过程中会初始化相应的Client

mgr,err:=ctrl.NewManager(ctrl.GetConfigOrDie(),ctrl.Options{

Scheme:                scheme,

MetricsBindAddress:                       metricsAddr,Port:         9443,

HealthProbeBindAddress:probeAddr,LeaderElection:       enableLeaderElection,LeaderElectionID:       "8bf23ea1.my.domain",


 

})

 

//...

 

iferr=(&controllers.GuestbookReconciler{

//ManagerClient传给Controller

//并且调⽤SetupWithManager⽅法传⼊Manager进⾏ Controller的初始化

Client:mgr.GetClient(),

Log:ctrl.Log.WithName("controllers").WithName("Guestbook"),Scheme:mgr.GetScheme(),

}).SetupWithManager(mgr);err!=nil{

setupLog.Error(err,"unabletocreatecontroller","controller","Guestbook")

os.Exit(1)


}

 

Manager初始化过程中创建 Client,见代码清单 3-12。

funcNew(config*rest.Config,optionsOptions)(Manager,error){

//...

//如果⽤户没有指定⾃⼰⽤的Client,那么在 setOptionsDefaults函数中会创建

//默认的Client

options=setOptionsDefaults(options)

 

//...

//创建Cache⽤于Client读操作

cache,err:=options.NewCache(config,cache.Options{Scheme:options.Scheme,

Mapper:mapper,Resync:options.SyncPeriod,Namespace:options.Namespace})

 

//...

clientOptions:=client.Options{Scheme:options.Scheme,Mapper:mapper}

 

apiReader,err:=client.New(config,clientOptions)

iferr!=nil{

returnnil,err

}

 

//初始化⽤于写操作的Client

writeObj,err:=options.ClientBuilder.

WithUncached(options.ClientDisableCacheFor...).Build(cache,config,clientOptions)

iferr!=nil{


 

 

returnnil,err

}

 

//dryRun模式

ifoptions.DryRunClient{

writeObj=client.NewDryRunClient(writeObj)

}

}

 

初始化默认的 Client,见代码清单 3-13。


funcsetOptionsDefaults(optionsOptions)Options{

//...

//如果⽤户没有指定Client,那么创建默认的 Client

ifoptions.ClientBuilder==nil{options.ClientBuilder=NewClientBuilder()

}

//如果⽤户没有指定Cache,那么创建默认的 Cache

ifoptions.NewCache==nil{options.NewCache=cache.New

}

//...

}

 

Manager 启动的入口函数一般在 main() 函数中,具体见代码清单 3-14。

setupLog.Info("startingmanager")

if err:=mgr.Start(ctrl.SetupSignalHandler());err!=nil{setupLog.Error(err,"problemrunningmanager")os.Exit(1)

}

 

MGR的类型是一个Interface,底层实际上调用的是 controllerManagerStart方法。Start方法的主要逻辑就是启动 Cache、Controller,将整个事件流运转起来。

代码清单 3-15展示了启动逻辑。

func(cm*controllerManager)Start(ctxcontext.Context)(errerror){


 

...

//根据是否需要选举来选择启动⽅式

gocm.startNonLeaderElectionRunnables()gofunc(){

ifcm.resourceLock!=nil{

err:=cm.startLeaderElection()iferr!=nil{

cm.errChan<-err

}

}else{

close(cm.elected)

gocm.startLeaderElectionRunnables()

}

}()

..


}

 

选举和非选举方式的启动逻辑类似,都是先初始化Cache,再启动 Controller,见代码清单 3-16。

func(cm*controllerManager)startNonLeaderElectionRunnables(){cm.mu.Lock()

defercm.mu.Unlock()

 

//启动Cache

cm.waitForCache(cm.internalCtx)

 

//启动Controller

for_,c:=rangecm.nonLeaderElectionRunnables{cm.startRunnable(c)

}

}

相关文章
|
4天前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
54 17
|
10天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
9天前
|
Cloud Native 测试技术 云计算
云原生技术在现代应用开发中的角色与实践
【9月更文挑战第31天】本文深入探讨了云原生技术如何革新现代应用开发流程,通过实际案例分析,揭示了其对提高开发效率、确保系统可扩展性和可靠性的显著影响。文章不仅介绍了云原生的核心概念,还提供了实施策略和最佳实践,旨在为开发者提供一条清晰的云原生转型之路。
|
10天前
|
Cloud Native 持续交付 微服务
云原生时代的微服务架构实践
【9月更文挑战第30天】随着云计算技术的不断进步,云原生已经成为现代软件开发的重要趋势。本文将通过深入浅出的方式,介绍如何在云原生环境下设计并实施微服务架构,以及如何利用容器化技术和自动化工具来提升服务的可维护性和可扩展性。我们将一起探讨微服务架构的核心原则、优势,以及在云平台中部署和管理微服务的最佳实践。无论你是初学者还是有经验的开发者,这篇文章都将成为你探索云原生和微服务世界的一盏明灯。
|
13天前
|
监控 Cloud Native 持续交付
云原生时代的微服务架构设计原则与实践
【9月更文挑战第27天】本文深入探讨了在云原生环境下,如何高效地实施微服务架构。通过分析微服务的基本概念、设计原则和关键技术,结合实际案例,指导读者理解并应用微服务架构于云计算项目之中。文章旨在为软件开发者和架构师提供一条清晰的路径,以实现更加灵活、可扩展且易于维护的系统。
|
17天前
|
设计模式 Cloud Native API
云原生时代的微服务架构实践
【9月更文挑战第23天】在这篇文章中,我们将深入探讨云原生环境下的微服务架构设计原则、优势以及实施策略。文章不仅涉及理论概念,还结合具体的代码示例,帮助读者理解如何在实际项目中应用微服务架构。通过阅读本文,你将获得构建、部署和管理微服务的实用知识,为你的云原生项目奠定坚实的基础。
|
18天前
|
运维 Kubernetes Cloud Native
云原生技术在现代企业中的应用与实践
【9月更文挑战第22天】 在数字化浪潮的推动下,云原生技术已经成为企业IT架构转型的重要方向。本文将深入探讨云原生技术的核心概念、优势以及如何在企业中实施云原生策略。我们将从容器化技术的基本原理出发,逐步引导读者理解服务网格和微服务架构的设计思路,并通过实际案例分析,展示云原生技术如何助力企业实现敏捷开发和高效运维。文章旨在为技术人员提供云原生实践的参考,并启发企业决策者对于云原生转型的深度思考。
|
14天前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
41 4
|
17天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用开发中的实践与思考
【9月更文挑战第23天】本文将深入探讨云原生技术如何革新现代应用的开发流程。通过分析云原生的核心概念、优势以及实际应用案例,我们旨在揭示这一新兴技术范式如何助力开发者和企业更高效、灵活地构建和部署应用程序。文章还将提供具体代码示例,展示云原生技术在实际项目中的应用,帮助读者更好地理解和掌握该技术。
|
18天前
|
Cloud Native 持续交付 开发者
云原生技术在现代应用开发中的应用与实践
【9月更文挑战第22天】本文将深入探讨云原生技术如何革新现代应用开发,通过实际案例分析其对提高开发效率、促进持续集成与交付的显著影响。我们将从云原生的基本概念出发,逐步展开到容器化、微服务架构、自动化管理的实践操作,以及这些技术如何协同工作以支持复杂应用的快速迭代和扩展。文章旨在为开发者提供一套云原生技术的实践框架,帮助他们构建更加灵活、可维护的应用系统。