k8s Pod默認(rèn)調(diào)度策略詳解
在 Kubernetes 中,Pod 的默認(rèn)調(diào)度由 kube-scheduler 負(fù)責(zé),其核心目標(biāo)是將 Pod 公平、高效地分配到集群節(jié)點(diǎn)上,同時(shí)滿足 Pod 和節(jié)點(diǎn)的各種約束條件。
默認(rèn)調(diào)度策略是一系列內(nèi)置規(guī)則的組合,無需用戶顯式配置即可生效。
一、默認(rèn)調(diào)度流程
kube-scheduler 的調(diào)度過程分為兩個(gè)主要階段:
- 過濾(Filtering):從所有節(jié)點(diǎn)中篩選出滿足 Pod 基本要求的節(jié)點(diǎn)(稱為 “可行節(jié)點(diǎn)”)。
- 打分(Scoring):對(duì)可行節(jié)點(diǎn)進(jìn)行評(píng)分,選擇得分最高的節(jié)點(diǎn)調(diào)度 Pod。
二、核心默認(rèn)策略詳解
1. 過濾階段(必須滿足的條件)
過濾階段會(huì)排除不滿足 Pod 需求的節(jié)點(diǎn),核心規(guī)則包括:
- PodFitsResources檢查節(jié)點(diǎn)是否有足夠的 CPU、內(nèi)存等資源,滿足 Pod 的
resources.requests配置。例:若 Pod 請(qǐng)求 1 CPU 和 1Gi 內(nèi)存,節(jié)點(diǎn)剩余資源不足則被過濾。 - PodFitsHostPorts檢查 Pod 聲明的
hostPort是否在節(jié)點(diǎn)上未被占用。例:若 Pod 需要hostPort: 80,節(jié)點(diǎn) 80 端口已被占用則被過濾。 - PodFitsHost若 Pod 配置了
spec.nodeName(指定節(jié)點(diǎn)名稱),僅保留該節(jié)點(diǎn)。 - NodeSelectorMatches若 Pod 配置了
spec.nodeSelector(節(jié)點(diǎn)標(biāo)簽選擇器),僅保留匹配標(biāo)簽的節(jié)點(diǎn)。例:nodeSelector: {env: prod}僅保留有env=prod標(biāo)簽的節(jié)點(diǎn)。 - NoDiskConflict避免 Pod 掛載的本地存儲(chǔ)卷(如
hostPath)在節(jié)點(diǎn)上存在沖突。 - CheckNodeTaints檢查節(jié)點(diǎn)的污點(diǎn)(Taint)是否被 Pod 的容忍(Toleration)匹配。默認(rèn)規(guī)則:若節(jié)點(diǎn)有污點(diǎn)且 Pod 無對(duì)應(yīng)容忍,則該節(jié)點(diǎn)被過濾。
- CheckNodeAffinity若 Pod 配置了 節(jié)點(diǎn)親和性(NodeAffinity),僅保留滿足親和性規(guī)則的節(jié)點(diǎn)。
2. 打分階段(優(yōu)先選擇的條件)
在過濾后的可行節(jié)點(diǎn)中,調(diào)度器會(huì)對(duì)節(jié)點(diǎn)打分(0-10 分),得分最高的節(jié)點(diǎn)被選中。
默認(rèn)打分規(guī)則包括:
- LeastRequestedPriority(默認(rèn)權(quán)重最高)優(yōu)先選擇資源利用率最低的節(jié)點(diǎn)(CPU 和內(nèi)存剩余比例最高)。計(jì)算公式:
(1 - (節(jié)點(diǎn)已用CPU/節(jié)點(diǎn)總CPU)) * 5 + (1 - (節(jié)點(diǎn)已用內(nèi)存/節(jié)點(diǎn)總內(nèi)存)) * 5目的:平衡節(jié)點(diǎn)負(fù)載,避免資源過度集中。 - BalancedResourceAllocation優(yōu)先選擇 CPU 和內(nèi)存利用率最均衡的節(jié)點(diǎn)(避免某類資源過度使用)。例:CPU 用 30% 且內(nèi)存用 30% 的節(jié)點(diǎn),優(yōu)于 CPU 用 10% 但內(nèi)存用 50% 的節(jié)點(diǎn)。
- NodePreferAvoidPodsPriority避免將 Pod 調(diào)度到標(biāo)記了
node.kubernetes.io/prefer-avoid-pods注解的節(jié)點(diǎn)(通常用于避免干擾關(guān)鍵節(jié)點(diǎn))。 - SelectorSpreadPriority盡量將同一
Service、StatefulSet或ReplicaSet的 Pod 分散到不同節(jié)點(diǎn)(通過標(biāo)簽選擇器識(shí)別關(guān)聯(lián) Pod)。目的:提高服務(wù)可用性,避免單點(diǎn)故障。 - NodeAffinityPriority若 Pod 配置了 偏好性節(jié)點(diǎn)親和性(PreferredDuringSchedulingIgnoredDuringExecution),按規(guī)則對(duì)節(jié)點(diǎn)加分。例:偏好
zone=us-west標(biāo)簽的節(jié)點(diǎn),匹配的節(jié)點(diǎn)會(huì)獲得額外分?jǐn)?shù)。 - TaintTolerationPriority對(duì) Pod 容忍節(jié)點(diǎn)污點(diǎn)的情況進(jìn)行打分,容忍的污點(diǎn)越少,得分越高(盡量避免調(diào)度到有污點(diǎn)的節(jié)點(diǎn))。
三、默認(rèn)策略的特點(diǎn)
- 無感知調(diào)度:默認(rèn)策略不依賴用戶配置,完全基于集群資源和 Pod 基本需求調(diào)度。
- 負(fù)載均衡:通過
LeastRequestedPriority和BalancedResourceAllocation平衡節(jié)點(diǎn)資源使用。 - 高可用傾向:通過
SelectorSpreadPriority分散關(guān)聯(lián) Pod,降低單點(diǎn)風(fēng)險(xiǎn)。 - 可擴(kuò)展性:默認(rèn)策略可通過 調(diào)度配置文件(scheduler-config.yaml) 自定義(如調(diào)整權(quán)重、禁用某些規(guī)則)。
四、驗(yàn)證默認(rèn)調(diào)度行為
可以通過 kubectl describe pod <pod-name> 查看 Pod 的調(diào)度決策細(xì)節(jié):
kubectl describe pod my-pod | grep -A 10 "Events:"
輸出中會(huì)顯示調(diào)度器選擇節(jié)點(diǎn)的原因,例如:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 5s default-scheduler Successfully assigned default/my-pod to node-1
若要查看更詳細(xì)的打分過程,可開啟 kube-scheduler 的調(diào)試日志(通過 --v=4 啟動(dòng)參數(shù))。
總結(jié)
Kubernetes 的默認(rèn)調(diào)度策略是一套兼顧資源效率、負(fù)載均衡和高可用性的規(guī)則集合,核心邏輯是:
- 先過濾:排除不滿足 Pod 基本需求(資源、標(biāo)簽、污點(diǎn)等)的節(jié)點(diǎn)。
- 再打分:優(yōu)先選擇資源充足、負(fù)載均衡且符合偏好的節(jié)點(diǎn)。
如果默認(rèn)策略無法滿足需求(如特定業(yè)務(wù)需要調(diào)度到 GPU 節(jié)點(diǎn)),可通過 親和性規(guī)則、調(diào)度器擴(kuò)展 或 自定義調(diào)度器 調(diào)整。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Kubernetes控制器中DaemonSet與Job的使用教程
這篇文章主要介紹了Kubernetes控制器中DaemonSet與Job的使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
通過kubernetes部署nginx+php網(wǎng)站環(huán)境過程
本文詳細(xì)介紹了如何在Kubernetes中部署Nginx+PHP網(wǎng)站環(huán)境,包括環(huán)境準(zhǔn)備、部署步驟、Service、ConfigMap、Ingress等配置,并提供了具體的YAML文件示例和命令,通過這些步驟,可以實(shí)現(xiàn)高可用、可擴(kuò)展的Web服務(wù)2026-01-01
k8s安裝calico時(shí)如何選擇網(wǎng)卡問題
這篇文章主要介紹了k8s安裝calico時(shí)如何選擇網(wǎng)卡問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Kubekey安裝Kubernetes-1.24.8的詳細(xì)過程
這篇文章主要介紹了Kubekey安裝Kubernetes-1.24.8的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05

