国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

kube-scheduler的代碼邏輯和二次開發(fā)

heartFollower / 3469人閱讀

摘要:代碼的組織結(jié)構(gòu)中,仍然是作為一個(gè)放在代碼中,在根目錄下的目錄中,目錄是其編譯入口,目錄是其主要核心代碼。而如果通過指定啟動(dòng),參數(shù)中的算法都來自的方法。登記時(shí)會(huì)提供自己本身包含的兩類算法的集合。

kube-scheduler代碼的組織結(jié)構(gòu)(ver:1.9.2)

1.9中,kube-scheduler仍然是作為一個(gè)“plugin”放在k8s代碼中,在k8s根目錄下的plugin目錄中,cmd/kube-scheduler目錄是其編譯入口,pkg/scheduler目錄是其主要核心代碼。如圖:

在即將發(fā)布的1.10中,社區(qū)將kube-scheduler從plugin中移出,嵌入到與api-server、kubelet等組件平級(jí)的目錄。也即根目錄下的cmd、pkg目錄:

調(diào)度器的算法是如何生效的 調(diào)度器二進(jìn)制啟動(dòng)

調(diào)度器可以在啟動(dòng)時(shí)指定其算法的來源。算法來源有三種:a)本地policy文件;b)policy configMap;c)指定提供者。

對(duì)象*scheduler.Config記錄了算法來源,當(dāng)啟動(dòng)參數(shù)中policy相關(guān)參數(shù)不為空時(shí),會(huì)從相應(yīng)的文件或者configMap中讀取調(diào)度策略;否則檢查algorithm-provider參數(shù),這個(gè)參數(shù)會(huì)列出當(dāng)前可用的provider,如果沒有明確指定,那么代碼將啟動(dòng)默認(rèn)的provider:default

從policy讀取的調(diào)度策略,其內(nèi)容是一個(gè)policy結(jié)構(gòu)

type Policy struct {
     metav1.TypeMeta
       // Holds the information to configure the fit predicate functions
     Predicates []PredicatePolicy
       // Holds the information to configure the priority functions
     Priorities []PriorityPolicy
       // Holds the information to communicate with the extender(s)
     ExtenderConfigs []ExtenderConfig
       // RequiredDuringScheduling affinity is not symmetric, but there is an implicit PreferredDuringScheduling affinity rule
 // corresponding to every RequiredDuringScheduling affinity rule.
 // HardPodAffinitySymmetricWeight represents the weight of implicit PreferredDuringScheduling affinity rule, in the range 1-100.
     HardPodAffinitySymmetricWeight int32
}

代碼會(huì)直接根據(jù)policy的內(nèi)容,調(diào)用CreateFromKeys 方法去構(gòu)建最終的scheduler

當(dāng)沒有指定policy時(shí),如果沒有指定provider,最后會(huì)執(zhí)行下面這個(gè)函數(shù)

// Create creates a scheduler with the default algorithm provider.
func (f *configFactory) Create() (*scheduler.Config, error) {
    return f.CreateFromProvider(DefaultProvider)
}

隨后也會(huì)調(diào)用CreateFromKeys 方法構(gòu)建最終的genericScheduler

調(diào)度器算法注入

上面的過程中,會(huì)最終都調(diào)用到func (f *configFactory) CreateFromKeys。 這個(gè)函數(shù)將參數(shù)中的predicate算法、priority算法等注入到調(diào)用鏈中,這個(gè)調(diào)用鏈中的函數(shù),會(huì)在每次調(diào)度pod時(shí)被調(diào)用。兩個(gè)調(diào)用鏈分別是genericScheduler結(jié)構(gòu)中的:

type genericScheduler struct {
    ...
    predicates            map[string]algorithm.FitPredicate
    ...
    prioritizers          []algorithm.PriorityConfig
    ...
}

當(dāng)通過policy啟動(dòng)時(shí),CreateFromKeys 方法的參數(shù)中的算法都記錄到了policy對(duì)象中的成員變量里。而如果通過指定provider啟動(dòng),參數(shù)中的算法都來自provider 的init方法。

我們通過閱讀provider的init方法,以及init過程中引用到的plugins.go的一些方法,就能知道大概的流程是:

1.調(diào)度器的algorithmprovider目錄下存放了一個(gè)defaults provider,以及一個(gè)plugins.go的文件,plugins.go提供了provider登記需要的一些方法。

2.plugins.go 中維護(hù)了一個(gè)全局的map:algorithmProviderMap, 這個(gè)map的key即provider的名字,value是一個(gè)結(jié)構(gòu),維護(hù)了兩個(gè)string集合,用于記錄該provider需要的prodicate算法名和priority算法名:

type AlgorithmProviderConfig struct {

FitPredicateKeys     sets.String
PriorityFunctionKeys sets.String

}
3.provider的init方法中調(diào)用factory.RegisterAlgorithmProvider方法,向上文的map中登記自己。登記時(shí)會(huì)提供自己本身包含的兩類算法的集合??蓞⒖?b>defaults/defaults.go 中的:

registerAlgorithmProvider(defaultPredicates(), defaultPriorities())

defaultPredicates()、defaultPriorities()兩個(gè)函數(shù)返回的就是兩個(gè)集合,只有集合中的字符串對(duì)應(yīng)的算法才會(huì)注入到genericScheduler ,從而被調(diào)用。而這里字符串和真實(shí)算法function的映射關(guān)系,分別記錄在兩個(gè)全局map:

fitPredicateMappriorityFunctionMap中,defaults.go中 調(diào)用的RegisterFitPredicate、RegisterMandatoryFitPredicate等許多方法均會(huì)將算法名和算法方法的映射記錄到map中。

