我有以下本地 Kubernetes 环境:
- 操作系统:Red Hat Enterprise Linux 版本 8.6(Ootpa)
- Kubernetes:1.23.7(单节点,使用 kubeadm 构建)
- NVIDIA 驱动程序:515.65.01
- nvidia-container-toolkit:1.10.0-1.x86_64 (rpm)
- 容器:v1.6.2
- vcr.io/nvidia/k8s-设备插件: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
...
...
当我用另一个不使用 GPU 的容器替换 app2 时,或者当我将 app2 作为 Pod 的单个容器(而不是 init 容器)启动时,此问题永远不会发生。在这两种情况下,状态都将正确OOMKilled
。
这是一个错误吗?如果是,有什么解决方法吗?
答案1
因此工作流程如下(来自文档)。
初始化容器与常规容器完全相同,但以下情况除外:
- 初始化容器总是运行至完成。
- 每个初始化容器必须成功完成,下一个初始化容器才能启动。
如果 Pod 的 init 容器失败,kubelet 会反复重启该 init 容器,直到成功。但是,如果 Pod 的 restartPolicy 为 Never,并且 init 容器在该 Pod 启动期间失败,则 Kubernetes 会将整个 Pod 视为失败。
据我所知,它处于正确状态。