k8s學習記錄(四):節點親和性

一、前言

??在上一篇文章里,我們了解了 Pod 中的nodeNamenodeSelector這兩個屬性,通過它們能夠指定 Pod 調度到哪個 Node 上。今天,我們將進一步深入探索 Pod 相關知識。這部分內容不僅信息量較大,理解起來也有一定難度,如果在學習過程中感覺吃力,建議大家反復研讀,以便更好地掌握。

二、親和性

??在 Kubernetes 的 Pod 調度場景中,盡管我們可以借助nodeName和nodeSelector指定 Pod 的調度節點,但它們存在明顯的局限性。nodeName依賴節點名稱進行調度,nodeSelector則基于節點標簽來確定調度目標,二者都不夠靈活,擴展性也欠佳。那么,是否存在其他更豐富的屬性能夠助力 Pod 調度呢?例如,能否依據 CPU、內存等資源屬性來決定 Pod 的部署節點?作為強大的容器編排工具,Kubernetes 顯然考慮到了這一需求,接下來我們將深入學習的 “親和性”,便是解決這一問題的關鍵。
??親和性同樣用于 Pod 的節點調度,與nodeSelector有一定相似之處,但親和性的優勢更為顯著。它支持定義多個調度規則,還能為這些規則設定優先級,從而實現更精細的調度控制。親和性主要分為節點親和性和 Pod 親和性。簡單來講,親和性就是一組預先設定的規則,其作用是明確告知 Kubernetes 該如何調度 Pod。
??其中,節點親和性又細分為軟親和性和硬親和性。軟親和性是一種較為靈活的調度策略,當多個節點都滿足設定條件時,它會優先選擇優先級更高的節點;若所有節點都無法完全滿足條件,Pod 依然可以被調度到其他相對合適的節點。打個比方,這就像是你向 Kubernetes 提出請求:“請幫我把 Pod 調度到某個節點上,這個節點最好能滿足條件 1 和條件 2,如果實在沒有完全符合的,那就找一個最接近要求的節點部署吧。”
??而硬親和性則截然不同,它是一種嚴格的調度策略。只有當節點完全滿足設定的所有條件時,Pod 才會被調度到該節點;若不存在任何滿足條件的節點,Pod 將無法運行,這正如成語 “寧缺毋濫” 所表達的含義。

軟親和性例子:

女生A和媒婆說:我要找個男朋友,條件1:身高1米8;條件2:有車有房,如果兩者都不滿足那么性格好就行了。

硬親和性例子:我要個男朋友條件1:身高1米8;條件2:有車有房,這兩個條件缺一不可,否則我寧可單身!

1、先查看一下描述

kubectl explain pods.spec.affinity

親和性總共有3個字段:節點親和性、pod親和性、pod反親和性

  • nodeAffinity(節點親和性):通過標簽選擇器和表達式來約束Pod
  • podAffinity(pod親和性):用于指定Pod應該被部署到符合某些條件的Pod所在的Node:例如我們將多個業務關聯性高的Pod部署在同一個節點。
  • podAntiAffinity(Pod反親和性):用于指定Pod應該避免部署到符合某些條件的Pod所在的Node,場景:例如避免把相似的Pod都部署到同一個Node,從而可能產生單點故障。

三、節點親和性(nodeAffinity)

1、解釋

kubectl explain pods.spec.affinity

這里有兩個字段

  • preferredDuringSchedulingIgnoredDuringExecution :軟親和性

它是一種建議性的規則,Kubernetes 調度器會盡量依據此規則來調度 Pod 到符合條件的節點上,但并非強制要求。若不存在滿足規則的節點,Pod 依然可以被調度到其他節點。此規則在調度階段起作用,調度器會優先考慮將 Pod 調度到滿足軟親和性規則的節點上。而在 Pod 運行期間,一旦節點的標簽發生變化,導致不再符合軟親和性規則,Pod 不會被驅逐。


  • requiredDuringSchedulingIgnoredDuringExecution:硬親和性

