Kubernetes

當一個 initContainer 被 OOMKilled 時,Pod 卡在 PodInitializing 狀態

  • August 30, 2022

我有以下本地 Kubernetes 環境:

  • 作業系統:紅帽企業 Linux 8.6 版(Ootpa)
  • Kubernetes:1.23.7(單節點,使用 kubeadm 建構)
  • 英偉達驅動:515.65.01
  • nvidia-container-toolkit: 1.10.0-1.x86_64 (rpm)
  • 容器化:v1.6.2
  • vcr.io/nvidia/k8s-device-plugin:v0.12.2

我在我的伺服器上執行以下 Pod。只有 app2 (initContainer2) 使用 GPU。

initContainer1: app1
↓
initContainer2: app2 (Uses GPU)
↓
container1: app3

當 app2 使用太多 RAM 並被 OOM 殺死時,Pod 應該處於OOMKilled狀態,但它卡在PodInitializing我的環境中的狀態。

NAMESPACE     NAME       READY   STATUS            RESTARTS       AGE     IP               NODE      NOMINATED NODE   READINESS GATES
default       gpu-pod    0/1     PodInitializing   0              83m     xxx.xxx.xxx.xxx   xxxxx   <none>           <none>

結果kubectl describe pod如下:

Init Containers:
 app1:
   ...
   State:          Terminated
     Reason:       Completed
     Exit Code:    0
     Started:      Tue, 30 Aug 2022 10:50:38 +0900
     Finished:     Tue, 30 Aug 2022 10:50:44 +0900
     ...
app2:
   ...
   State:          Terminated
     Reason:       OOMKilled
     Exit Code:    0
     Started:      Tue, 30 Aug 2022 10:50:45 +0900
     Finished:     Tue, 30 Aug 2022 10:50:48 +0900
     ...
app3:
   ...
   State:          Waiting
     Reason:       PodInitializing
     ...
   ...

當我將 app2 替換為另一個不使用 GPU 的容器時,或者當我將 app2 作為 Pod 的單個容器(不是 init 容器)啟動時,這個問題永遠不會發生。在這兩種情況下,狀態都是正確的OOMKilled

這是一個錯誤嗎?如果是這樣,是否有任何解決方法?

因此,工作流程如下面的文件所示。

初始化容器與普通容器完全一樣,除了:

  • 初始化容器總是執行到完成。
  • 每個 init 容器必須在下一個啟動之前成功完成。

如果 Pod 的 init 容器失敗,kubelet 會反復重啟該 init 容器,直到成功。但是,如果 Pod 的 restartPolicy 為 Never,並且在該 Pod 啟動期間某個 init 容器失敗,Kubernetes 會將整個 Pod 視為失敗。

所以它處於正確的狀態AFAIK。

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