摘要:與已運(yùn)行相關(guān)的過(guò)濾規(guī)則負(fù)責(zé)檢查待調(diào)度與上已有之間的親和性關(guān)系。并且每個(gè)打分函數(shù)都可以配置對(duì)應(yīng)的權(quán)重值,下面介紹調(diào)度器策略配置時(shí),也會(huì)涉及權(quán)重值的配置。默認(rèn)權(quán)重值是,如果覺得某個(gè)打分函數(shù)特別重要,便可以加大該權(quán)重值。
一、概述
Kubernetes 是 Google 開源的容器集群管理系統(tǒng)(谷歌內(nèi)部:Borg),而今天要介紹的 kube-scheduler 是 k8s 系統(tǒng)的核心組件之一,其主要職責(zé)就是通過(guò)自身的調(diào)度算法,為新創(chuàng)建的 Pod 尋找一個(gè)最合適的 Node。
主要包含如下幾個(gè)步驟:
通過(guò)一組叫做謂詞 predicates 的過(guò)濾算法,先挑出滿足條件的 Node;
通過(guò)一組叫做優(yōu)先級(jí) priorities 的打分算法,來(lái)給上一步符合條件的每個(gè) Node 進(jìn)行打分排名;
最終選擇得分最高的節(jié)點(diǎn),當(dāng)然如果得分一樣就隨機(jī)一個(gè)節(jié)點(diǎn),填回 Pod 的 spec.nodeName 字段。
官方流程圖如下:
For given pod: +---------------------------------------------+ | Schedulable nodes: | | | | +--------+ +--------+ +--------+ | | | node 1 | | node 2 | | node 3 | | | +--------+ +--------+ +--------+ | | | +-------------------+-------------------------+ | | v +-------------------+-------------------------+ Pred. filters: node 3 doesn"t have enough resource +-------------------+-------------------------+ | | v +-------------------+-------------------------+ | remaining nodes: | | +--------+ +--------+ | | | node 1 | | node 2 | | | +--------+ +--------+ | | | +-------------------+-------------------------+ | | v +-------------------+-------------------------+ Priority function: node 1: p=2 node 2: p=5 +-------------------+-------------------------+ | | v select max{node priority} = node 2
scheduler 的工作看似很簡(jiǎn)單,但其實(shí)不然。考慮的問(wèn)題非常多,比如要保證每個(gè)節(jié)點(diǎn)被公平調(diào)度,提高資源利用率,提高 pod 調(diào)度效率,提升調(diào)度器擴(kuò)展能力等等。
可涉及的內(nèi)容非常多,接下來(lái)會(huì)圍繞兩個(gè)核心步驟對(duì) k8s 的 默認(rèn)調(diào)度策略 深入了解。
參考 Kubernetes 版本: v1.12二、Predicates
Predicates 在調(diào)度過(guò)程中的作用就是先進(jìn)行過(guò)濾,過(guò)濾掉所有不符合條件的節(jié)點(diǎn)后,剩下的所有節(jié)點(diǎn)就都是可以運(yùn)行帶調(diào)度 Pod。
Predicates 的可以分為如下四類:
GeneralPredicates:負(fù)責(zé)最基礎(chǔ)的調(diào)度策略,比如 PodFitsResources 計(jì)算宿主機(jī)資源是否夠用。
與 Volume 相關(guān)的過(guò)濾規(guī)則:負(fù)責(zé)與容器持久化 Volume 相關(guān)的調(diào)度策略。
與宿主機(jī)相關(guān)的過(guò)濾規(guī)則:負(fù)責(zé)考察待調(diào)度 Pod 是否滿足 Node 本身的一些條件。
與已運(yùn)行 Pod 相關(guān)的過(guò)濾規(guī)則:負(fù)責(zé)檢查待調(diào)度 Pod 與 Node 上已有 Pod 之間的親和性關(guān)系。
具體的 Predicates 默認(rèn)策略,可以參考: 默認(rèn)調(diào)度策略
當(dāng)開始調(diào)度一個(gè) Pod 的時(shí)候,調(diào)度器會(huì)同時(shí)開啟多個(gè)協(xié)程并發(fā)的進(jìn)行 Node Predicates 過(guò)濾,最后返回一個(gè)可以運(yùn)行 Pod 的節(jié)點(diǎn)列表。每個(gè)協(xié)程都是按照固定的順序進(jìn)行計(jì)算過(guò)濾的。
接下來(lái),我們看下四大類具體運(yùn)行的調(diào)度策略內(nèi)容。
1. GeneralPredicates看字面意思就知道 GeneralPredicates 負(fù)責(zé)的是最基礎(chǔ)的調(diào)度策略,其包含的具體策略如下:
PodFitsResources: 計(jì)算宿主機(jī)的 CPU、內(nèi)存、擴(kuò)展資源(如 GPU)等是否夠用。
PodFitsHost: 檢查宿主機(jī)的名字是否跟 Pod 的 spec.nodeName 匹配。
PodFitsHostPorts: 檢查 Pod 申請(qǐng)的宿主機(jī)端口有沒(méi)有沖突。
PodMatchNodeSelector: 檢查節(jié)點(diǎn)是否能匹配 Pod 的 nodeSelector 和 nodeAffinity。
因?yàn)?GeneralPredicates 是最基礎(chǔ)的調(diào)度策略,所以該接口也會(huì)被別的組件直接調(diào)用,比如 kubelet、daemonSet controller。kubelet 在啟動(dòng) pod 之前,還會(huì)再執(zhí)行一遍 GeneralPredicates,用于二次確認(rèn)。
2. 與 Volume 相關(guān)的過(guò)濾規(guī)則不廢話就直接列舉具體的策略了:
NoDiskConflict:檢查該節(jié)點(diǎn)上所有的 Pods 是否與待調(diào)度的 Pod 的 Volume 有沖突,比如 AWS、GCE 的 Volume 是不允許被兩個(gè) Pod 同時(shí)使用的。
VolumeZonePredicate:檢查 Pod Volume 的 zone 標(biāo)簽是否與節(jié)點(diǎn)的 zone 標(biāo)簽匹配。如果 Node 沒(méi)有 zone 標(biāo)簽則認(rèn)定為匹配。
MaxPDVolumeCountPredicate:檢查節(jié)點(diǎn)上某種類型的 Volume 是否已經(jīng)超過(guò)指定數(shù)目。
CSIMaxVolumeLimitPredicate:檢查 csi volume 相關(guān)的限制
VolumeBindingPredicate:檢查 Pod 對(duì)應(yīng)的 Local PV 的 nodeAffinity 字段,是否跟某個(gè)節(jié)點(diǎn)的標(biāo)簽相匹配。如果該 Pod PVC 還沒(méi)有綁定 PV 的話,則調(diào)度器還要負(fù)責(zé)檢查所有待綁定的 PV,且該 PV 的 nodeAffinity 是否與節(jié)點(diǎn)標(biāo)簽匹配。
3. 與宿主機(jī)相關(guān)的過(guò)濾規(guī)則這些規(guī)則主要考察待調(diào)度的 Pod 是否滿足 Node 本身的一些條件。
具體的策略如下:
NodeConditionPredicate:檢查 Node 是否還未準(zhǔn)備好或者處于NodeOutOfDisk、NodeNetworkUnavailable 狀態(tài),又或者 Node spec.Unschedulable 設(shè)置為 true,那該節(jié)點(diǎn)都將無(wú)法被調(diào)度。
PodToleratesNodeTaints:檢查 Node 的 taint(污點(diǎn))機(jī)制。只有當(dāng) Pod 的 Toleration 與 Node 的 Taint 匹配時(shí),Pod 才能調(diào)度到該節(jié)點(diǎn)上。
NodeMemoryPressurePredicate:檢查當(dāng)前節(jié)點(diǎn)的內(nèi)存是否已經(jīng)不夠使用。
NodeDiskPressurePredicate:檢查當(dāng)前節(jié)點(diǎn)的磁盤是否已經(jīng)不夠使用。
NodePIDPressurePredicate:檢查當(dāng)前節(jié)點(diǎn)的 PID 是否已經(jīng)不夠使用。
4. 與已運(yùn)行 Pod 相關(guān)的過(guò)濾規(guī)則該規(guī)則主要就是 PodAffinityPredicate,用于檢查待調(diào)度 Pod 與 Node 上已有的 Pod 之間的親和性和反親和性關(guān)系。
具體的親和性相關(guān)的調(diào)度,后面會(huì)多帶帶拿一篇文章進(jìn)行介紹。
完成了前一個(gè)階段的節(jié)點(diǎn) “過(guò)濾” 之后,便需要通過(guò) Priorities 為這些節(jié)點(diǎn)打分,選擇得分最高的節(jié)點(diǎn),作為調(diào)度對(duì)象。
打分函數(shù)很多,總得分可以參考:
總分 = (權(quán)重1 * 打分函數(shù)1) + (權(quán)重2 * 打分函數(shù)2) + … + (權(quán)重n * 打分函數(shù)n)。
每一次打分的范圍是 0 — 10 分。10 表示非常合適,0 表示非常不合適。
并且每個(gè)打分函數(shù)都可以配置對(duì)應(yīng)的權(quán)重值,下面介紹 調(diào)度器策略配置 時(shí),也會(huì)涉及權(quán)重值的配置。默認(rèn)權(quán)重值是 1,如果覺得某個(gè)打分函數(shù)特別重要,便可以加大該權(quán)重值。
具體的 Priorities 默認(rèn)策略可以參考: defaultPriorities 。
Priorities 最常用到的一個(gè)打分規(guī)則是 LeastRequestedPriority, 該算法用于選出空閑資源(cpu & memory)最多的宿主機(jī)。
還有一個(gè)常見的是 BalancedResourceAllocation,該規(guī)則主要目的是資源平衡。在所有節(jié)點(diǎn)里選擇各種資源分配最均衡的節(jié)點(diǎn),避免出現(xiàn)某些節(jié)點(diǎn) CPU 被大量分配,但是 Memory 大量剩余的情況。
此外,還有 InterPodAffinityPriority、NodeAffinityPriority、TaintTolerationPriority,與親和性與污點(diǎn)調(diào)度有關(guān),后面會(huì)有多帶帶的文章進(jìn)行介紹。這里表示節(jié)點(diǎn)滿足的規(guī)則越多,那得分就越高。
在 K8S v1.12 版本還引入了一個(gè)調(diào)度策略,即 ImageLocalityPriority。該策略主要目的是優(yōu)先選擇那些已經(jīng)存有 Pod 所需 image 的節(jié)點(diǎn),可以避免實(shí)際運(yùn)行 Pod 時(shí),再去下載 image。
注意: pod 運(yùn)行時(shí)是否會(huì)下載 image,還跟 Pod ImagePullPolicy 配置有關(guān)。
可以看到 k8s scheduler 完成一次調(diào)度所需的信息非常之多。所以在實(shí)際的調(diào)度過(guò)程中,大量的信息都事先已經(jīng)緩存,提高了 Pod 的調(diào)度效率。
四、調(diào)度策略配置Kubernetes 調(diào)度器有默認(rèn)的調(diào)度策略,具體可以參考 default 。當(dāng)然用戶也可以修改調(diào)度策略,可以通過(guò)命令行參數(shù) policy-config-file 指定一個(gè) JSON 文件來(lái)描述哪些 predicates 和 priorities 在啟動(dòng) k8s 時(shí)被使用, 通過(guò)這個(gè)參數(shù)調(diào)度就能使用管理者定義的策略了。
示例如下:
{ "kind" : "Policy", "apiVersion" : "v1", "predicates" : [ {"name" : "PodFitsHostPorts"}, {"name" : "PodFitsResources"}, {"name" : "NoDiskConflict"}, {"name" : "NoVolumeZoneConflict"}, {"name" : "MatchNodeSelector"}, {"name" : "HostName"} ], "priorities" : [ {"name" : "LeastRequestedPriority", "weight" : 1}, {"name" : "BalancedResourceAllocation", "weight" : 1}, {"name" : "ServiceSpreadingPriority", "weight" : 1}, {"name" : "EqualPriority", "weight" : 1} ], "hardPodAffinitySymmetricWeight" : 10, "alwaysCheckAllPredicates" : false }五、自定義調(diào)度器
前面提到了調(diào)度器的擴(kuò)展能力,除了使用 k8s 自帶的調(diào)度器,你也可以編寫自己的調(diào)度器。通過(guò)修改 Pod 的 spec.schedulername 參數(shù)來(lái)指定調(diào)度器的名字。
參考資料The Kubernetes Scheduler
Scheduler Algorithm in Kubernetes
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/32908.html
摘要:換句話說(shuō),親和性選擇節(jié)點(diǎn)僅在調(diào)度時(shí)起作用。先創(chuàng)建集群反親和性打散各個(gè)副本再部署服務(wù),需要打散并且與服務(wù)共存,配置如下注意需要進(jìn)行大量處理,所以會(huì)明顯減慢大型集群的調(diào)度時(shí)間,不建議在大于幾百個(gè)節(jié)點(diǎn)的集群中使用該功能。 一、概述 前一篇文章 Kubernetes 調(diào)度器淺析,大致講述了調(diào)度器的工作原理及相關(guān)調(diào)度策略。這一章會(huì)繼續(xù)深入調(diào)度器,介紹下親和性調(diào)度。 Kubernetes 支持限制...
摘要:本文將主要分析原生的網(wǎng)絡(luò)策略。筆者認(rèn)為這個(gè)問(wèn)題主要是因?yàn)槭褂谜卟涣私饩W(wǎng)絡(luò)策略的省缺行為。可選字段,字符串,策略規(guī)則類型,表示該網(wǎng)絡(luò)策略中包含哪些類型的策略,可選為或。互相間為或的關(guān)系,滿足其中一條則放行。標(biāo)準(zhǔn),除了指定的放行外其他都禁止。 k8s中的網(wǎng)絡(luò)策略主要分為原生 NetworkPolicy 和第三方網(wǎng)絡(luò)插件提供的網(wǎng)絡(luò)策略。本文將主要分析原生Networkpolicy的網(wǎng)絡(luò)策略。...
摘要:在這種情況下,以防干擾其他集群租戶,調(diào)度器可能會(huì)考慮將作為驅(qū)逐的候選對(duì)象。其結(jié)果是負(fù)載均衡和調(diào)度之間交互作用。 每當(dāng)談及Kubernetes,我們經(jīng)常聽到諸如資源管理、調(diào)度和負(fù)載均衡等術(shù)語(yǔ)。雖然Kubernetes提供了許多功能,但更關(guān)鍵的還是要了解這些概念,只有這樣才能更好地理解如何放置、管理并恢復(fù)工作負(fù)載。在這篇文章中,我提供了每個(gè)功能的概述,并解釋了它們是如何在Kubernete...
閱讀 3175·2021-09-10 10:51
閱讀 3359·2021-08-31 09:38
閱讀 1652·2019-08-30 15:54
閱讀 3138·2019-08-29 17:22
閱讀 3219·2019-08-26 13:53
閱讀 1969·2019-08-26 11:59
閱讀 3290·2019-08-26 11:37
閱讀 3317·2019-08-26 10:47