91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

石河子市| 云南省| 永寿县| 安溪县| 泌阳县| 海口市| 周至县| 纳雍县| 嘉善县| 洱源县| 张家港市| 保定市| 西吉县| 栖霞市| 宜川县| 山西省| 达孜县| 类乌齐县| 绥芬河市| 营山县| 江川县| 江城| 伊吾县| 谢通门县| 盐津县| 信宜市| 溆浦县| 三穗县| 东乡县| 阳江市| 扬州市| 馆陶县| 砚山县| 辽宁省| 出国| 柏乡县| 天全县| 安达市| 麻栗坡县| 扶沟县| 蓝田县|