Kubernetes
當一個 initContainer 被 OOMKilled 時,Pod 卡在 PodInitializing 狀態
我有以下本地 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。