天天看點

帶你讀《雲原生應用開發 Operator原理與實踐》第三章 Kubebuilder 原理3.3 Controller-runtime 子產品分析(四)

2. 建立

pkg/manager/internal.go中的 controllerManager對象實作了 Manager接口,可以通過manager.New()方法建立(見代碼清單3-26)。

...

mgr,err:=manager.New(cfg,manager.Options{})iferr!=nil{

log.Error(err,"unabletosetupmanager")os.Exit(1)

}

其中,方法的第一個參數為 rest.Config對象,定義了如何通路Kube-APIServer ;第二個參數為 manager.Options對象,用于配置 Manager,主要包括以下内容。

(3)  Scheme結構。一般先通過k8s.io/apimachinery/pkg/runtime中的 NewScheme()方法擷取Kubernetes的Scheme,然後再将CRD注冊到Scheme中(見代碼清單3-27)。

varscheme=runtime.NewScheme()

funcinit(){crd1.AddToScheme(scheme)crd2.AddToScheme(scheme)

(2)  MapperProvider是一個函數對象,其定義為 func(c*rest.Config)(meta.REST- Mapper,error),用于定義 Manager如何擷取RESTMapper。預設通過 k8s.io/client-go中的 DiscoveryClient請求擷取Kube-APIServer。

(3)  Logger用于定義 Manager的日志輸出對象,預設使用 pkg/internal/log包下的全局參數 RuntimeLog。

(4)  SyncPeriod參數用于指定 Informer 重新同步并處理資源的時間間隔,預設為10小時。此參數也決定了Controller重新同步的時間間隔,每個 Controller的時間間隔以此參數為基準有10% 的抖動,以避免多個 Controller同時進行重新同步。

(5)   LeaderElection、LeaderElectionResourceLock、LeaderElectionNamespace、LeaderElectionID等用于開啟和配置 Manager的選舉。其中,LeaderElectionResource-Lock配置選舉鎖的類型可以為 Leases、Configmapsleases、Endpointsleases等, 預設為Configmapslease。LeaderElectionNamespace、LeaderElectionID用于配置鎖資源的Namespace和Name(見代碼清單3-28)。

LeaderElectionboolLeaderElectionResourceLockstringLeaderElectionNamespacestringLeaderElectionIDstring

//通路選舉鎖所在的APIServer的配置

LeaderElectionConfig*rest.Config

//當設定為True時,Manager結束前會主動釋放選舉鎖,否則需要等到選舉任期結束

//才能進⾏新的選舉。此選項可以加快重新選舉的速度

LeaderElectionReleaseOnCancelbool

//候選⼈強制擷取 Leader的時間,相當于⼀個選舉任期,預設為 15sLeaseDuration*time.Duration

//當選 Leader後,重新整理選舉資訊的間隔,其需要⼩于 LeaseDuration,預設為 10sRenewDeadline*time.Duration

//候選⼈嘗試競選的時間間隔預設為 2sRetryPeriod*time.Duration

(6)  Namespace參數用于限制 Manager.Cache隻監聽指定 Namespace的資源,預設情況下無限制。

(7)  NewCache參數的類型為 cache.NewCacheFunc,Manager會調用此參數建立Cache,是以,可以用于自定義 Manager使用的 Cache。在預設情況下,Manager使用InformersMap對象實作 Cache接口,InformersMap接口的實作在 pkg/cache/internal/deleg_map.go中(見代碼清單3-29)。

typeNewCacheFuncfunc(config*rest.Config,optsOptions)(Cache,error)

(8)  ClusterBuilder參數的類型為 ClientBuilder接口,Manager會調用此接口建立 Client,即 Manager.GetClient()傳回的 Client。在預設情況下,Manager使用pkg/cluster下的 newClientBuilder對象建立 Client。

(9)  ClientDisableCacheFor參數用于配置 Client,指定某些資源對象的操作不使用緩存,而是直接操作 Kube-APIServer。

(10)   EventBroadcaster參數用于提供 Manager,以擷取 EventRecorder,目前已不推薦使用,因為當Manager或Controller的生命周期短于EventBroadcaster的生命周期時,可能會導緻 goroutine洩露。

2. 實作ControllerManager對象是 Manager的實作,其結構成員中部分成員是直接通過manager.Options傳入的,或是通過 manager.Options傳入的方法建立的,另外一些主要的成員如下。

(1)cluster.Cluster接口類型成員Cluster:提供 Manager接口中的匿名成員 cluster.

Cluster 的實作。

(2)[]Runnable類型成員 leaderElectionRunnables與 nonLeaderElectionRunnables:兩者存儲了所有注冊到Manager中的 Controller、WebHookServer 以及自定義對象,按照是否需要遵循選舉機制 []Runnable 類型成員分為兩類,nonLeaderElectionRunnables中的 Runnable,在調用 Manager.Start()方法後會立即啟動。

(3)   metricsListener和 healthProbeListener:類型都為 net.Listener,前者是Prome- theus監控服務的監聽對象,後者是健康檢查服務的監聽對象。

(4)   WebHookServer:WebHook的服務對象, 在Manager.GetWebhookServer()方法被調用時,進行建立并傳回。

(5)   startCache:是函數對象,類型為 func(ctxcontext.Context)error,用于啟動緩存的同步。 在啟動 leaderElectionRunnables和 nonLeaderElectionRunnables之前,Manager會先調用此方法啟動緩存同步,并等待同步完成,啟動 Runnable。在實作上,startCache實際上是 cluster.Cluster.Start()方法。