当 initContainer 发生 OOMKilled 时,Pod 会卡在 PodInitializing 状态

当 initContainer 发生 OOMKilled 时,Pod 会卡在 PodInitializing 状态

我有以下本地 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 视为失败。

据我所知,它处于正确状态。

相关内容