创建使用GPU虚拟化多卡均分调度功能的工作负载之后,大量Pod执行失败
问题现象
创建使用GPU虚拟化多卡均分调度功能的工作负载之后,大量的GPU Pod执行失败。具体示例如下:
kubectl get pods
回显结果如下:
NAME READY STATUS RESTARTS AGE test-586cf9464c-54g4s 0/1 UnexpectedAdmissionError 0 57s test-586cf9464c-58n6d 0/1 UnexpectedAdmissionError 0 10s test1-689cf9462f-5bzcv 0/1 UnexpectedAdmissionError 0 58s ...
问题原因
- 插件版本在2.1.41及以上时:集群版本在1.27.16-r20、1.28.15-r10、1.29.10-r10、1.30.6-r10、v1.31.4-r0及以上。
- 插件版本在2.7.57及以上时:集群版本在1.28.15-r10、1.29.10-r10、1.30.6-r10、v1.31.4-r0及以上。
当集群版本不兼容时,若节点的GPU虚拟化资源未耗尽,则Pod可以正常调度。但在资源耗尽后,当前版本的kubelet无法正确处理多卡均分调度请求,导致持续调度失败的Pod堆积,引发内存泄漏,最终造成批量Pod执行失败。
解决方案
- 如果需要继续使用GPU虚拟化多卡均分调度功能,则需要先将执行失败的工作负载删除,再将集群升级至适配版本,升级的具体步骤请参见集群升级流程。集群升级成功后,重新创建对应工作负载,即可正常调度。
- 如果不需要使用GPU虚拟化多卡均分调度功能,则需要依次重启对应节点的kubelet组件,以恢复其性能。具体步骤如下:
- 执行以下命令,查看问题Pod的所在节点,记录所有节点IP,后续需要根据节点IP依次恢复节点kubelet组件。
kubectl get pod -l volcano.sh/gpu-num -owide
回显结果如下:
NAME READY STATUS RESTARTS AGE IP NODE test-586cf9464c-54g4s 0/1 UnexpectedAdmissionError 0 5m57s <none> 11.84.252.4 test-586cf9464c-58n6d 0/1 UnexpectedAdmissionError 0 5m10s 172.19.0.24 11.84.252.4 test-586cf9464c-5bzcv 0/1 UnexpectedAdmissionError 0 5m58s <none> 11.84.252.4 test-586cf9464c-6bb5d 0/1 UnexpectedAdmissionError 0 6m15s <none> 11.84.252.4 test-586cf9464c-6r2bq 0/1 UnexpectedAdmissionError 0 5m11s <none> 11.84.252.4 test-586cf9464c-6rcpl 0/1 UnexpectedAdmissionError 0 6m11s 172.19.0.21 11.84.252.4 ...
- 执行以下命令,删除使用GPU虚拟化多卡均分调度的工作负载,deployment请替换为对应的工作负载类型,test请替换成对应的工作负载名称。
kubectl delete deployment test # 删除无状态工作负载test
回显结果如下:
deployment.apps/test deleted
- 依次登录1中涉及的节点,执行以下命令,重启kubelet服务。
systemctl restart kubelet
在回显中输入节点密码,无错误提示则说明重启成功。重启成功后,之前执行失败的非多卡均分调度的Pod将正常调度。
- 执行以下命令,查看问题Pod的所在节点,记录所有节点IP,后续需要根据节点IP依次恢复节点kubelet组件。