和軟親和性不同,硬親和性是一種強制的規則,要求調度器在調度的時候必須滿足一定的規則,否則將不會進行調度,pod會一直處于pending狀態。同時運行期間如果節點的標簽發生變化導致不符合規則,Pod會被驅逐。

2、實操

我們現在有兩個節點,分別是node2和node3,其中node2包含標簽cpu=high ,而node3包含標簽cpu=low,我們用這個標簽來測試節點親和性。

1、軟親和性

(1)我們先測試軟親和性,即期望pod會被調度到cpu=high的節點,資源清單如下

apiVersion: v1
kind: Pod
metadata:name: buybox-pod
spec:containers:- name: buybox-containerimage: buybox:1.28imagePullPolicy: IfNotPresentaffinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100preference:matchExpressions:- key: cpuoperator: Invalues:- high    

接下來我們使用命令 apply -f busybox.yaml 來創建這個pod,預期的效果是會被調度到node2節點,結果如下

可以看到和我們的預期一樣,Pod被調度到了node2節點上。

(2)我們修改一下資源清單,寫一個不存在的標簽值看是否能夠調度。預期結果:也能正常調度只不過會在node2和node3中隨機選擇。

apiVersion: v1
kind: Pod
metadata:name: buybox-pod
spec:containers:- name: buybox-containerimage: buybox:1.28imagePullPolicy: IfNotPresentaffinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100preference:matchExpressions:- key: cpuoperator: Invalues:- best    

調度結果:node3 (不用管這里的狀態是 ErrImagePull,這個是筆者網絡問題導致拉取鏡像有問題,但是和調度沒關系)

(3)小結

案例1預期結果實際結果
正常情況,標簽cpu=high節點2節點2
都不滿足,標簽cpu=best節點2或者節點3節點3

小結:軟親和性是一種建議,即如果滿足要求就選擇某個節點,若不存在滿足規則的節點,Pod 依然可以被調度到其他節點。

1、硬親和性

還是剛才的案例,我們把軟親和性換成硬親和性

(1)cpu=high 我們預期是調度到node2

apiVersion: v1
kind: Pod
metadata:name: buybox-pod
spec:containers:- name: buybox-containerimage: buyboxports:- containerPort: 80affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: cpuoperator: Invalues:- high

結果調度了node2,符合預期

(2)我們修改規則,將values改成不存的值,預期無法調度到任何一個節點

apiVersion: v1
kind: Pod
metadata:name: buybox-pod
spec:containers:- name: buybox-containerimage: buyboxports:- containerPort: 80affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: cpuoperator: Invalues:- best

結果如下

可以看到狀態一直處于Pending狀態,查看一下pod詳細信息,使用命令 kubectl describe pods buybox-pod

錯誤信息:

Warning FailedScheduling 12s (x3 over 89s) default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn’t tolerate, 2 node(s) didn’t match Pod’s node affinity.

調度失敗了,因為3個節點都不滿足親和性條件。

小結:

案例1預期結果實際結果
正常情況,標簽cpu=high節點2節點2
都不滿足,標簽cpu=best無法調度無法調度

四、總結

本文聚焦 Kubernetes 的節點親和性。在 Pod 調度中,以往的 nodeName 和 nodeSelector 存在局限,親和性則更為強大,其中節點親和性包含軟、硬親和性。

軟親和性是建議性規則。測試時,期望調度到cpu=high的節點,Pod 成功被調度到 node2;設置不存在的標簽值,Pod 也能在現有節點隨機調度,如被調度到 node3,說明無滿足節點時 Pod 仍可調度。硬親和性requiredDuringSchedulingIgnoredDuringExecution是強制規則。同樣的測試場景下,要求調度到cpu=high的節點,Pod 被調度到 node2;設置不存在的標簽值,Pod 處于 Pending 狀態,調度失敗,表明不滿足條件時 Pod 無法調度。

