中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Controller實現ReplicaSetController的示例分析

發布時間:2021-12-15 18:55:46 來源:億速云 閱讀:164 作者:柒染 欄目:云計算

這篇文章給大家介紹Controller實現ReplicaSetController的示例分析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Controller的實現基本上都是通過SharedInformer的結構去監聽etcd上某種資源的變更,然后再執行對應的業務邏輯。

以ReplicaSetController為例,介紹一個controller如何與整個manager組合在一起。

controller啟動

controllers都是在NewControllerInitializers()方法中引入到manager里的:

func NewControllerInitializers() map[string]InitFunc {

   controllers := map[string]InitFunc{}

   ....

   controllers["replicaset"] = startReplicaSetController

   ....

   return controllers

}

startReplicaSetController是啟動函數,如下:

func startReplicaSetController(ctx ControllerContext) (bool, error) {

   if !ctx.AvailableResources[schema.GroupVersionResource{Group: "extensions", Version: "v1beta1", Resource: "replicasets"}] {

      return false, nil

   }

   // 獲取監聽ReplicaSets/Pods的Informer

   go replicaset.NewReplicaSetController(

      ctx.InformerFactory.Extensions().V1beta1().ReplicaSets(),

      ctx.InformerFactory.Core().V1().Pods(),

      ctx.ClientBuilder.ClientOrDie("replicaset-controller"),

      replicaset.BurstReplicas,

   ).Run(int(ctx.Options.ConcurrentRSSyncs), ctx.Stop)

   return true, nil

}

創建過程如下:

// NewReplicaSetController configures a replica set controller with the specified event recorder

func NewReplicaSetController(rsInformer extensionsinformers.ReplicaSetInformer, podInformer coreinformers.PodInformer, kubeClient clientset.Interface, burstReplicas int) *ReplicaSetController {

   ....

   // 初始化controller

   rsc := &ReplicaSetController{

      kubeClient: kubeClient,

      podControl: controller.RealPodControl{

         KubeClient: kubeClient,

         Recorder:   eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "replicaset-controller"}),

      },

      burstReplicas: burstReplicas,

      expectations:  controller.NewUIDTrackingControllerExpectations(controller.NewControllerExpectations()),

      queue:         workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "replicaset"),

   }

 

   // 在replica set informer上注冊回調handler

   rsInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{

      AddFunc:    rsc.enqueueReplicaSet,

      UpdateFunc: rsc.updateRS,

      // This will enter the sync loop and no-op, because the replica set has been deleted from the store.

      // Note that deleting a replica set immediately after scaling it to 0 will not work. The recommended

      // way of achieving this is by performing a `stop` operation on the replica set.

      DeleteFunc: rsc.enqueueReplicaSet,

   })

   rsc.rsLister = rsInformer.Lister()

   rsc.rsListerSynced = rsInformer.Informer().HasSynced

 

   // 在pod informer上注冊回調

   podInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{

      AddFunc: rsc.addPod,

      // This invokes the ReplicaSet for every pod change, eg: host assignment. Though this might seem like

      // overkill the most frequent pod update is status, and the associated ReplicaSet will only list from

      // local storage, so it should be ok.

      UpdateFunc: rsc.updatePod,

      DeleteFunc: rsc.deletePod,

   })

   rsc.podLister = podInformer.Lister()

   rsc.podListerSynced = podInformer.Informer().HasSynced

 

   // syncReplicaSet整個controller實際業務邏輯的入口,會被回調觸發

   rsc.syncHandler = rsc.syncReplicaSet

 

   return rsc

}

Replica Set資源變更回調

Informer監聽到的變更最終會回調到syncReplicaSet方法上,但當中會穿越多個協程,邏輯比較復雜。用一個時序圖近似表示如下:

1.Controller變更通知

這里的controller是Informer層的結構,對于資源變更會觸發HandleDeltas()方法。HandleDeltas方法會調用sharedProcessor.distribute方法,將Delta傳入到processListener的channel上,等待被處理。

2.processorListener.run

run方法會不斷拉取listener自己本地channel中的變更,并根據ActionType分發到注冊的handler上的不同方法里。

在上文介紹的NewReplicaSetController()函數里,可以看到AddFunc對應的回調函數是enqueueReplicaSet。最終會把delta放入ReplicaSetController自己的queue隊列中,等待controller處理。

3.ReplicaSetController.processNextItem

processNextItem方法會處理RepliaSetController.queue當中的變更信息,最終調用syncReplicaSet方法來處理變更,確保Pods和配置一致。

Controller實現ReplicaSetController的示例分析

每個Controller的處理邏輯都不相同,但與manager & informer的交互大體類似。

ReplicaSetController的分析中可以再次看出go實現中,調用順序和傳統面向對象語言有很大差異。

關于Controller實現ReplicaSetController的示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沾益县| 乌海市| 博野县| 佛冈县| 金乡县| 平谷区| 壤塘县| 衡东县| 大丰市| 姜堰市| 勐海县| 新邵县| 礼泉县| 葫芦岛市| 沙田区| 古田县| 渭南市| 军事| 临泉县| 绥德县| 新和县| 东台市| 庐江县| 炎陵县| 井研县| 黄陵县| 达孜县| 泸定县| 都匀市| 遂溪县| 邵阳县| 上杭县| 奈曼旗| 哈巴河县| 边坝县| 海南省| 白城市| 图木舒克市| 合肥市| 剑川县| 顺义区|