Kubernetes

Kubernetes Pod 在調度後立即以 OutOfMemory 狀態失敗

  • January 31, 2022

我正在裸機 Kubernetes 集群(版本 1.22.1)上測試我的應用程序,並且在將我的應用程序作為作業啟動時遇到問題。

我的集群有兩個節點(主節點和工作節點),但工作節點被封鎖。在主節點上,21GB 記憶體可供應用程序使用。

我試圖同時將我的應用程序作為三個不同的工作啟動。由於我將 16GB 的記憶體設置為資源請求和限制,因此只啟動了一個 Job,其餘兩個處於 Pending 狀態。我已將 backoffLimit: 0 設置為 Jobs。

NAME            READY   STATUS     RESTARTS   AGE
app1--1-8pp6l   0/1     Pending    0          42s
app2--1-42ssl   0/1     Pending    0          45s
app3--1-gxgwr   0/1     Running    0          46s

第一個 Pod 完成後,應該只啟動兩個處於 Pending 狀態的 Pod 中的一個。但是,一個已啟動,另一個處於 OutOfMemory 狀態,即使 Pod 中沒有啟動任何容器。

NAME            READY   STATUS        RESTARTS   AGE
app1--1-8pp6l   0/1     Running       0          90s
app2--1-42ssl   0/1     OutOfmemory   0          93s
app3--1-gxgwr   0/1     Completed     0          94s

OutOfMemory Pod 的事件如下:

Events:
 Type     Reason            Age                   From               Message
 ----     ------            ----                  ----               -------
 Warning  FailedScheduling  3m41s (x2 over 5m2s)  default-scheduler  0/2 nodes are available: 1 Insufficient memory, 1 node(s) were unschedulable.
 Normal   Scheduled         3m38s                 default-scheduler  Successfully assigned test/app2--1-42ssl to master
 Warning  OutOfmemory       3m38s                 kubelet            Node didn't have enough resource: memory, requested: 16000000000, used: 31946743808, capacity: 37634150400

似乎 Pod 已分配給節點,即使沒有足夠的空間給它,因為另一個 Pod 剛剛啟動。

我想這不是 Kubernetes 的預期行為,有人知道這個問題的原因嗎?

這是版本的已知問題1.22.x- 您可以找到有關此的多個 GitHub 和 Stackoverflow 主題,例如:

該問題的修復包含在 1.23 版本中

  • 修復了一個回歸,其中 Kubelet 在決定是否允許更多 pod 時,無法從計算目前使用的資源數量中排除已完成的 pod。(#104577@smarterclayton

因此,請將您的 Kubernetes 集群升級到最新的穩定版本。

我希望它會對您有所幫助,但請記住,即使應用了修復程序,Github 上仍存在另一個類似問題(此處提到大約 10 天前 - 狀態為 2022 年 1 月 13 日):

在此處連結以確保完整性 - 如#106884中所述,在此修復後可能會出現類似的症狀。kubelet 認為用於終止 pod 的資源正在使用中(它們是!),但調度程序忽略終止 pod 並調度新 pod。因為 kubelet 現在考慮終止 pod,所以它拒絕那些快速重新調度的 pod。

那麼,可能唯一的解決方案就是降級到 1.21 版本。

引用自:https://serverfault.com/questions/1089638