k8s Pod默認調(diào)度策略詳解
在 Kubernetes 中,Pod 的默認調(diào)度由 kube-scheduler 負責,其核心目標是將 Pod 公平、高效地分配到集群節(jié)點上,同時滿足 Pod 和節(jié)點的各種約束條件。
默認調(diào)度策略是一系列內(nèi)置規(guī)則的組合,無需用戶顯式配置即可生效。
一、默認調(diào)度流程
kube-scheduler 的調(diào)度過程分為兩個主要階段:
- 過濾(Filtering):從所有節(jié)點中篩選出滿足 Pod 基本要求的節(jié)點(稱為 “可行節(jié)點”)。
- 打分(Scoring):對可行節(jié)點進行評分,選擇得分最高的節(jié)點調(diào)度 Pod。
二、核心默認策略詳解
1. 過濾階段(必須滿足的條件)
過濾階段會排除不滿足 Pod 需求的節(jié)點,核心規(guī)則包括:
- PodFitsResources檢查節(jié)點是否有足夠的 CPU、內(nèi)存等資源,滿足 Pod 的
resources.requests配置。例:若 Pod 請求 1 CPU 和 1Gi 內(nèi)存,節(jié)點剩余資源不足則被過濾。 - PodFitsHostPorts檢查 Pod 聲明的
hostPort是否在節(jié)點上未被占用。例:若 Pod 需要hostPort: 80,節(jié)點 80 端口已被占用則被過濾。 - PodFitsHost若 Pod 配置了
spec.nodeName(指定節(jié)點名稱),僅保留該節(jié)點。 - NodeSelectorMatches若 Pod 配置了
spec.nodeSelector(節(jié)點標簽選擇器),僅保留匹配標簽的節(jié)點。例:nodeSelector: {env: prod}僅保留有env=prod標簽的節(jié)點。 - NoDiskConflict避免 Pod 掛載的本地存儲卷(如
hostPath)在節(jié)點上存在沖突。 - CheckNodeTaints檢查節(jié)點的污點(Taint)是否被 Pod 的容忍(Toleration)匹配。默認規(guī)則:若節(jié)點有污點且 Pod 無對應(yīng)容忍,則該節(jié)點被過濾。
- CheckNodeAffinity若 Pod 配置了 節(jié)點親和性(NodeAffinity),僅保留滿足親和性規(guī)則的節(jié)點。
2. 打分階段(優(yōu)先選擇的條件)
在過濾后的可行節(jié)點中,調(diào)度器會對節(jié)點打分(0-10 分),得分最高的節(jié)點被選中。
默認打分規(guī)則包括:
- LeastRequestedPriority(默認權(quán)重最高)優(yōu)先選擇資源利用率最低的節(jié)點(CPU 和內(nèi)存剩余比例最高)。計算公式:
(1 - (節(jié)點已用CPU/節(jié)點總CPU)) * 5 + (1 - (節(jié)點已用內(nèi)存/節(jié)點總內(nèi)存)) * 5目的:平衡節(jié)點負載,避免資源過度集中。 - BalancedResourceAllocation優(yōu)先選擇 CPU 和內(nèi)存利用率最均衡的節(jié)點(避免某類資源過度使用)。例:CPU 用 30% 且內(nèi)存用 30% 的節(jié)點,優(yōu)于 CPU 用 10% 但內(nèi)存用 50% 的節(jié)點。
- NodePreferAvoidPodsPriority避免將 Pod 調(diào)度到標記了
node.kubernetes.io/prefer-avoid-pods注解的節(jié)點(通常用于避免干擾關(guān)鍵節(jié)點)。 - SelectorSpreadPriority盡量將同一
Service、StatefulSet或ReplicaSet的 Pod 分散到不同節(jié)點(通過標簽選擇器識別關(guān)聯(lián) Pod)。目的:提高服務(wù)可用性,避免單點故障。 - NodeAffinityPriority若 Pod 配置了 偏好性節(jié)點親和性(PreferredDuringSchedulingIgnoredDuringExecution),按規(guī)則對節(jié)點加分。例:偏好
zone=us-west標簽的節(jié)點,匹配的節(jié)點會獲得額外分數(shù)。 - TaintTolerationPriority對 Pod 容忍節(jié)點污點的情況進行打分,容忍的污點越少,得分越高(盡量避免調(diào)度到有污點的節(jié)點)。
三、默認策略的特點
- 無感知調(diào)度:默認策略不依賴用戶配置,完全基于集群資源和 Pod 基本需求調(diào)度。
- 負載均衡:通過
LeastRequestedPriority和BalancedResourceAllocation平衡節(jié)點資源使用。 - 高可用傾向:通過
SelectorSpreadPriority分散關(guān)聯(lián) Pod,降低單點風險。 - 可擴展性:默認策略可通過 調(diào)度配置文件(scheduler-config.yaml) 自定義(如調(diào)整權(quán)重、禁用某些規(guī)則)。
四、驗證默認調(diào)度行為
可以通過 kubectl describe pod <pod-name> 查看 Pod 的調(diào)度決策細節(jié):
kubectl describe pod my-pod | grep -A 10 "Events:"
輸出中會顯示調(diào)度器選擇節(jié)點的原因,例如:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 5s default-scheduler Successfully assigned default/my-pod to node-1
若要查看更詳細的打分過程,可開啟 kube-scheduler 的調(diào)試日志(通過 --v=4 啟動參數(shù))。
總結(jié)
Kubernetes 的默認調(diào)度策略是一套兼顧資源效率、負載均衡和高可用性的規(guī)則集合,核心邏輯是:
- 先過濾:排除不滿足 Pod 基本需求(資源、標簽、污點等)的節(jié)點。
- 再打分:優(yōu)先選擇資源充足、負載均衡且符合偏好的節(jié)點。
如果默認策略無法滿足需求(如特定業(yè)務(wù)需要調(diào)度到 GPU 節(jié)點),可通過 親和性規(guī)則、調(diào)度器擴展 或 自定義調(diào)度器 調(diào)整。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解k8s?NetworkPolicy?網(wǎng)絡(luò)策略是怎么樣的
這篇文章主要為大家介紹了k8s?NetworkPolicy?網(wǎng)絡(luò)策略是怎么樣的深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
k8s 中的 service 如何找到綁定的 Pod 及實現(xiàn) 
service 是一組具有相同 label pod 集合的抽象,集群內(nèi)外的各個服務(wù)可以通過 service 進行互相通信,這篇文章主要介紹了k8s 中的 service 如何找到綁定的 Pod 以及如何實現(xiàn) Pod 負載均衡,需要的朋友可以參考下2022-10-10
StatefulSet的每個Pod單獨創(chuàng)建Service實踐
本文介紹了如何為StatefulSet的每個Pod創(chuàng)建獨立的Service,并提供了一個示例腳本,以批量生成Service定義,通過這種方式,可以實現(xiàn)從集群外部訪問每個Pod的功能,并且可以根據(jù)需要配置不同的Service類型(如NodePort、LoadBalancer、ClusterIP+Ingress等)2026-01-01
一文詳解基于Kubescape進行Kubernetes安全加固
這篇文章主要為大家介紹了基于Kubescape進行Kubernetes安全加固詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02

