kubernets pod調(diào)度原理

kubernets中負責(zé)pod調(diào)度的重要模塊是kube-schduler。kube-scheduler就是調(diào)度安排Pod到具體的Node爹土,,kube-scheduler通過API Server提供的接口監(jiān)聽Pod任務(wù)列表,獲取待調(diào)度pod,然后根據(jù)一系列的預(yù)選策略和優(yōu)選策略給各個Node節(jié)點打分嗤谚,然后將Pod發(fā)送到得分最高的Node節(jié)點上,同時將綁定信息寫入etcd.

node節(jié)點上的kubelet通過kuber-apiserver的監(jiān)聽怔蚌,獲取kube-scheduler產(chǎn)生的綁定事件巩步,獲取pod清單,下載鏡像桦踊,啟動容器渗钉。

調(diào)度策略

Kubernetes的調(diào)度策略分為Predicates(預(yù)選策略)和Priorites(優(yōu)選策略),整個調(diào)度過程分為兩步:

  1. 預(yù)選策略钞钙,Predicates是強制性規(guī)則,遍歷所有的Node節(jié)點声离,按照具體的預(yù)選策略篩選出符合要求的Node列表芒炼,如沒有Node符合Predicates策略規(guī)則,那該Pod就會被掛起术徊,直到有Node能夠滿足本刽。

  2. 優(yōu)選策略,在第一步篩選的基礎(chǔ)上赠涮,按照優(yōu)選策略為待選Node打分排序子寓,獲取最優(yōu)者。

  1. 源碼位置:

predicates包為k8s支持的所有預(yù)選策略

priorites包為k8s支持的所有優(yōu)選策略

algorithmprovider包下的defaults包為默認的預(yù)選和優(yōu)選策略

Predicates 預(yù)選策略

v1.7支持15個策略笋除,Kubernetes(v1.7)中可用的Predicates策略有:

  • MatchNodeSelector:檢查spec.nodeSelector是否包含Node節(jié)點的label定義
  • PodFitsResources:檢查主機的資源(cpu和內(nèi)存)是否滿足Pod的需求斜友,根據(jù)實際已經(jīng)分配(Limit)的資源量做調(diào)度
  • PodFitsHostPorts:檢查Pod內(nèi)每一個容器所需的HostPort是否已被其它容器占用,如果有所需的HostPort不滿足需求垃它,那么Pod不能調(diào)度到這個主機上
  • HostName:檢查主機名稱是不是Pod指定的NodeName
  • NoDiskConflict:根據(jù)pod.spec.volumes檢查在此主機上是否存在卷沖突鲜屏。如果這個主機已經(jīng)掛載了卷,其它同樣使用這個卷的Pod不能調(diào)度到這個主機上国拇,不同的存儲后端具體規(guī)則不同
  • NoVolumeZoneConflict:檢查給定的zone限制前提下洛史,檢查如果在此主機上部署Pod是否存在卷沖突
  • PodToleratesNodeTaints:確保pod定義的tolerates能接納node定義的taints
  • CheckNodeMemoryPressure:檢查pod是否可以調(diào)度到已經(jīng)報告了主機內(nèi)存壓力過大的節(jié)點
  • CheckNodeDiskPressure:檢查pod是否可以調(diào)度到已經(jīng)報告了主機的存儲壓力過大的節(jié)點
  • MaxEBSVolumeCount:確保已掛載的EBS存儲卷不超過設(shè)置的最大值,默認39
  • MaxGCEPDVolumeCount:確保已掛載的GCE存儲卷不超過設(shè)置的最大值酱吝,默認16
  • MaxAzureDiskVolumeCount:確保已掛載的Azure存儲卷不超過設(shè)置的最大值也殖,默認16
  • MatchInterPodAffinity:檢查pod和其他pod是否符合親和性規(guī)則
  • GeneralPredicates:檢查pod與主機上kubernetes相關(guān)組件是否匹配
  • NoVolumeNodeConflict:檢查給定的Node限制前提下,檢查如果在此主機上部署Pod是否存在卷沖突

