RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Pod一直處于Pending狀態(tài)?什么是Pod拓?fù)浼s束?

馬哥Linux運(yùn)維 ? 來源:稀土掘金 ? 2023-12-18 11:46 ? 次閱讀

起因: 今天在部署組件的時(shí)候,發(fā)現(xiàn)組件的pod一直處于Pending狀態(tài),報(bào)錯(cuò)顯示的原因是:不滿足Pod拓?fù)浞植技s束,看了代碼發(fā)現(xiàn)是原來同事給組件新增了Pod拓?fù)浼s束。對(duì)于Pod拓?fù)浼s束,我先前并沒有認(rèn)真了解過,剛好可以借這個(gè)排查問題的機(jī)會(huì)深入了解什么是Pod拓?fù)浼s束。

文檔參考主要是上述兩篇k8s官方的文檔,建議英文功底好的可以直接看第二篇文檔。

topologySpreadConstraints是一個(gè)Pod Spec層級(jí)的字段,其定義的結(jié)構(gòu)體如下:


spec:
  topologySpreadConstraints:
  - maxSkew: 
    topologyKey: 
    whenUnsatisfiable: 
    labelSelector: 

在官方文檔里還描述了許多beta特性的字段,但如果是剛上手Pod拓?fù)浼s束的小伙伴,可以從這上面的四個(gè)基本字段入手,先把這四個(gè)字段的含義吃透。

5e5a9f6a-9c10-11ee-8b88-92fbcf53809c.jpg

labelSelector:labelSelector是用來尋找匹配標(biāo)簽的Pod,對(duì)于每一個(gè)拓?fù)溆騺碚f,k8s調(diào)度器會(huì)計(jì)算其中匹配labelSelector的Pod數(shù)量。在上圖中,我們定義的拓?fù)浼s束只針對(duì)含有l(wèi)abel app=foo的Pod生效。

topologyKey:topologyKey用于一個(gè)拓?fù)溆?,這個(gè)值通常情況下是定義在節(jié)點(diǎn)上的標(biāo)簽。在上圖中,我們定義的拓?fù)溆蚓褪莦one,也就是含有zone這個(gè)label的節(jié)點(diǎn)才算在我們的拓?fù)溆蛑小?/p>

maxSkew:maxSkew指的就是Pod分布在不同的拓?fù)溆蛑械臄?shù)量差異。maxSkew要求其設(shè)定的值大于0,其值越小,說明我們期望Pod能夠越均衡地打散分布在拓?fù)溆蛑?,其值越大,則反之。在上圖中,如果新的Pod調(diào)度到Zone1中,則Zone1和Zone2的skew就是3-0=3,如果新的Pod調(diào)度到Zone2中,則Zone1和Zone2的skew就是2-1=1.

whenUnsatisfiable:whenUnsatisfiable指當(dāng)skew不滿足maxSkew時(shí),調(diào)度器會(huì)執(zhí)行的動(dòng)作,可選值為:

DoNotSchedule:(默認(rèn)值)不調(diào)度。

ScheduleAnyway:仍然調(diào)度,但會(huì)趨向于調(diào)度到使skew最小的拓?fù)溆蛑小?/p>

了解到這里,我就已經(jīng)排查出來調(diào)度不上去的原因了:集群是一個(gè)兩節(jié)點(diǎn)的集群(1master+1worker),但這兩個(gè)節(jié)點(diǎn)屬于同一個(gè)可用區(qū),但有一點(diǎn)奇怪的是,按照算法,應(yīng)該會(huì)有一個(gè)Pod調(diào)度上去,另一個(gè)Pod處于Pending狀態(tài),但現(xiàn)實(shí)卻是兩個(gè)Pod都處于Pending狀態(tài)。繼續(xù)看代碼,我發(fā)現(xiàn)了同事不僅用了topologySpreadConstraints,還結(jié)合了親和性反親和性一起使用。

Pod拓?fù)浼s束可以結(jié)合親和和反親和特性一起使用,達(dá)到更豐富的效果,以實(shí)際業(yè)務(wù)場景中的代碼為例:


    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

可以看到,我們設(shè)置了Pod 反親和性,禁止符合條件的Pod調(diào)度到同一個(gè)節(jié)點(diǎn)上(可能是出于容災(zāi)或其他方面的考慮),再看Pod拓?fù)浼s束,要求Pod均勻地分布在每個(gè)可用區(qū)中,且每個(gè)可用區(qū)之間符合條件的Pod的數(shù)量差值最大為1,如果不滿足的條件下,禁止調(diào)度。(強(qiáng)打散Pod到每個(gè)可用區(qū)中,可能是出于網(wǎng)絡(luò)帶寬,cpu內(nèi)存等資源角度的考慮)。

因此,在僅有兩個(gè)節(jié)點(diǎn)的集群中,且這兩個(gè)節(jié)點(diǎn)還是屬于同一個(gè)可用區(qū)的情況下,無法滿足上述的調(diào)度條件,因此兩個(gè)Pod均處于Pending狀態(tài)。

解決方式有兩種,可以設(shè)置maxSkew的值為2,或者設(shè)置whenUnsatisfiable的值為ScheduleAnyway。

鏈接:https://juejin.cn/post/7245179553886486584







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SPEC
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    15792
  • POD
    POD
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    6019
  • 調(diào)度器
    +關(guān)注

    關(guān)注

    0

    文章

    98

    瀏覽量

    5245

