Kubernetes 調度器 詳解

1. 調度器在 K8s 中的位置與核心流程

API Server ←→ etcd ←→ kube-scheduler ←→ kubelet

  1. 創建:用戶提交 Pod 描述(YAML/Helm/Operator)。

  2. 監聽:調度器通過 Watch 機制捕獲到 spec.nodeName="" 的 Pod。

  3. 過濾:根據資源、污點、親和性等“硬性條件”過濾出可行節點(Feasible Nodes)。

  4. 打分:對可行節點按策略打分,最高分勝出。

  5. 綁定:將 spec.nodeName 寫入 Pod 對象,目標節點的 kubelet 開始真正啟動容器。

  6. 重調度:節點故障或資源不足 → 刪除原 Pod → 回到步驟 2。

調度器是控制面唯一的“決策大腦”,但它不做網絡/存儲分配;它只是給 Pod 選“座位”。


2. 調度方式全景圖

級別方法典型場景備注
強制nodeName排障、DaemonSet優先級最高,繞過調度器
標簽nodeSelector指定 gpu=true、ssd=true簡單,功能有限
親和nodeAffinity軟/硬親和支持 In/NotIn/Gt/Lt/Exists
Pod 間podAffinity / podAntiAffinity同域部署、打散需大量計算,大集群慎用
污點taint + toleration隔離生產/測試、驅逐NoSchedule / PreferNoSchedule / NoExecute
高級多調度器、擴展器、Score 插件自定義算法自 1.19 支持 Scheduling Framework

3. 手把手實戰:從簡單到高階

3.1 nodeName —— 一把梭,但風險高

apiVersion: v1
kind: Pod
metadata:name: one-shot-tool
spec:nodeName: k8s-node2      # 直接綁定,不經過調度器containers:- name: debugimage: alpine:latestcommand: ["sleep", "3600"]

缺點:節點不存在或資源不足時直接 Pending,調度器不會幫你重試。


3.2 nodeSelector —— 80% 場景已夠用

# 給節點打標簽
kubectl label node k8s-node1 disktype=ssd zone=beijing
spec:nodeSelector:disktype: ssdzone: beijing

小技巧:對同一類節點批量打標簽 kubectl label node -l node-role.kubernetes.io/worker= tier=frontend


3.3 nodeAffinity —— 軟/硬策略組

  • nodeaffinity支持多種規則匹配條件的配置如

匹配規則功能
lnlabel 的值在列表內
Notlnlabel 的值不在列表內
Gtlabel 的值大于設置的值,不支持Pod親和性
Ltlabel 的值小于設置的值,不支持pod親和性
Exists設置的label 存在
DoesNotExist設置的 label 不存在
affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:   # 必須滿足nodeSelectorTerms:- matchExpressions:- {key: disktype, operator: In/NotIn(#在節點中或不在), values: ["ssd"]}preferredDuringSchedulingIgnoredDuringExecution:  # 盡量滿足- weight: 50preference:matchExpressions:- {key: zone, operator: In, values: ["beijing"]}
  • IgnoreDuringExecution:節點標簽變更后,已運行 Pod 不動。

  • 支持 Gt/Lt 做資源范圍篩選,如 cpu 核數大于 32。


3.4 Pod 間親和與反親和

  • 那個節點有符合條件的POD就在那個節點運行

  • podAffinity 主要解決POD可以和哪些POD部署在同一個節點中的問題

  • podAntiAffinity主要解決POD不能和哪些POD部署在同一個節點中的問題。它們處理的是Kubernetes集群內部POD和POD之間的關系。

  • Pod 間親和與反親和在與更高級別的集合(例如 ReplicaSets,StatefulSets,Deployments 等)一起使用時,

  • Pod 間親和與反親和需要大量的處理,這可能會顯著減慢大規模集群中的調度。

3.4.1 親和:主要解決POD可以和哪些POD部署在同一個節點中的問題

3.4.2 反親和:主要解決POD不能和哪些POD部署在同一個節點中的問題

