K8S容器調度優先級誤設導致集羣雪崩踩坑記錄

        今天上班的時候,突然收到集羣很多容器調度失敗的告警,大致如下;

image.png

        

        看到大量容器調度失敗,裏面查了下管理平臺,看看這個時間段內有沒有哪個業務發佈,果然發現有一個轉碼服務(CPU消耗性)的業務在這個時間點發布了一批任務。但這批任務發佈爲什麼會導致出現一堆任務調度失敗呢?

        緊接着我們抽查了幾個告警的容器,發現這些容器狀態都處於proeempted (搶佔)狀態,原因只能是有更高優先級的pod調度到這臺node節點,把上面原有的pod 排擠走。但是剛剛發佈的這個業務並沒有設置容器調度優先級,爲什麼會比其他容器優先級高呢?


image.png


        經排查是因爲同事在管理平臺上調整了容器默認優先級,由原來的默認低優先級修改成高優先級,具體背景是這樣:

        前幾天有業務反饋他們的業務跑着跑着突然容器掛掉了,最後發現是因爲調度了高優先級容器過去導致原本低優先級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指定

image.png


2、關注集羣資源使用情況,資源不足時應及時擴容,至少保證集羣中掛掉2,3臺node節點後,上面承載的容器能夠漂移到其他剩下的node節點上。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章