Priorites 優(yōu)選策略

Kubernetes(v1.7)中可用的Priorites策略有:

  • EqualPriority:所有節(jié)點同樣優(yōu)先級
  • ImageLocalityPriority:根據(jù)主機上是否已具備Pod運行的環(huán)境來打分务热,得分計算:不存在所需鏡像忆嗜,返回0分己儒,存在鏡像,鏡像越大得分越高
  • LeastRequestedPriority:計算Pods需要的CPU和內(nèi)存在當(dāng)前節(jié)點可用資源的百分比霎褐,具有最小百分比的節(jié)點就是最優(yōu)址愿,得分計算公式
cpu((capacity – sum(requested)) * 10 / capacity) + memory((capacity – sum(requested)) * 10 / capacity) / 2
  • BalancedResourceAllocation:節(jié)點上各項資源(CPU、內(nèi)存)使用率最均衡的為最優(yōu)冻璃,得分計算公式
10 – abs(totalCpu/cpuNodeCapacity-totalMemory/memoryNodeCapacity)*10
  • SelectorSpreadPriority:按Service和Replicaset歸屬計算Node上分布最少的同類Pod數(shù)量响谓,得分計算:數(shù)量越少得分越高
  • NodePreferAvoidPodsPriority:判斷alpha.kubernetes.io/preferAvoidPods屬性,設(shè)置權(quán)重為10000省艳,覆蓋其他策略
  • NodeAffinityPriority:節(jié)點親和性選擇策略娘纷,提供兩種選擇器支持:requiredDuringSchedulingIgnoredDuringExecution(保證所選的主機必須滿足所有Pod對主機的規(guī)則要求)、preferresDuringSchedulingIgnoredDuringExecution(調(diào)度器會盡量但不保證滿足NodeSelector的所有要求)
  • TaintTolerationPriority:類似于Predicates策略中的PodToleratesNodeTaints跋炕,優(yōu)先調(diào)度到標(biāo)記了Taint的節(jié)點
  • InterPodAffinityPriority:pod親和性選擇策略赖晶,類似NodeAffinityPriority,提供兩種選擇器支持:requiredDuringSchedulingIgnoredDuringExecution(保證所選的主機必須滿足所有Pod對主機的規(guī)則要求)辐烂、preferresDuringSchedulingIgnoredDuringExecution(調(diào)度器會盡量但不保證滿足NodeSelector的所有要求)
  • MostRequestedPriority:動態(tài)伸縮集群環(huán)境比較適用遏插,會優(yōu)先調(diào)度pod到使用率最高的主機節(jié)點,這樣在伸縮集群時纠修,就會騰出空閑機器胳嘲,從而進行停機處理。

默認策略

默認預(yù)選策略

