运行Python脚本时遇Exit Code 0的CrashLoopBackOff问题
Python脚本在Kubernetes中执行后触发CrashLoopBackOff的解决办法
问题背景
我有个极简Python脚本,就一行打印语句:
print("Completed")
用Docker打包后,通过Deployment部署到Kubernetes,结果脚本正常执行完(退出码0),Pod却不停重启,最后进入CrashLoopBackOff状态,而不是停在Completed状态。
用到的配置文件
Dockerfile
FROM python:3.9 WORKDIR /app COPY Test.py /app/Test.py RUN python3 -m pip install --upgrade pip ENTRYPOINT ["python"] CMD ["Test.py"]
原Deployment YAML
apiVersion: apps/v1 kind: Deployment metadata: name: test-01 spec: replicas: 1 selector: matchLabels: bb: web template: metadata: labels: bb: web spec: containers: - name: test-01 image: testrepo/testingpy:latest
实际现象
Pod启动后正常执行脚本,输出Completed后退出,退出码是0(正常完成),但Kubernetes会反复重启它,最终Pod状态变成CrashLoopBackOff:
State: Waiting Reason: CrashLoopBackOff Last State: Terminated Reason: Completed Exit Code: 0
查看日志只有脚本的打印内容:
kubectl logs etl-patient-c5d44fcc-scc9s --all-containers Completed
试过没用的操作
- 在Deployment的YAML里加
restartPolicy: OnFailure,部署直接报错 - 换了几个Python版本,结果一模一样
注:YAML实际缩进没问题,只是显示的时候格式乱了。
解决办法
问题根源
Deployment是用来部署长期运行的服务的,它的Pod模板默认restartPolicy: Always——不管容器是正常退出还是异常退出,只要终止了就会重启。你的脚本是一次性任务,执行完就退出,自然会被反复重启,次数多了就触发CrashLoopBackOff。
正确的资源选择:用Job代替Deployment
Kubernetes里的Job资源就是专门用来跑一次性任务的,任务完成后Pod会保持Completed状态,不会被重启。
示例Job YAML
apiVersion: batch/v1 kind: Job metadata: name: test-job-01 spec: template: metadata: labels: bb: web spec: containers: - name: test-01 image: testrepo/testingpy:latest restartPolicy: OnFailure # 只在容器异常退出(非0码)时重启,也可以设为Never backoffLimit: 4 # 失败后的重试次数,按需调整
为什么加restartPolicy到Deployment会报错?
Deployment属于长期运行的负载类型,Kubernetes强制要求它的Pod模板restartPolicy必须是Always,不允许改成OnFailure或Never,这就是你之前部署报错的原因。只有Job、CronJob这类批处理资源才能设置其他重启策略。
内容的提问来源于stack exchange,提问作者Adithya
相关产品推荐
相关产品推荐

