Eu tenho o seguinte ambiente local do Kubernetes:
- SO: Red Hat Enterprise Linux versão 8.6 (Ootpa)
- Kubernetes: 1.23.7 (nó único, compilado com kubeadm)
- Driver NVIDIA: 515.65.01
- nvidia-container-toolkit: 1.10.0-1.x86_64 (rpm)
- containerd: v1.6.2
- vcr.io/nvidia/k8s-device-plugin:v0.12.2
E eu executo o seguinte Pod no meu servidor. Apenas app2 (initContainer2) usa GPU.
initContainer1: app1
↓
initContainer2: app2 (Uses GPU)
↓
container1: app3
Quando o app2 usa muita RAM e é eliminado do OOM, o Pod deve estar no OOMKilled
status, mas está preso no PodInitializing
status no meu ambiente.
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>
O resultado kubectl describe pod
é o seguinte:
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
...
...
Esse problema nunca acontecerá quando eu substituir app2 por outro contêiner que não usa GPU ou quando eu iniciar app2 como um único contêiner (não um contêiner init) do Pod. Em ambos os casos, o status será corretamente OOMKilled
.
Isso é um inseto? Em caso afirmativo, existem soluções alternativas?
Portanto, o fluxo de trabalho é como abaixo da documentação.
Os contêineres de inicialização são exatamente como os contêineres normais, exceto:
Se o contêiner de inicialização de um pod falhar, o kubelet reiniciará repetidamente esse contêiner de inicialização até que seja bem-sucedido. No entanto, se o pod tiver uma restartPolicy de Never e um contêiner de inicialização falhar durante a inicialização desse pod, o Kubernetes tratará o pod geral como com falha.
Então está no estado correto AFAIK.