起因: 今天在部署組件的時候,發(fā)現(xiàn)組件的pod一直處于Pending狀態(tài),報錯顯示的原因是:不滿足Pod拓撲分布約束,看了代碼發(fā)現(xiàn)是原來同事給組件新增了Pod拓撲約束。對于Pod拓撲約束,我先前并沒有認真了解過,剛好可以借這個排查問題的機會深入了解什么是Pod拓撲約束。 文檔參考主要是上述兩篇k8s官方的文檔,建議英文功底好的可以直接看第二篇文檔。 topologySpreadConstraints是一個Pod Spec層級的字段,其定義的結構體如下: spec: topologySpreadConstraints: - maxSkew: topologyKey: whenUnsatisfiable: labelSelector: 在官方文檔里還描述了許多beta特性的字段,但如果是剛上手Pod拓撲約束的小伙伴,可以從這上面的四個基本字段入手,先把這四個字段的含義吃透。 labelSelector:labelSelector是用來尋找匹配標簽的Pod,對于每一個拓撲域來說,k8s調度器會計算其中匹配labelSelector的Pod數(shù)量。在上圖中,我們定義的拓撲約束只針對含有l(wèi)abel app=foo的Pod生效。 topologyKey:topologyKey用于一個拓撲域,這個值通常情況下是定義在節(jié)點上的標簽。在上圖中,我們定義的拓撲域就是zone,也就是含有zone這個label的節(jié)點才算在我們的拓撲域中。 maxSkew:maxSkew指的就是Pod分布在不同的拓撲域中的數(shù)量差異。maxSkew要求其設定的值大于0,其值越小,說明我們期望Pod能夠越均衡地打散分布在拓撲域中,其值越大,則反之。在上圖中,如果新的Pod調度到Zone1中,則Zone1和Zone2的skew就是3-0=3,如果新的Pod調度到Zone2中,則Zone1和Zone2的skew就是2-1=1. whenUnsatisfiable:whenUnsatisfiable指當skew不滿足maxSkew時,調度器會執(zhí)行的動作,可選值為: DoNotSchedule:(默認值)不調度。 ScheduleAnyway:仍然調度,但會趨向于調度到使skew最小的拓撲域中。 了解到這里,我就已經排查出來調度不上去的原因了:集群是一個兩節(jié)點的集群(1master+1worker),但這兩個節(jié)點屬于同一個可用區(qū),但有一點奇怪的是,按照算法,應該會有一個Pod調度上去,另一個Pod處于Pending狀態(tài),但現(xiàn)實卻是兩個Pod都處于Pending狀態(tài)。繼續(xù)看代碼,我發(fā)現(xiàn)了同事不僅用了topologySpreadConstraints,還結合了親和性反親和性一起使用。 Pod拓撲約束可以結合親和和反親和特性一起使用,達到更豐富的效果,以實際業(yè)務場景中的代碼為例: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app.kubernetes.io/name: app-server topologyKey: kubernetes.io/hostname schedulerName: default-scheduler topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedulable labelSelector: matchLabels: app.kubernetes.io/instance: app-server app.kubernetes.io/name: app-server 可以看到,我們設置了Pod 反親和性,禁止符合條件的Pod調度到同一個節(jié)點上(可能是出于容災或其他方面的考慮),再看Pod拓撲約束,要求Pod均勻地分布在每個可用區(qū)中,且每個可用區(qū)之間符合條件的Pod的數(shù)量差值最大為1,如果不滿足的條件下,禁止調度。(強打散Pod到每個可用區(qū)中,可能是出于網絡帶寬,cpu內存等資源角度的考慮)。 因此,在僅有兩個節(jié)點的集群中,且這兩個節(jié)點還是屬于同一個可用區(qū)的情況下,無法滿足上述的調度條件,因此兩個Pod均處于Pending狀態(tài)。 解決方式有兩種,可以設置maxSkew的值為2,或者設置whenUnsatisfiable的值為ScheduleAnyway。 鏈接:https://juejin.cn/post/7245179553886486584 審核編輯:劉清 聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴 SPEC SPEC +關注 關注 0 文章 33 瀏覽量 16072 POD POD +關注 關注 0 文章 18 瀏覽量 6131 調度器 調度器 +關注 關注 0 文章 98 瀏覽量 5471 原文標題:Pod一直處于Pending狀態(tài)?可以看一下是不是拓撲約束的問題 文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。 收藏 人收藏 掃一掃,分享給好友 復制鏈接分享 評論 發(fā)布評論請先 登錄 相關推薦 熱點推薦 從零開始入門 K8s| 詳解 Pod 及容器設計模式 100~200KB 左右,是一個匯編語言寫的、永遠處于“暫?!?b class='flag-5'>狀態(tài)的容器。由于有了這樣一個 Infra container 之后,其他所有容器都會通過 Join Namespace 發(fā)表于 09-20 15:12 Pod資源配置 《Kubernetes進階實戰(zhàn)》第四章《管理Pod資源對象》 發(fā)表于 10-22 14:39 Land Pattern and POD Land Pattern and POD 發(fā)表于 03-05 15:59 ?0次下載 Kubernetes組件pod核心原理 1. 核心組件原理 —— pod 核心原理 1.1 pod 是什么 pod 也可以理解是一個容器,裝的是 docker 創(chuàng)建的容器,也就是用來封裝容器的 發(fā)表于 09-02 09:27 ?2050次閱讀 pod底層網絡和數(shù)據(jù)存儲是如何進行的 1. 核心組件原理 —— pod 核心原理 1.1 pod 是什么 pod 也可以理解是一個容器,裝的是 docker 創(chuàng)建的容器,也就是用來封裝容器的 發(fā)表于 09-24 11:35 ?1892次閱讀 如何利用Docker實現(xiàn)Pod Container 和 Pod 是相似的。在底層,它們主要依賴 Linux 命名空間和 cgroup。但是,Pod 不僅僅是一組容器。Pod 是一 發(fā)表于 11-14 12:51 ?1550次閱讀 Kubernetes中的Pod簡易理解 Pod是Kubernetes中非常重要的概念,也是Kubernetes管理的基本單位。正如其名,Pod像一個豌豆莢,可以容納多個container,擁有相同的IP地址。 發(fā)表于 02-15 10:44 ?1486次閱讀 什么是CNI,基于Calico的Pod網絡介紹 每一個Node上都會有一個tunl0的虛擬網卡,這個網卡可以理解成網橋,所有Pod都要基于此網橋來和其它Pod通信。 ② 每生成一個新的 發(fā)表于 04-20 09:37 ?2731次閱讀 k8s與pod之間是如何進行網絡隔離的? NetworkPolicy用來控制Pod與Pod之間的網絡通信,它也支持針對Namespace進行限制。 發(fā)表于 05-11 09:35 ?1866次閱讀 iOS中Pod庫資源引用探究 Cocoapods中Pod引用資源的方式有多種,不同的方式對資源的使用還是有區(qū)別的,但也有一定的規(guī)律,這里我用一個樣例工程來進行說明,樣例工程名叫:AssetsDemo,使用pod l 發(fā)表于 05-26 11:11 ?1112次閱讀 POD到底是什么?聊聊POD POD,即Plain Old Data的縮寫,plain代表普通,Old代表舊,從字面意思看是老的、普通的數(shù)據(jù)類型。 發(fā)表于 06-19 15:24 ?6850次閱讀 如何快速查看Kubernetes Pod崩潰前的日志 當pod處于crash狀態(tài)的時候,容器不斷重啟,此時用 kubelet logs 可能出現(xiàn)一直捕捉不到日志。 發(fā)表于 07-06 09:25 ?944次閱讀 Pod是如何在底層實現(xiàn)的?如何使用Docker創(chuàng)建Pod? 剛開始接觸 Kubernetes 時,你學到的第一件事就是每個 Pod 都有一個唯一的 IP 和主機名,并且在同一個 發(fā)表于 08-14 10:33 ?1560次閱讀 Kubernetes Pod常用管理命令詳解 Kubernetes Pod常用管理命令詳解 發(fā)表于 02-17 14:06 ?441次閱讀 詳解Kubernetes中的Pod調度親和性 在 Kubernetes(K8s)中,Pod 調度親和性(Affinity) 是一種高級調度策略,用于控制 Pod 與節(jié)點(Node)或其他 Pod 之間的關聯(lián)(親和)或反關聯(lián)(反親和 發(fā)表于 06-07 13:56 ?115次閱讀 華秋(原“華強聚豐”): 電子發(fā)燒友 華秋開發(fā) 華秋電路(原"華強PCB") 華秋商城(原"華強芯城") 華秋智造 My ElecFans APP 網站地圖 設計技術 可編程邏輯 電源/新能源 MEMS/傳感技術 測量儀表 嵌入式技術 制造/封裝 模擬技術 RF/無線 接口/總線/驅動 處理器/DSP EDA/IC設計 存儲技術 光電顯示 EMC/EMI設計 連接器 行業(yè)應用 LEDs 汽車電子 音視頻及家電 通信網絡 醫(yī)療電子 人工智能 虛擬現(xiàn)實 可穿戴設備 機器人 安全設備/系統(tǒng) 軍用/航空電子 移動通信 工業(yè)控制 便攜設備 觸控感測 物聯(lián)網 智能電網 區(qū)塊鏈 新科技 特色內容 專欄推薦 學院 設計資源 設計技術 電子百科 電子視頻 元器件知識 工具箱 VIP會員 最新技術文章 產品地圖 品牌地圖 社區(qū) 小組 論壇 問答 評測試用 企業(yè)服務 產品 資料 文章 方案 企業(yè) 供應鏈服務 硬件開發(fā) 華秋電路 華秋商城 華秋智造 nextPCB BOM配單 媒體服務 網站廣告 在線研討會 活動策劃 新聞發(fā)布 新品發(fā)布 小測驗 設計大賽 華秋 關于我們 投資關系 新聞動態(tài) 加入我們 聯(lián)系我們 舉報投訴 社交網絡 微博 移動端 發(fā)燒友APP 硬聲APP WAP 聯(lián)系我們 廣告合作 王婉珠:wangwanzhu@elecfans.com 內容合作 黃晶晶:huangjingjing@elecfans.com 內容合作(海外) 張迎輝:mikezhang@elecfans.com 供應鏈服務 PCB/IC/PCBA 江良華:lanhu@huaqiu.com 投資合作 曾海銀:zenghaiyin@huaqiu.com 社區(qū)合作 劉勇:liuyong@huaqiu.com 關注我們的微信 下載發(fā)燒友APP 電子發(fā)燒友觀察 電子工程師社區(qū) 1-32層PCB打樣·中小批量 元器件現(xiàn)貨·全球代購·SmartBOM SMT貼片·PCBA加工 PCB Manufacturer 華秋簡介 企業(yè)動態(tài) 聯(lián)系我們 企業(yè)文化 企業(yè)宣傳片 加入我們 版權所有 ? 湖南華秋數(shù)字科技有限公司 長沙市望城經濟技術開發(fā)區(qū)航空路6號手機智能終端產業(yè)園2號廠房3層(0731-88081133) 電子發(fā)燒友 (電路圖) 湘公網安備43011202000918 工商網監(jiān) 湘ICP備2023018690號-1