func defaultPredicates() sets.String {
    predSet := sets.NewString(
        
        factory.RegisterFitPredicateFactory(
            "NoVolumeZoneConflict",
            func(args factory.PluginFactoryArgs) algorithm.FitPredicate {
                return predicates.NewVolumeZonePredicate(args.PVInfo, args.PVCInfo)
            },
        ),
    
        factory.RegisterFitPredicateFactory(
            "MaxEBSVolumeCount",
            func(args factory.PluginFactoryArgs) algorithm.FitPredicate {
                // TODO: allow for generically parameterized scheduler predicates, because this is a bit ugly
                maxVols := getMaxVols(aws.DefaultMaxEBSVolumes)
                return predicates.NewMaxPDVolumeCountPredicate(predicates.EBSVolumeFilter, maxVols, args.PVInfo, args.PVCInfo)
            },
        ),
    
        factory.RegisterFitPredicateFactory(
            "MaxGCEPDVolumeCount",
            func(args factory.PluginFactoryArgs) algorithm.FitPredicate {
                // TODO: allow for generically parameterized scheduler predicates, because this is a bit ugly
                maxVols := getMaxVols(DefaultMaxGCEPDVolumes)
                return predicates.NewMaxPDVolumeCountPredicate(predicates.GCEPDVolumeFilter, maxVols, args.PVInfo, args.PVCInfo)
            },
        ),
    
        factory.RegisterFitPredicateFactory(
            "MaxAzureDiskVolumeCount",
            func(args factory.PluginFactoryArgs) algorithm.FitPredicate {
                // TODO: allow for generically parameterized scheduler predicates, because this is a bit ugly
                maxVols := getMaxVols(DefaultMaxAzureDiskVolumes)
                return predicates.NewMaxPDVolumeCountPredicate(predicates.AzureDiskVolumeFilter, maxVols, args.PVInfo, args.PVCInfo)
            },
        ),
    
        factory.RegisterFitPredicateFactory(
            predicates.MatchInterPodAffinity,
            func(args factory.PluginFactoryArgs) algorithm.FitPredicate {
                return predicates.NewPodAffinityPredicate(args.NodeInfo, args.PodLister)
            },
        ),

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

    

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

    
        factory.RegisterFitPredicate("CheckNodeMemoryPressure", predicates.CheckNodeMemoryPressurePredicate),

    
        factory.RegisterFitPredicate("CheckNodeDiskPressure", predicates.CheckNodeDiskPressurePredicate),

        
        factory.RegisterFitPredicateFactory(
            "NoVolumeNodeConflict",
            func(args factory.PluginFactoryArgs) algorithm.FitPredicate {
                return predicates.NewVolumeNodePredicate(args.PVInfo, args.PVCInfo, nil)
            },
        ),
    )

    if utilfeature.DefaultFeatureGate.Enabled(features.TaintNodesByCondition) {
    
        predSet.Insert(factory.RegisterMandatoryFitPredicate("PodToleratesNodeTaints", predicates.PodToleratesNodeTaints))
        glog.Warningf("TaintNodesByCondition is enabled, PodToleratesNodeTaints predicate is mandatory")
    } else {
    
        predSet.Insert(factory.RegisterMandatoryFitPredicate("CheckNodeCondition", predicates.CheckNodeConditionPredicate))
        
        predSet.Insert(factory.RegisterFitPredicate("PodToleratesNodeTaints", predicates.PodToleratesNodeTaints))
    }

    return predSet
}

默認優(yōu)選策略

    
    func defaultPriorities() sets.String {
    return sets.NewString(
    
        factory.RegisterPriorityConfigFactory(
            "SelectorSpreadPriority",
            factory.PriorityConfigFactory{
                Function: func(args factory.PluginFactoryArgs) algorithm.PriorityFunction {
                    return priorities.NewSelectorSpreadPriority(args.ServiceLister, args.ControllerLister, args.ReplicaSetLister, args.StatefulSetLister)
                },
                Weight: 1,
            },
        ),
    
        
        factory.RegisterPriorityConfigFactory(
            "InterPodAffinityPriority",
            factory.PriorityConfigFactory{
                Function: func(args factory.PluginFactoryArgs) algorithm.PriorityFunction {
                    return priorities.NewInterPodAffinityPriority(args.NodeInfo, args.NodeLister, args.PodLister, args.HardPodAffinitySymmetricWeight)
                },
                Weight: 1,
            },
        ),
    
    
        factory.RegisterPriorityFunction2("LeastRequestedPriority", priorities.LeastRequestedPriorityMap, nil, 1),
    
    
        factory.RegisterPriorityFunction2("BalancedResourceAllocation", priorities.BalancedResourceAllocationMap, nil, 1),
    
        
        factory.RegisterPriorityFunction2("NodePreferAvoidPodsPriority", priorities.CalculateNodePreferAvoidPodsPriorityMap, nil, 10000),
    
        
        factory.RegisterPriorityFunction2("NodeAffinityPriority", priorities.CalculateNodeAffinityPriorityMap, priorities.CalculateNodeAffinityPriorityReduce, 1),
    
    
        factory.RegisterPriorityFunction2("TaintTolerationPriority", priorities.ComputeTaintTolerationPriorityMap, priorities.ComputeTaintTolerationPriorityReduce, 1),
    )
}

