起因: 今天在部署組件的時(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è)字段的含義吃透。
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
審核編輯:劉清
-
SPEC
+關(guān)注
關(guān)注
0文章
31瀏覽量
15792 -
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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論