經驗值:大規模集群開啟 topologyKey: topology.kubernetes.io/zone 可實現跨可用區打散。


3.5 Taint & Toleration —— 隔離與驅逐雙殺

3.5.1 概念
  • Taints(污點)是Node的一個屬性,設置了Taints后,默認Kubernetes是不會將Pod調度到這個Node上

  • Kubernetes如果為Pod設置Tolerations(容忍),只要Pod能夠容忍Node上的污點,那么Kubernetes就會忽略Node上的污點,就能夠(不是必須)把Pod調度過去

  • 可以使用命令 kubectl taint 給節點增加一個 taint:

$ kubectl taint nodes <nodename> key=string:effect ? #命令執行方法
$ kubectl taint nodes node1 key=value:NoSchedule ?  #創建
$ kubectl describe nodes server1 | grep Taints ? ? ?  #查詢
$ kubectl taint nodes node1 key- ? ? ? ? ? ? ? ?  #刪除

其中[effect] 可取值:

effect作用常用場景
NoSchedule新 Pod 不來GPU 節點僅跑 AI 任務
PreferNoSchedule盡量不調度線上節點留有余量
NoExecute已運行 Pod 驅逐節點維護、內核升級
3.5.2 實戰:

測試污點容忍,node1,node2都設置為NoSchedule

未設置容忍的則顯示為pending


4. 調度器擴展:自定義策略與性能

4.1 多調度器

當默認調度器無法滿足業務場景(如 GPU Binpack、Spark 動態資源)時,可部署自定義調度器并指定:

spec:schedulerName: volcano

4.2 Scheduling Framework(1.19+)

通過插件鏈在 PreFilter / Filter / Score / Reserve / Permit / Bind 階段插入自定義邏輯,無需重編 kube-scheduler。
示例:NodeResourcesFit、PodTopologySpread、Coscheduling(gang scheduling)。

4.3 性能調優

  • 大規模集群建議開啟 percentageOfNodesToScore(默認 50%),減少打分節點數量。

  • 監控指標:scheduler_binding_duration_secondsscheduler_scheduling_attempt_duration_seconds


5. 排查 Pod 無法調度的一頁速查

現象可能原因排查命令
Pending資源不足kubectl describe pod?→ Events
Pending節點污點kubectl get node -o json | jq '.items[].spec.taints'
Pending親和沖突kubectl get pod -o wide?查標簽
PendingPVC 未綁定kubectl get pvc
Node Lost節點 NotReadykubectl get node, 查 kubelet / 網絡 / 磁盤

6. 總結與最佳實踐

  1. 90% 場景
    nodeSelector + nodeAffinity + podAntiAffinity 即可滿足。

  2. 污點策略
    ? 生產節點:dedicated=production:NoSchedule
    ? 測試節點:env=test:PreferNoSchedule

  3. 大規模集群
    ? 避免 topologyKey 過細,減少計算量。
    ? 使用 namespace + 污點做物理隔離,而非反親和暴力打散。

  4. 持續治理
    ? 每個季度 review 節點標簽、污點、調度策略。
    ? 用 Gatekeeper / Kyverno 做策略即代碼(Policy as Code)。


附錄:一鍵清理實驗資源
kubectl delete pod,deploy --all --grace-period=0 --force

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93988.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

51.Seata-TCC模式

前面兩種XA模式和TA模式,都是用了加鎖。 TCC模式則不會加鎖,性能更好。 TCC模式跟AT模式非常相似, 1.AT模式下,第一階段直接提交事務。 2.TCC模式下,第一階段不是提交事務,而是資源的預留凍結。 不同的是二階段TCC通過人工編碼來實現數據恢復。 需要實現三個方法 …

什么是數據分類分級?數據分類分級技術實現路徑及產品推薦

什么是數據分類分級&#xff1f; 數據分類分級是指按照一定的原則、方法和標準&#xff0c;對數據進行系統化的類別劃分和級別確定。具體而言&#xff0c;數據分類是依據數據的屬性、特征、來源、用途等維度&#xff0c;將數據劃分為不同的類別&#xff0c;如按照業務領域可分為…

