kubernetes 运行Python脚本时遇到退出代码为0的CrashLoopBackOff

sqxo8psd  于 2023-06-21  发布在  Kubernetes
关注(0)|答案(1)|浏览(158)

我正在运行一个python脚本,它只有一个print语句。

print("Completed")

Python代码将使用Dockerfile和Deployment YAML文件部署在kubernetes上。
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"]

部署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将被创建,将成功运行,并显示终止的原因是因为它已完成,退出代码为0(在浏览pod的描述时)。

State:          Waiting
  Reason:       CrashLoopBackOff
Last State:     Terminated
  Reason:       Completed
  Exit Code:    0

几秒钟后,pod将进入CrashLoopBackOff警告状态,原因为“Back-off restarting failed container”。pod的日志仅在运行代码时出现任何打印语句或错误时才提供信息。

kubectl logs etl-patient-c5d44fcc-scc9s --all-containers   
Completed

kubernetes pod没有理由进入CrashLoopBackOff状态。pod必须执行脚本并保持完成状态。
尝试的更改。
1.尝试使用restartPolicy操作YAML文件:OnFailure,但在部署时引发错误。
1.尝试了不同的Python版本,也没有改变结果。
P.S YAML文件的缩进不可见,但YAML文件的缩进是正确的。

owfi6suc

owfi6suc1#

K8的DeploymentStatefulSetDaemonSet资源用于处理长时间运行的应用程序(例如后端、前端、微服务、Web服务器等),这就是为什么它只支持restartPolicyAlways。在您的例子中,Pod内运行的容器在运行print("Completed")语句后结束,而不是连续运行for。
你有三个选择
1.使用Job类型资源,而不是Deployment。K8s作业仅运行1次,即完成后完成。
1.使用简单的Pod资源,将restartPolicy设置为Never
1.添加一些额外的代码,以保持Python脚本在运行状态,如sleep,while循环或HTTP服务器(Flask,Django等)
查看这些链接以了解更多详情:

相关问题