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()方法。