默認注冊但不加載的策略

預(yù)選策略

// Registers predicates and priorities that are not enabled by default, but user can pick when creating his
// own set of priorities/predicates.

factory.RegisterFitPredicate("PodFitsPorts", predicates.PodFitsHostPorts)

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

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

factory.RegisterFitPredicate("HostName", predicates.PodFitsHost)

factory.RegisterFitPredicate("MatchNodeSelector", predicates.PodMatchNodeSelector)

優(yōu)選策略


factory.RegisterPriorityFunction2("EqualPriority", core.EqualPriorityMap, nil, 1)

factory.RegisterPriorityFunction2("ImageLocalityPriority", priorities.ImageLocalityPriorityMap, nil, 1)

factory.RegisterPriorityFunction2("MostRequestedPriority", priorities.MostRequestedPriorityMap, nil, 1)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扣草,一起剝皮案震驚了整個濱河市了牛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辰妙,老刑警劉巖鹰祸,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異密浑,居然都是意外死亡蛙婴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門尔破,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敬锐,“玉大人,你說我怎么就攤上這事呆瞻√ǘ幔” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵痴脾,是天一觀的道長颤介。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么滚朵? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任冤灾,我火速辦了婚禮,結(jié)果婚禮上辕近,老公的妹妹穿的比我還像新娘韵吨。我一直安慰自己,他們只是感情好移宅,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布归粉。 她就那樣靜靜地躺著,像睡著了一般漏峰。 火紅的嫁衣襯著肌膚如雪糠悼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天浅乔,我揣著相機與錄音倔喂,去河邊找鬼。 笑死靖苇,一個胖子當(dāng)著我的面吹牛席噩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贤壁,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼班挖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芯砸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤给梅,失蹤者是張志新(化名)和其女友劉穎假丧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體动羽,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡包帚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了运吓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渴邦。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拘哨,靈堂內(nèi)的尸體忽然破棺而出谋梭,到底是詐尸還是另有隱情,我是刑警寧澤倦青,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布瓮床,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏隘庄。R本人自食惡果不足惜踢步,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丑掺。 院中可真熱鬧获印,春花似錦、人聲如沸街州。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菇肃。三九已至地粪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琐谤,已是汗流浹背蟆技。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斗忌,地道東北人质礼。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像织阳,于是被迫代替她去往敵國和親眶蕉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • kubernetes 簡介 一個迅速過一遍kubernetes 非常不錯的資源:基于Kubernetes構(gòu)建Doc...
    bradyjoestar閱讀 15,285評論 2 7
  • 1.1 Kubernetes是什么 首先唧躲,它是一個全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案造挽; 其次,Kubernet...
    c84f3109853b閱讀 80,610評論 1 117
  • ?Kubernetes介紹1.背景介紹云計算飛速發(fā)展- IaaS- PaaS- SaaSDocker技術(shù)突飛猛進-...
    Zero___閱讀 14,738評論 0 21
  • kubernetes基本框架和基本概念 Kubernetes是什么弄痹?我(們)為什么使用饭入?Kubernetes主要概...
    翼動晴空閱讀 11,396評論 0 19
  • 》》》問故人,可記當(dāng)年高歌唱采薇 12月肛真。 原來谐丢,已經(jīng)過去很久了。 我在北城凜寒的冬夜做了一場大夢蚓让,瑣屑般無法言喻...
    阿楚有溫柔閱讀 415評論 0 4