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

3.3.2      Manager

Manager是 Controller-runtime库中最主要的结构,可以用来启动Controller、管理Controller依赖、提供集群相关资源的获取方式等。

1. 接口

 

在 pkg/manager/manager.go中,定义了 Manager接口,部分开发者常用的方法如下。


 

(1)      cluster.Cluster:接 口类型,Manager的匿名成员,Manager继承了 cluster.

Cluster 的所有方法。cluster.Cluster 提供了一系列方法,以获取与集群相关的对象。开发者可以通过以下几种方式访问 Kubernete集群中的资源。

① 通过 Manager.GetClient() 可以获取client.Client,从而对 Kubernetes资源进行读写,这也是推荐的方式。在读操作上,client.Client直接查询 Cache中的资源,Cache基于List-Watch机制缓存了Kube-APIServer中的部分资源。在写操作上,client. Client 会向 Kube-APIServer 发送请求。

② 通 过 Manager.GetAPIReader()获 取 client.Reader,client.Reader 只 用 于 查 询Kubernetes资源,但不再使用Cache,而是直接向Kube-APIServer发送请求,效率相对 client.Client 较低。

另外,还可以通过cluster.Cluster获取集群的常用数据。

① 通过 Manager.GetConfig() 获取Kube-APIServer的 rest.Config配置,可用于 k8s.io/client-go中 ClientSet的创建。

② 通过 Manager.GetScheme() 获取 Kubernetes 集群资源的 Scheme,可以用于注册 CRD

③ 通 过 Manager.GetEventRecorderFor() 获 取 EventRecorder, 可 以 用 于 创 建Kubernetesevent到集群中。

④ 通过 Manager.GetRESTMapper()获取 RESTMapper,存储了 Kube-APIServer中资源 Resource与 Kind的对应关系, 可以将 GroupVersionResource转换为对应的GroupVersionKind。

⑤ 通过Manager.GetCache() 获取 Cache。

cluster.Cluster还提供了 SetFields()接口,用于“注入”Controller的依赖。此接口在创建Controller时作为函数对象保存在 Controller中,在 Controller启动前调用。

(2)      Manager.Start()方法会启动所有注册到 Manager中的 Controller。当开启了Manager的选举功能时,Manager会在启动前尝试获取 Leader,只有当选 Leader成功,Manager才会启动注册的 Controller。

除了 Controller外,开发者可以通过 Manager.Add(Runnable)方法注册自定义的对象,例如,注册一个HTTPServer,只需要自定义的对象实现Runnable接口的Start(context.Context)error()方法即可。一般在通过pkg/builder下的 Builder创建Controller对象时,Builder会自动调用 Manager.Add(Runnable)方法将 Controller对象注册到 Manager中。

与Controller相同,在调用 Manager.Start() 后,Manager会调用自定义对象的Start(context.Context)error() 方法, 用来启动自定义对象。当自定义对象同时实现了LeaderElectionRunnable接口的   NeedLeaderElection()   方法时,Manager   会在启动前判断此自定义对象是否需要遵循选举机制来启动,在默认情况下,对于未实现此接口    的自定义对象,其效果与实现了此接口且返回为 True时一样。

(3)     Controller-runtime还提供了 KubernetesAdmissionWebHook机制实现的框架,通过 Manager.GetWebHookServer() 方法,可以获取一个空的WebHook.Server对象,开发者只需要调用WebHook.Server的Register() 方法,将处理逻辑注册到服务中即可。与Controller一样,WebHook.Server也会自动注册到 Manager中,并由 Manager负责启动。

(4)      Manager.AddReadyzCheck() 方法与 Manager.AddHealthzCheck() 方法用于添加自定义的健康检查逻辑,对应于 Kubernete的 Readyz探针和 Healthz探针,Manager根据添加的自定义检查逻辑以HTTP的方式在指定端口反馈检查结果。

(5)    Manager.AddMetricsExtraHandler() 方法用于自定义 Manager的监控项,Contr -oller-runtime中默认定义了部分 Prometheus的监控项,涉及 Manager、Controller、Cache等,另外,开发者也可以通过此方法将自定义的服务监控注册到HTTPServer的指定路径上,对于更加复杂的自定义服务监控功能,可以将其实现为 Runnable接口,注册到 Manager中。

(6)      Manager.Elected()方法可以返回一个 Channel 结构,用于判断选举状态。当未配置选举或当选 Leader时,Channel将被关闭。

上一篇:带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.3 Controller-runtime 模块分析(四)


下一篇:带你读《云原生应用开发 Operator原理与实践》第三章 Kubebuilder 原理3.3 Controller-runtime 模块分析(三)