原文標(biāo)題:Pod一直處于Pending狀態(tài)?可以看一下是不是拓?fù)浼s束的問題

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    介紹如何安裝E1135C PDU和Pod升級(jí)

    Describes how to install the E1135C PDU and Pod upgrade.
    發(fā)表于 08-21 14:07

    從零開始入門 K8s| 詳解 Pod 及容器設(shè)計(jì)模式

    100~200KB 左右,是個(gè)匯編語言寫的、永遠(yuǎn)處于“暫?!?b class='flag-5'>狀態(tài)的容器。由于有了這樣個(gè) Infra container 之后,其他所有容器都會(huì)通過 Join Namespace
    發(fā)表于 09-20 15:12

    Pod資源配置

    《Kubernetes進(jìn)階實(shí)戰(zhàn)》第四章《管理Pod資源對(duì)象》
    發(fā)表于 10-22 14:39

    Land Pattern and POD

    Land Pattern and POD
    發(fā)表于 03-05 15:59 ?0次下載
    Land Pattern and <b class='flag-5'>POD</b>

    Kubernetes組件pod核心原理

    1. 核心組件原理 —— pod 核心原理 1.1 pod 是什么 pod 也可以理解是個(gè)容器,裝的是 docker 創(chuàng)建的容器,也就是用來封裝容器的
    的頭像 發(fā)表于 09-02 09:27 ?1818次閱讀

    pod底層網(wǎng)絡(luò)和數(shù)據(jù)存儲(chǔ)是如何進(jìn)行的

    1. 核心組件原理 —— pod 核心原理 1.1 pod 是什么 pod 也可以理解是個(gè)容器,裝的是 docker 創(chuàng)建的容器,也就是用來封裝容器的
    的頭像 發(fā)表于 09-24 11:35 ?1681次閱讀

    word文檔如何解密

    word文檔 如何解密,Kubernetes pod 啟動(dòng)時(shí)會(huì)拉取用戶指定的鏡像,旦這個(gè)過程耗時(shí)太久就會(huì)導(dǎo)致 pod 長時(shí)間處于 pending
    的頭像 發(fā)表于 03-14 09:10 ?1700次閱讀

    如何利用Docker實(shí)現(xiàn)Pod

    Container 和 Pod 是相似的。在底層,它們主要依賴 Linux 命名空間和 cgroup。但是,Pod 不僅僅是組容器。Pod
    發(fā)表于 11-14 12:51 ?1395次閱讀

    Kubernetes中的Pod簡易理解

    Pod是Kubernetes中非常重要的概念,也是Kubernetes管理的基本單位。正如其名,Pod個(gè)豌豆莢,可以容納多個(gè)container,擁有相同的IP地址。
    的頭像 發(fā)表于 02-15 10:44 ?1270次閱讀

    什么是CNI,基于Calico的Pod網(wǎng)絡(luò)介紹

    個(gè)Node上都會(huì)有個(gè)tunl0的虛擬網(wǎng)卡,這個(gè)網(wǎng)卡可以理解成網(wǎng)橋,所有Pod都要基于此網(wǎng)橋來和其它Pod通信。 ② 每生成個(gè)新的
    發(fā)表于 04-20 09:37 ?2334次閱讀

    k8s與pod之間是如何進(jìn)行網(wǎng)絡(luò)隔離的?

    NetworkPolicy用來控制PodPod之間的網(wǎng)絡(luò)通信,它也支持針對(duì)Namespace進(jìn)行限制。
    的頭像 發(fā)表于 05-11 09:35 ?1547次閱讀
    k8s與<b class='flag-5'>pod</b>之間是如何進(jìn)行網(wǎng)絡(luò)隔離的?

    iOS中Pod庫資源引用探究

    Cocoapods中Pod引用資源的方式有多種,不同的方式對(duì)資源的使用還是有區(qū)別的,但也有定的規(guī)律,這里我用個(gè)樣例工程來進(jìn)行說明,樣例工程名叫:AssetsDemo,使用pod l
    的頭像 發(fā)表于 05-26 11:11 ?916次閱讀
    iOS中<b class='flag-5'>Pod</b>庫資源引用探究

    POD到底是什么?聊聊POD

    POD,即Plain Old Data的縮寫,plain代表普通,Old代表舊,從字面意思看是老的、普通的數(shù)據(jù)類型。
    的頭像 發(fā)表于 06-19 15:24 ?5476次閱讀

    如何快速查看Kubernetes Pod崩潰前的日志

    當(dāng)pod處于crash狀態(tài)的時(shí)候,容器不斷重啟,此時(shí)用 kubelet logs 可能出現(xiàn)一直捕捉不到日志。
    的頭像 發(fā)表于 07-06 09:25 ?755次閱讀

    Pod是如何在底層實(shí)現(xiàn)的?如何使用Docker創(chuàng)建Pod?

    剛開始接觸 Kubernetes 時(shí),你學(xué)到的第件事就是每個(gè) Pod 都有個(gè)唯的 IP 和主機(jī)名,并且在同個(gè)
    的頭像 發(fā)表于 08-14 10:33 ?1292次閱讀
    <b class='flag-5'>Pod</b>是如何在底層實(shí)現(xiàn)的?如何使用Docker創(chuàng)建<b class='flag-5'>Pod</b>?
    RM新时代网站-首页