這里注意到,并不是所有的算法都會(huì)登記到集合中的,這里PodFitsPortsPodFitsHostPorts、PodFitsResources等算法只是記錄到map中,并沒有登記到set中,但是也被調(diào)用了,這是因?yàn)檫@些算法都屬于GeneralPredicates算法,在GeneralPredicates算法中被調(diào)用。而代碼中下文我們會(huì)看到在default provider 中登記了GeneralPredicates算法

總結(jié)下來就是:要將predicate算法或prioirity算法的映射關(guān)系注冊(cè)到全局map中,然后將算法名登記到provider中,再將provider登記到全局map中,在啟動(dòng)scheduler時(shí)指定provider的name,就可以使用相應(yīng)的provider名下登記的算法來構(gòu)造genericScheduler。

如何增加算法

上文中提及的plugins.go中, 還提供了一些額外的方法,比如:InsertPredicateKeyToAlgoProvider方法,可以將某個(gè)算法登記到指定的provider中。

因此,我們只要在init時(shí)將自定義的算法先注冊(cè)到全局map中:

func init() {
   factory.RegisterFitPredicate("PodFitsNeteaseResources", predicates.PodFitsNeteaseResources))
}

然后在defaults/defaults.go 的init方法尾部,調(diào)用InsertPredicateKeyToAlgoProvider將帶有自定義算法的名字的set加入default provider即可:

factory.InsertPredicateKeyToAlgoProvider(factory.DefaultProvider, sets.NewString("PodFitsNeteaseResources"))

上述是一個(gè)比較規(guī)范的注冊(cè)方式,也有投機(jī)取巧的方式,比如在default provider 的func defaultPredicates() 方法尾部增加一行:

factory.RegisterFitPredicate("PodFitsNeteaseResources", predicates.PodFitsNeteaseResources))

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/32652.html

相關(guān)文章

  • kube-scheduler調(diào)度擴(kuò)展

    摘要:調(diào)度擴(kuò)展自帶了一個(gè)默認(rèn)調(diào)度器,其內(nèi)置了很多節(jié)點(diǎn)預(yù)選和優(yōu)選的調(diào)度算法,一般調(diào)度場(chǎng)景下可以滿足要求。我們就需要對(duì)調(diào)度器進(jìn)行擴(kuò)展,以達(dá)到調(diào)度適合業(yè)務(wù)場(chǎng)景的目的。可以參考故采用第三種實(shí)現(xiàn)擴(kuò)展調(diào)度程序的方案。以保證和擴(kuò)展調(diào)度程序的通信。 kube-scheduler調(diào)度擴(kuò)展 Kubernetes 自帶了一個(gè)默認(rèn)調(diào)度器kube-scheduler,其內(nèi)置了很多節(jié)點(diǎn)預(yù)選和優(yōu)選的調(diào)度算法,一般調(diào)度場(chǎng)景...

    fobnn 評(píng)論0 收藏0
  • kube-scheduler調(diào)度擴(kuò)展

    摘要:調(diào)度擴(kuò)展自帶了一個(gè)默認(rèn)調(diào)度器,其內(nèi)置了很多節(jié)點(diǎn)預(yù)選和優(yōu)選的調(diào)度算法,一般調(diào)度場(chǎng)景下可以滿足要求。我們就需要對(duì)調(diào)度器進(jìn)行擴(kuò)展,以達(dá)到調(diào)度適合業(yè)務(wù)場(chǎng)景的目的??梢詤⒖脊什捎玫谌N實(shí)現(xiàn)擴(kuò)展調(diào)度程序的方案。以保證和擴(kuò)展調(diào)度程序的通信。 kube-scheduler調(diào)度擴(kuò)展 Kubernetes 自帶了一個(gè)默認(rèn)調(diào)度器kube-scheduler,其內(nèi)置了很多節(jié)點(diǎn)預(yù)選和優(yōu)選的調(diào)度算法,一般調(diào)度場(chǎng)景...

    劉德剛 評(píng)論0 收藏0
  • Android 應(yīng)用防止被二次打包指南

    摘要:接下來,我就來詳解一下如何防止被二次打包。開發(fā)階段移動(dòng)應(yīng)用開發(fā)時(shí)接入安全組件,保護(hù)數(shù)據(jù)安全。 前言 Android APP二次打包則是盜版正規(guī)Android APP,破解后植入惡意代碼重新打包。不管從性能、用戶體驗(yàn)、外觀它都跟正規(guī)APP一模一樣但是背后它確悄悄運(yùn)行著可怕的程序,它會(huì)在不知不覺中浪費(fèi)手機(jī)電量、流量,惡意扣費(fèi)、偷窺隱私等等行為。 二次打包問題只是Android應(yīng)用安全風(fēng)險(xiǎn)中...

    PAMPANG 評(píng)論0 收藏0
  • 獲取到 prepay_id 后將參數(shù)再次簽名傳輸給 APP 發(fā)起支付

    摘要:微信支付支付在服務(wù)端調(diào)用統(tǒng)一下單接口后,服務(wù)端需要將返回的訂單數(shù)據(jù)進(jìn)行二次簽名后才能返回給端。微信支付服務(wù)端提供了類,類中也的確提供了生成簽名方法,即對(duì)結(jié)果集簽名,源碼如下以版為例,其他語言自行對(duì)照。 獲取到 prepay_id 后將參數(shù)再次簽名傳輸給 APP 發(fā)起支付。 相信有不少同學(xué)因?yàn)榭吹浇y(tǒng)一下單返回的結(jié)果中有 sign 字段,會(huì)直接將結(jié)果返回給 APP 端,結(jié)果 APP 端沒辦...

    Miracle_lihb 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

heartFollower

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<