指定--restart=Never运行python容器时kubectl会话挂起问题
结论
该现象属于kubectl的预期行为,是命令参数组合与容器流连接处理逻辑共同作用的结果。
原因分析
你执行的命令包含三个会触发该现象的关键参数:
-it:开启TTY交互并绑定标准输入输出,kubectl会默认attach到容器的流通道,实时同步输入输出--restart=Never:容器内python进程退出后,Pod不会被重建,直接进入Completed终态--rm:Pod进入终态后会被kubelet立刻清理删除
当你输入exit()退出python会话后,容器进程终止,Pod进入Completed状态并被立刻删除,API服务器和容器之间的流连接被直接中断,没有给kubectl客户端发送正常的断开通知,因此kubectl进程会一直处于等待流数据的挂起状态。你按下回车时,kubectl尝试向已断开的连接发送数据,才会感知到连接异常,抛出EOF错误后退出。
当你将参数改为--restart=Always时,python进程退出后kubelet会立刻重启容器,kubectl的attach连接会被自动重定向到新启动的容器,不会出现连接被直接中断的情况,因此不会出现挂起问题。
规避方案
如果需要保留--restart=Never --rm的配置,可通过两种方式避免终端挂起:
- 退出python会话时不输入
exit(),直接按Ctrl+D发送EOF信号,kubectl客户端可提前感知到流结束,正常退出 - 执行run命令时额外添加
--pod-running-timeout=2s参数,让客户端在Pod停止运行后最多等待2秒就自动退出
内容的提问来源于stack exchange,提问作者shany
相关产品推荐
相关产品推荐

