我有以下本地 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
。
这是一个错误吗?如果是这样,是否有任何解决方法?
因此,工作流程如下面的文档所示。
初始化容器与普通容器完全一样,除了:
如果 Pod 的 init 容器失败,kubelet 会反复重启该 init 容器,直到成功。但是,如果 Pod 的 restartPolicy 为 Never,并且在该 Pod 启动期间某个 init 容器失败,Kubernetes 会将整个 Pod 视为失败。
所以它处于正确的状态AFAIK。