深度學習——神經網絡

在當今人工智能蓬勃發展的時代&#xff0c;深度學習和神經網絡已經成為最受關注的技術領域之一。從智能手機的人臉識別到自動駕駛汽車的環境感知&#xff0c;從醫療影像分析到金融風險預測&#xff0c;這些技術正在深刻改變我們的生活和工作方式。本文將帶您了解深度學習和神經…

uniapp image標簽展示視頻第一幀

?vframe/jpg/offset/1/ 加到視頻后面獲取第一幀圖片 ?vframe/jpg/offset/1/w/400/h/300 設置寬高 ?imageView2/0/w/2000/interlace/1 設置圖片分辨率 2000 // 后面的 /1/ 是第幾幀 <image class"thumb" :src"videoUrl?vframe/jpg/offset/1/" mode…

前端本地模糊搜索1.0 按照匹配位置加權

需求背景 公司項目為Saas ERP系統&#xff0c;客戶需要快速開單需要避免接口帶來的延遲問題。所以需要將商品數據保存在本地。所以本地搜索 權重 這一套組合拳需要前端自己實現。 搜索示例 示例1&#xff1a;輸入&#xff1a;"男士真皮錢包"進行模糊匹配優先匹配完全…

Linux學習-網絡編程2

1.tcp可能出現粘包解決&#xff1a;要讓消息之間有邊界1.結束標志 \r\n2.固定長度3.協議結構體2.recv和sendrecv原型&#xff1a;ssize_t recv(int sockfd, void *buf, size_t len, int flags); 功能&#xff1a;從sockfd接收信息 參數&#xff1a;sockfd&#xff1a;要…

【普通地質學】構造運動與地質構造

名詞解釋走向&#xff1a;傾斜的層面與水平面的交線走向線&#xff0c;走向線兩端延伸的方向即為走向&#xff1b;構造運動&#xff1a;由于地球內部動力引起的組成巖石圈物質的機械運動&#xff0c;也可稱地殼運動或巖石圈運動&#xff1b;按方向分為垂直運動和水平運動&#…

基于Python的旅游推薦系統 Python+Django+Vue.js

本文項目編號 25009 &#xff0c;文末自助獲取源碼 \color{red}{25009&#xff0c;文末自助獲取源碼} 25009&#xff0c;文末自助獲取源碼 目錄 一、系統介紹1.1 用戶功能描述1.2 管理員功能描述 二、系統錄屏三、啟動教程四、功能截圖五、文案資料5.1 選題背景5.2 國內外研究…

基于51單片機的智能加濕器設計 溫濕度水位防干燒手動自動聲光報警

1 系統功能介紹 本設計實現了一種 基于 51 單片機的智能加濕器控制系統。隨著現代生活水平的提高&#xff0c;人們對居住和辦公環境的舒適度要求越來越高&#xff0c;空氣濕度和溫度的調節逐漸成為家庭和辦公自動化的重要組成部分。傳統加濕器僅能實現簡單的加濕功能&#xff0…

開發避坑指南(31):Oracle 11g LISTAGG函數使用陷阱,缺失WITHIN子句解決方案

錯誤信息 Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-02000: 缺失 WITHIN 關鍵字查詢語句 使用LISTAGG函數將多行數據合并為單行字符串&#xff0c;如下&#xff1a; selectt.order_no as orderNo,t.account_no,(select listagg(a.bank_name,,) …

【虛擬化】磁盤置備方式的性能損耗對比

【虛擬化】磁盤置備方式的性能損耗對比摘要1、定義1.1厚置備&#xff08;Thick Provisioning&#xff09;1.2厚置備延遲置零&#xff08;Thick Provisioned Lazy Zeroed&#xff09;1.3厚置備置零&#xff08;Thick Provisioned Eager Zeroed&#xff09;2、對比摘要 探索三種…

計算機網絡:TCP、UDP

