您好,登錄后才能下訂單哦!
????????今天上班的時候,突然收到集群很多容器調度失敗的告警,大致如下;
????????
????????看到大量容器調度失敗,里面查了下管理平臺,看看這個時間段內有沒有哪個業務發布,果然發現有一個轉碼服務(CPU消耗性)的業務在這個時間點發布了一批任務。但這批任務發布為什么會導致出現一堆任務調度失敗呢?
????????緊接著我們抽查了幾個告警的容器,發現這些容器狀態都處于proeempted (搶占)狀態,原因只能是有更高優先級的pod調度到這臺node節點,把上面原有的pod 排擠走。但是剛剛發布的這個業務并沒有設置容器調度優先級,為什么會比其他容器優先級高呢?
????????經排查是因為同事在管理平臺上調整了容器默認優先級,由原來的默認低優先級修改成高優先級,具體背景是這樣:
????????前幾天有業務反饋他們的業務跑著跑著突然容器掛掉了,最后發現是因為調度了高優先級容器過去導致原本低優先級pod被排擠走。業務方同事覺得這個策略不靠譜,如果大家上來都選擇最高優先級,那所有人優先級都一樣了,他們建議默認策略改成最高優先級,允許業務按需將優先級調低,優先級低的容器在最后做成本分攤的時候適當打折,于是容器組同事將管理平臺上面的容器調度默認優先級修改為最高優先級。
同事將PriotityClasses 中highest-priority 的 globalDefault 設置成了true,也就是說默認所有新調度的容器都將是最高優先級。
查看 PriorityClasses 配置
apiVersion: scheduling.k8s.io/v1beta1
kind: PriorityClass
metadata:
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。
注意
1、If you upgrade your existing cluster and enable this feature, the priority of your existing Pods is effectively zero.
如果您升級已經存在的集群環境,并且啟用了該功能,那么,那些已經存在系統里面的 Pod 的優先級將會設置為 0。
2、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擠走,最終造成整個集群雪崩(全部容器重啟了一遍)。
總結:
1、將 priorityClass 中 globalDefault 設置為false 并通過前端默認設置最高優先級
在Pod中指定默認優先級而不是通過globalDefault指定
2、關注集群資源使用情況,資源不足時應及時擴容,至少保證集群中掛掉2,3臺node節點后,上面承載的容器能夠漂移到其他剩下的node節點上。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。