學習節點親和性的軟、硬親和性,有助于精準控制 Pod 部署,提升集群資源利用率和應用穩定性,為 Kubernetes 復雜應用部署管理筑牢基礎。下一篇我們將繼續學習親和性,希望對你有所幫助

五、未完待續

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

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

相關文章

NeRF:原理 + 實現 + 實踐全流程配置+數據集測試【Ubuntu20.04 】【2025最新版】

一、引言 從三維建模、虛擬現實到電影級渲染,真實感建模一直是計算機視覺和圖形學的核心目標。 在傳統方法中,我們往往依賴: 多視角立體(MVS)點云重建 網格擬合顯式建模(如多邊形、體素、TSDF&#xff0…

ASP.NET MVC? 入門指南三

16. 安全性 16.1 身份驗證和授權 身份驗證:確認用戶的身份。ASP.NET MVC 支持多種身份驗證方式,如表單身份驗證、Windows 身份驗證和 OAuth 等。 表單身份驗證:用戶通過輸入用戶名和密碼登錄,服務器驗證后頒發一個身份驗證票證&…

佳博票據和標簽打印:Web網頁端與打印機通信 | iOS

文章目錄 引言I Web網頁端與打印機通信webSDK(包含示例頁)打印測試II iOS與佳博打印機通信引言 佳博工具下載ESC是票據打印指令,TSC是標簽打印指令 工業打印機:佳博GP-H430F工業機標簽條碼打印機物流快遞電子面單條碼機碳帶機 應用場景:打印商品價格標簽、打印交易小票 I…

c語言初識

學c注意事項 我寫了很多服務器的代碼,我怕有些人看不懂所以就寫了這篇入門篇。 學習c語言要多動手,多練習,其實語法就幾個,你了解了就會寫出自己想要的代碼,你不要怕不會寫不出程序,因為大部分代碼都有人寫好&#xf…

請求參數、路徑參數、查詢參數、Spring MVC/FeignClient請求相關注解梳理

目錄 1 請求分類1.1 URL參數--查詢參數1.2 URL參數--路徑參數 2 請求相關注解2.1 RequestParam--查詢參數2.2 PathVariable--路徑參數2.3 RequestBody2.4 Param & RequestLine2.5 SpringMVC請求參數注解用在FeignClient里 使用SpringMVC處理http請求或使用FeignClient進行請…

智能指針之設計模式3

這次我們看一下智能指針是如何使用策略模式來釋放資源的,同時又是如何擴展功能,管理更多的資源對象類型的。 3、策略模式 策略模式作為一種軟件設計模式,指對象有某個行為,但是在不同的應用場景中,該行為有不同的實現…

華為盤古OS深度評測:構建AI自進化系統的實踐密碼

華為盤古OS通過分布式AI內核與自適應學習框架的深度耦合,重新定義操作系統級智能能力。實測顯示其AI任務調度效率較傳統系統提升17倍,本文從智能體編排、持續學習機制、端云協同架構三個維度,解析如何基于DevKit 3.0打造具備認知進化能力的下…

精益數據分析(28/126):解讀商業模式拼圖與關鍵指標

精益數據分析(28/126):解讀商業模式拼圖與關鍵指標 在創業和數據分析的探索旅程中,每一次深入研究都可能帶來新的啟發和突破。今天,我們依舊帶著共同進步的初心,深入解讀《精益數據分析》中關于商業模式的…

GitLab Runner配置并行執行多個任務

檢查并修改方法: 打開 Runner 的配置文件(通常位于 /etc/gitlab-runner/config.toml 或 ~/.gitlab-runner/config.toml)。 確保 concurrent 值大于 1,例如: concurrent 4 # 允許最多 4 個任務同時運行重啟 Runner…

開發首個Spring Boot應用

📋 前置條件 🎯 在開始之前,請打開終端并運行以下命令以確保已安裝正確版本的 Java: $ java -version openjdk version "17.0.4.1" 2022-08-12 LTS OpenJDK Runtime Environment (build 17.0.4.11-LTS) OpenJDK 64-Bi…

【信息系統項目管理師】高分論文:論質量管理和進度管理(智慧旅游平臺建設項目)

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 論文1、規劃質量管理2、質量保證3、質量控制論文 2019年3月,我作為項目經理,參加了某市智慧旅游平臺建設項目,負責項目的全面管理, 該項目以打造一流的國內外生態旅游城市為目標,旨在大數據云平臺建設的基…

DAM-3B,英偉達推出的多模態大語言模型

DAM-3B是什么 DAM-3B(Describe Anything 3B)是英偉達推出的一款多模態大語言模型,專門用于為圖像和視頻中的特定區域生成詳細描述。用戶可以通過點、邊界框、涂鴉或掩碼等方式來標識目標區域,從而得到精準且符合上下文的文本描述…

如何判斷你的PyTorch是GPU版還是CPU版?

如何判斷你的PyTorch是GPU版還是CPU版? PyTorch作為當前最流行的深度學習框架之一,支持在CPU和GPU(NVIDIA CUDA)上運行。對于深度學習開發者來說,正確識別PyTorch版本至關重要,因為GPU版本可以帶來10-100倍的性能提升。本文將全面…

Gin框架

Gin 快速入門 go get -u github.com/gin-gonic/gin package main import gin "github.com/gin-gonic/gin"func main() {engine : gin.Default()engine.GET("/", func(c *gin.Context) {c.String(200, "Hello Gin")})engine.Run(":8888&q…

【Project】基于spark-App端口懂車帝數據采集與可視化

文章目錄 hadoop完全分布式部署hdfs-site.xmlcore-site.xmlmarpred-site.xmlyarn-site.xml spark集群部署spark-env.sh mongodb分片模式部署config 服務器初始化config 副本集 shard 服務器初始化shard 副本集 mongos服務器添加shard設置chunk大小 啟動分片為集合 user 創建索引…

brew 安裝openjdk查看其版本

使用brew(如果你使用Homebrew安裝) 如果你通過Homebrew安裝了OpenJDK,可以使用以下命令來查看安裝的版本,: brew list --versions openjdk8 這將會列出所有通過Homebrew安裝的OpenJDK版本及其版本號。 3. 查看/usr/libexec/ja…

【Linux網絡】構建與優化HTTP請求處理 - HttpRequest從理解到實現

📢博客主頁:https://blog.csdn.net/2301_779549673 📢博客倉庫:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正! &…

Day12(回溯法)——LeetCode51.N皇后39.組合總和

1 前言 今天刷了三道回溯法和一道每日推薦,三道回溯法也迷迷糊糊的,每日推薦把自己繞進去了,雖然是一道之前做過的題的變種。刷的腦子疼。。。今天挑兩道回溯題寫一下吧,其中有一道是之前做過的N皇后,今天在詳細寫一寫…

初階數據結構:二叉搜索樹

目錄 概念 性能 效率分析 二分缺陷 功能 插入 查找 刪除 實現 應用 概念 二叉搜索樹(又稱:二叉排序樹),是由一些具有特別性質的二叉樹衍變而來。 只要一棵二叉樹具備以下性質,即可稱作二叉搜索樹。 【1】若…

詳解springcloud gateway工作原理、斷言、filter、uri、id、全局跨域、globalfilter等以及關鍵源碼實現

1.gateway概念 網關就是當前微服務項目的"統一入口"程序中的網關就是當前微服務項目對外界開放的統一入口所有外界的請求都需要先經過網關才能訪問到我們的程序提供了統一入口之后,方便對所有請求進行統一的檢查和管理 2. 網關的主要功能 將所有請求統一經過網關網…