一、TCP粘包問題&#xff08;一&#xff09;什么是粘包&#xff1f;TCP粘包是指發送方發送的多個數據包在接收方接收時被合并成一個大的數據包的現象。這種現象是由于TCP協議本身的特性導致的&#xff0c;TCP是面向流的協議&#xff0c;數據在傳輸過程中沒有明確的邊界。&#…

使用 Google 開源 AI 工具 LangExtract 進行結構化信息抽取

導讀&#xff1a;本文介紹科技大廠 Google 2025年 7 月最新開源的 Python 庫&#xff1a;LangExtract&#xff0c;用于從非結構文本提取結構化數據&#xff0c;以及非官方的 Javascript、Rust 語言實現版本。 文章目錄一、關于 LangExtract1.1 需求痛點1.2 LangExtract1.3 參考…

把 AI 變成「會說話的盲道」——基于骨傳導的地磚級語音導盲磚

標簽&#xff1a;城市無障礙、骨傳導、TinyML、語音導航、太陽能、離線推理、ESP32-C3、邊緣 AI ---- 1. 背景&#xff1a;為什么盲道要開口說話&#xff1f; 全國 1700 萬視障者&#xff0c;城市道路卻常出現&#xff1a; ? 盲道被違停車、廣告牌截斷&#xff1b; ? 傳統導…

解析三品汽車零部件PLM系統解決方案:如何助力行業解決研發管理難題

2024年&#xff0c;全球汽車零部件市場規模超1.5萬億美元&#xff0c;中國市場規模達4.6萬億元人民幣。產業繁榮高度依賴汽車產業的發展&#xff0c;2024年中國汽車產銷量均突破3100萬輛&#xff0c;新能源汽車銷量約1286萬輛&#xff0c;2019-2024年復合增長率達76.59%。當前行…

【RA-Eco-RA4E2-64PIN-V1.0 開發板】步進電機驅動

【RA-Eco-RA4E2-64PIN-V1.0 開發板】步進電機驅動 本文介紹了 RA-Eco-RA4E2-64PIN-V1.0 開發板驅動 28BYJ-48 步進電機的設計。 項目介紹 硬件連接&#xff1a;28BYJ-48 步進電機、ULN2003 驅動板、Jlink 調試器等&#xff1b;工程創建&#xff1a;GPIO 和 UART 的配置&#xf…

機器人爆發、汽車換代,速騰聚創開始講新故事

文&#xff5c;劉俊宏編&#xff5c;王一粟2025年智能汽車出貨量激增&#xff0c;堪稱“智駕安全帶”的激光雷達&#xff0c;迎來了自己的iPhone時刻。8月21日&#xff0c;速騰聚創發布了2025年第二季度及中期業績報告&#xff0c;激光雷達的中場戰事得以一并揭開。速騰聚創二季…

在Excel和WPS表格中如何隱藏單元格的公式

Excel和WPS表格中有數據、公式、圖表等以后&#xff0c;要發給他人查閱&#xff0c;如果不希望表格中的公式被查閱和修改&#xff0c;我們可以通過兩個步驟把公式隱藏起來。先設置有公式的單元格格式為隱藏&#xff0c;然后保護工作表即可。第一步&#xff1a;設置單元格格式為…

Eino 開源框架全景解析 - 以“大模型應用的搭積木指南”方式理解(一)

Eino 開源框架全景解析 - 大模型應用的搭積木指南 &#x1f3af; 什么是 Eino&#xff1f;一句話概括 Eino 是字節跳動開源的大語言模型應用開發框架&#xff0c;就像是一個專門為 AI 應用設計的"搭積木工具箱"&#xff0c;讓開發者能夠像搭樂高一樣輕松構建復雜的 A…

大語言模型原理(Transformer架構)

一、概覽1.1 定義大語言模型&#xff08;LLM&#xff09;是基于深度學習和神經網絡的自然語言處理技術&#xff0c;目前主要通過Transformer架構和大規模數據訓練來理解和生成語言。GPT不同架構的訓練參數&#xff1a;GPT-1(2018)&#xff1a;1.17億參數GPT-2(2018)&#xff1a…