您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)kubernetes中怎么實(shí)現(xiàn)資源擴(kuò)展機(jī)制,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
PluginManager是一個(gè)上層組件,其內(nèi)部包含了上篇文章中的關(guān)鍵組件,并且協(xié)調(diào)其內(nèi)部數(shù)據(jù)流,而且還提供針對(duì)不同插件的具體的控制器
核心結(jié)構(gòu)里面其實(shí)就是按照數(shù)據(jù)流來進(jìn)行設(shè)計(jì)的,首先需要一個(gè)感知插件desiredStateOfWorldPopulator用于感知后端服務(wù)的創(chuàng)建或者刪除,然后將感知到的事件加入到desiredStateOfWorld期望狀態(tài)緩存,由reconciler負(fù)責(zé)期進(jìn)行底層的注冊(cè)和下線,并且將結(jié)果存儲(chǔ)到actualStateOfWorld實(shí)際狀態(tài)緩存
type pluginManager struct {
// 插件感知
desiredStateOfWorldPopulator *pluginwatcher.Watcher
// 協(xié)調(diào)器插件
reconciler reconciler.Reconciler
// 實(shí)際狀態(tài)緩存
actualStateOfWorld cache.ActualStateOfWorld
// 期望狀態(tài)緩存
desiredStateOfWorld cache.DesiredStateOfWorld
}
初始化中會(huì)將dsw和asw都交給reconciler用于進(jìn)行事件的感知和更新對(duì)應(yīng)的緩存
func NewPluginManager(
sockDir string,
recorder record.EventRecorder) PluginManager {
asw := cache.NewActualStateOfWorld()
dsw := cache.NewDesiredStateOfWorld()
// 這里會(huì)將期望狀態(tài)緩存和實(shí)際狀態(tài)緩存,都交給reconciler
reconciler := reconciler.NewReconciler(
operationexecutor.NewOperationExecutor(
operationexecutor.NewOperationGenerator(
recorder,
),
),
loopSleepDuration,
dsw,
asw,
)
pm := &pluginManager{
// 啟動(dòng)一個(gè)watcher并且存儲(chǔ)dsw期望狀態(tài)緩存,后續(xù)reconciler就可以通過dsw感知到新的狀態(tài)了
desiredStateOfWorldPopulator: pluginwatcher.NewWatcher(
sockDir,
dsw,
),
reconciler: reconciler,
desiredStateOfWorld: dsw,
actualStateOfWorld: asw,
}
return pm
}
插件管理器啟動(dòng)其實(shí)就是啟動(dòng)內(nèi)部的desiredStateOfWorldPopulator就會(huì)講watcher感知的事件,不斷的修改自己的內(nèi)部緩存這樣reconciler就可以不斷的通過期望狀態(tài)緩存,進(jìn)行對(duì)應(yīng)grpc的調(diào)用從而滿足期望狀態(tài)
func (pm *pluginManager) Run(sourcesReady config.SourcesReady, stopCh <-chan struct{}) {
defer runtime.HandleCrash()
// 運(yùn)行期望狀態(tài)緩存,其實(shí)主要是通過watcher感知到的事件,修改自身的緩存
// 后續(xù)reconciler會(huì)周期性的獲取
pm.desiredStateOfWorldPopulator.Start(stopCh)
klog.V(2).Infof("The desired_state_of_world populator (plugin watcher) starts")
klog.Infof("Starting Kubelet Plugin Manager")
// 周期性的運(yùn)行校證數(shù)據(jù)
go pm.reconciler.Run(stopCh)
metrics.Register(pm.actualStateOfWorld, pm.desiredStateOfWorld)
<-stopCh
klog.Infof("Shutting down Kubelet Plugin Manager")
}
控制器其實(shí)主要是指的reconciler通過對(duì)比期望緩存和實(shí)際緩存之間的差異,產(chǎn)生對(duì)應(yīng)的事件之后,針對(duì)該類型的插件,后續(xù)的處理流程是什么,比如注冊(cè)/下線具體的grpc接口和對(duì)應(yīng)插件類型的處理機(jī)制
func (pm *pluginManager) AddHandler(pluginType string, handler cache.PluginHandler) {
pm.reconciler.AddHandler(pluginType, handler)
}
當(dāng)前的kubelet中有注冊(cè)兩種類型的插件控制器,CSI與DEVICPLUGIn,從名字上大家也能知道大概的意思
kl.pluginManager.AddHandler(pluginwatcherapi.CSIPlugin, plugincache.PluginHandler(csi.PluginHandler))
kl.pluginManager.AddHandler(pluginwatcherapi.DevicePlugin, kl.containerManager.GetPluginRegistrationHandler())
這里我們只介紹一個(gè)即DevicePlugin的核心實(shí)現(xiàn)機(jī)制
Endpoint其實(shí)指的就是某個(gè)提供擴(kuò)展資源的服務(wù),在之前說的reconciler中,會(huì)獲取其對(duì)應(yīng)的grpc服務(wù)的地址,后續(xù)則會(huì)直接調(diào)用grpc進(jìn)行通信
Endpoint需要感知對(duì)應(yīng)的資源設(shè)備的變化,同時(shí)將對(duì)應(yīng)的設(shè)備信息,回調(diào)通知給當(dāng)前的
Manager則是主要負(fù)責(zé)實(shí)現(xiàn)后端真正的Register/UnRegister的具體實(shí)現(xiàn),其在內(nèi)部會(huì)為每個(gè)Device創(chuàng)建一個(gè)Endpoint并負(fù)責(zé)收集后端提供資源服務(wù)上報(bào)上來的信息, 最終會(huì)講對(duì)應(yīng)的信息發(fā)送給kubelet,然后由kubelet在負(fù)責(zé)節(jié)點(diǎn)信息更新的時(shí)候,將信息傳遞給APIServer
Checkpoint機(jī)制其實(shí)在很多系統(tǒng)中都比較常用,主要是用于周期性的將內(nèi)存中的數(shù)據(jù)序列化存儲(chǔ)到本地的磁盤中,在后續(xù)恢復(fù)的時(shí)候,會(huì)通過磁盤重新加載之前的數(shù)據(jù),從而實(shí)現(xiàn)內(nèi)存資源的快速恢復(fù)
擴(kuò)展資源的整體實(shí)現(xiàn)流程大概就是這個(gè)樣子,從如何感知數(shù)據(jù),注冊(cè)資源服務(wù),獲取資源服務(wù)的資源信息,并最終匯報(bào)給kubelet,同時(shí)落地本地磁盤,實(shí)現(xiàn)了完整的資源從感知到上報(bào)的整體流程的探測(cè),其不足主要是在于關(guān)于資源實(shí)體的描述,從而導(dǎo)致資源的分配和資源的上報(bào)上有比較大的擴(kuò)展性限制,比如要實(shí)現(xiàn)精細(xì)化的資源分配擴(kuò)展,則不太能實(shí)現(xiàn)
看完上述內(nèi)容,你們對(duì)kubernetes中怎么實(shí)現(xiàn)資源擴(kuò)展機(jī)制有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。