当python脚本在pod中执行时,kubernetes pod崩溃loopbackoff



我想要一个Python脚本,它只需创建一个在Kubernetes中每隔一段时间运行的文件。首先,我使用了一个docker映像来一次性运行python脚本,但我遇到了一个错误。

create_txt.py

import numpy as np
import datetime
res = np.random.rand(1)[0]
res = np.round(res,3) * 1000
with open(f'/home/sjw/kube/{str(int(res))}.txt','w') as f:
txt = datetime.datetime.now().strftime("%H:%M:%S")
f.write(txt)

Dockerfile

FROM python:3
WORKDIR /home/sjw/kube
COPY create_txt.py ./
RUN pip install numpy
CMD ["python","./create_txt.py"]

首先,我将图片上传到Docker Hub。

下面是清单

apiVersion: v1
kind: Pod
metadata:
name: createinterval
spec:
containers:
- name: createinterval
image: idioluck/kube_create:v01
command: ["/bin/sh"]
args: ["python create_txt.py"]
volumeMounts:
- mountPath: /home/sjw/kube
name: testvol
volumes:
- name: testvol
hostPath:
path: /home/sjw/kube
type: DirectoryOrCreate

吊舱状态为

NAME              READY   STATUS             RESTARTS     AGE
createinterval    0/1     CrashLoopBackOff   7 (90s ago)   12m

最后,我想使用cronjob运行一个python脚本,该脚本定期创建一个文件,并将结果保存到连接的本地存储中。

**附加kubectl描述pod createinterval 的输出

sjw@DESKTOP-O6E7MND:~/kube/docker_sample/kube_create_txt_interval$ kubectl describe pod createinterval
Name:         createinterval
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Mon, 05 Sep 2022 16:42:24 +0900
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           172.17.0.4
IPs:
IP:  172.17.0.4
Containers:
createinterval:
Container ID:   docker://89d2fd4597e445bfd11dace1e06ab325572d2e3072d14df9892b31ebbc7fa7d1
Image:          idioluck/kube_create:v02
Image ID:       docker-pullable://idioluck/kube_create@sha256:0868e3dc569c88641a3db05adbf2be9387609f9a0d184869ac939e80b93af5bb
Port:           <none>
Host Port:      <none>
State:          Waiting
Reason:       CrashLoopBackOff
Last State:     Terminated
Reason:       Completed
Exit Code:    0
Started:      Mon, 05 Sep 2022 17:08:35 +0900
Finished:     Mon, 05 Sep 2022 17:08:35 +0900
Ready:          False
Restart Count:  10
Environment:    <none>
Mounts:
/home/sjw/kube from testvol (rw)
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5n28q (ro)
Conditions:
Type              Status
Initialized       True
Ready             False
ContainersReady   False
PodScheduled      True
Volumes:
testvol:
Type:          HostPath (bare host directory volume)
Path:          /home/sjw/kube
HostPathType:  DirectoryOrCreate
kube-api-access-5n28q:
Type:                    Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds:  3607
ConfigMapName:           kube-root-ca.crt
ConfigMapOptional:       <nil>
DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type     Reason     Age                   From               Message
----     ------     ----                  ----               -------
Normal   Scheduled  27m                   default-scheduler  Successfully assigned default/createinterval to minikube
Normal   Pulling    27m                   kubelet            Pulling image "idioluck/kube_create:v02"
Normal   Pulled     26m                   kubelet            Successfully pulled image "idioluck/kube_create:v02" in 4.633892322s
Normal   Created    25m (x5 over 26m)     kubelet            Created container createinterval
Normal   Started    25m (x5 over 26m)     kubelet            Started container createinterval
Normal   Pulled     25m (x4 over 26m)     kubelet            Container image "idioluck/kube_create:v02" already present on machine
Warning  BackOff    109s (x117 over 26m)  kubelet            Back-off restarting failed container

您的Kubernetes设置中存在几个重大问题;我会走过去的。你最终想要进入这样的设置

apiVersion: batch/v1
kind: CronJob
metadata:
name: createinterval
spec:
schedule: '* * * * *'
template:
metadata:
name: createinterval
spec:
containers:
- name: createinterval
image: idioluck/kube_create:v01
restartPolicy: OnFailure

在您的原始文件中:

apiVersion: v1
kind: Pod

你几乎从不想创建一个裸Pod。它们存在一些操作问题(例如,一旦创建,您就无法更改一个(,如果节点被过度委托,Pod可能会进入"已收回"状态,而不会被替换。对于您的用例,您需要一个CronJob;对于更典型的长时间运行的服务器应用程序,您通常需要部署。

command: ["/bin/sh"]
args: ["python create_txt.py"]

它们分别覆盖Dockerfile中的ENTRYPOINTCMD,我只想删除它们。这个特殊的构造被破坏了,这可能是错误的实际原因(尽管总是仔细检查pod的kubectl logs(:它会查找一个名为python create_txt.py的文件,该文件名中包含一个空格,然后尝试将该文件作为shell脚本执行。如果覆盖它,那么command: [python, create_txt.py]将是最简单的方法。

volumeMounts:
- mountPath: /home/sjw/kube
name: testvol

该目录也是映像的WORKDIR,这意味着卷装载将隐藏映像中的所有代码。您可能已经习惯了Docker命名卷的一个功能,即图像内容在首次使用时被复制到卷中;这在Kubernetes上不会发生(或者在更新镜像的情况下,在Docker中,或者在Docker绑定挂载时,或者…(,我会避免依赖这种功能。您应该删除此装载。

volumes:
- name: testvol
hostPath: { ... }

hostPath卷在pod恰好运行的任何节点上获取命名目录。如果在不同的节点上重新创建pod,hostPath装载将获得不同的目录,并且原始卷内容将是……可能不是";丢失">本身,但是";放错地方";。同样,您几乎从不希望使用hostPath卷。

。。。在Kubernetes中创建一个每隔一段时间运行的文件。

您可能需要重新考虑此设置"文件";事实证明,在Kubernetes中管理起来异常困难。如果你查看卷类型列表,更具体地说,查看PersistentVolume Volume Mode文档中的表,你会注意到,更容易获得的卷类型只支持ReadWriteOnce访问;这通常意味着您不能将同一卷同时用于应用程序pod或此cron作业和应用程序的多个副本。(从技术上讲,它可能要求所有副本都安排在同一个节点上,但它们可能不适合那里,而且您通常希望防止单节点故障。(

将此工作流程重组为";在数据库中创建记录";或";对一个特殊的后端端点进行HTTP调用";不会有这个问题。

  1. 您不需要在Pod的清单中传递commandargs。您已经在Dockerfile中定义了这些。

  2. 要在K8s中运行CronJobs,请查看此官方文档

  3. 请通过运行共享您的Pod日志

kubectl logs createinterval

最新更新