今天上班的時候,忽然收到集羣不少容器調度失敗的告警,大體以下;前端
看到大量容器調度失敗,裏面查了下管理平臺,看看這個時間段內有沒有哪一個業務發佈,果真發現有一個轉碼服務(CPU消耗性)的業務在這個時間點發布了一批任務。但這批任務發佈爲何會致使出現一堆任務調度失敗呢?node
緊接着咱們抽查了幾個告警的容器,發現這些容器狀態都處於proeempted (搶佔)狀態,緣由只能是有更高優先級的pod調度到這臺node節點,把上面原有的pod 排擠走。可是剛剛發佈的這個業務並無設置容器調度優先級,爲何會比其餘容器優先級高呢?api
經排查是由於同事在管理平臺上調整了容器默認優先級,由原來的默認低優先級修改爲高優先級,具體背景是這樣:ide
前幾天有業務反饋他們的業務跑着跑着忽然容器掛掉了,最後發現是由於調度了高優先級容器過去致使本來低優先級pod被排擠走。業務方同事以爲這個策略不靠譜,若是你們上來都選擇最高優先級,那全部人優先級都同樣了,他們建議默認策略改爲最高優先級,容許業務按需將優先級調低,優先級低的容器在最後作成本分攤的時候適當打折,因而容器組同事將管理平臺上面的容器調度默認優先級修改成最高優先級。this
同事將PriotityClasses 中highest-priority 的 globalDefault 設置成了true,也就是說默認全部新調度的容器都將是最高優先級。spa
查看 PriorityClasses 配置blog
apiVersion: scheduling.k8s.io/v1beta1ip
kind: PriorityClass資源
metadata:it
name: highest-priority
value: 400
globalDefault: true
官網上關於priorityClass 作了如下解釋
The globalDefault field indicates that the value of this PriorityClass should be used for Pods without a priorityClassName. Only one PriorityClass with globalDefault set to true can exist in the system. If there is no PriorityClass with globalDefault set, the priority of Pods with no priorityClassName is zero.
PriorityClass 還有兩個可選的字段:globalDefault 和 description。globalDefault 表示 PriorityClass 的值應該給那些沒有設置 PriorityClassName 的 Pod 使用。整個系統只能存在一個 globalDefault 設置爲 true 的 PriorityClass。若是沒有任何 globalDefault 爲 true 的 PriorityClass 存在,那麼,那些沒有設置 PriorityClassName 的 Pod 的優先級將爲 0。
注意
一、If you upgrade your existing cluster and enable this feature, the priority of your existing Pods is effectively zero.
若是您升級已經存在的集羣環境,而且啓用了該功能,那麼,那些已經存在系統裏面的 Pod 的優先級將會設置爲 0。
二、Addition of a PriorityClass with globalDefault set to true does not change the priorities of existing Pods. The value of such a PriorityClass is used only for Pods created after the PriorityClass is added.
將一個 PriorityClass 的 globalDefault 設置爲 true,不會改變系統中已經存在的 Pod 的優先級。也就是說,PriorityClass 的值只能用於在 PriorityClass 添加以後建立的那些 Pod 當中。
也就是說priorityClass 中的globalDefault 設爲true的話,只針對後續發佈的Pod生效,已發佈的Pod優先級仍爲0
今天早上遇到的問題是集羣中一臺機器宕機,而後上面全部的pod 都從新調度到其餘機器,這些從新調度的Pod擁有最高優先級,當這批容器調度到其餘node節點後就會把該節點上面原有的低優先級Pod排擠走。而後這些被排擠走的Pod 又擁有最高優先級調度到其餘node節點,又把另一臺節點上面的Pod擠走,最終形成整個集羣雪崩(所有容器重啓了一遍)。
總結:
一、將 priorityClass 中 globalDefault 設置爲false 並經過前端默認設置最高優先級
在Pod中指定默認優先級而不是經過globalDefault指定
二、關注集羣資源使用狀況,資源不足時應及時擴容,至少保證集羣中掛掉2,3臺node節點後,上面承載的容器可以漂移到其餘剩下的node節點上。