添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在pod中执行python脚本时,kubernetes pod崩溃回退。

0 人关注

我想让一个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 describe 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
  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
    
2 个评论
你能分享一下这个命令的输出吗?"kubectl describe pod createinterval"
@Vipul Sharda 我添加了kubectl describe pod createinterval的输出。
python
docker
kubernetes
JaeWoo So
JaeWoo So
发布于 2022-09-05
2 个回答
David Maze
David Maze
发布于 2022-09-05
已采纳
0 人赞同

在你的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就会进入Evicted状态而不能被替换。 对于你的使用情况,你需要一个CronJob对于一个更典型的长期运行的服务器应用程序,你通常需要一个Deployment.

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

这些文件分别覆盖了你的Docker文件中的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挂载将得到一个不同的目录,而原始卷的内容将...也许不会 "丢失"per se,但 "放错了地方"。 同样,你几乎永远不会想使用hostPath卷。

...创建一个在Kubernetes中间隔运行的文件。

你可能想重新考虑一下这个设置。 在Kubernetes中,"文件 "变成了令人惊讶的难以管理的东西。 如果你看一下列表中的Types of Volumes更确切地说,在PersistentVolume中的表Volume Mode文档,你会注意到,注意到比较容易得到的卷类型只支持ReadWriteOnce访问;这通常意味着你不能用同一个卷来复制你的应用程序pod或这个cron job和你的应用程序在同一时间。 (从技术上讲,它可以要求所有的副本都被安排在同一个节点上,但它们可能不适合在那里,而且你经常想防止单节点故障)。

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

TAM
TAM
发布于 2022-09-05
0 人赞同
  • 你不需要在你的Pod的清单中传递 command args 。你已经在你的 Dockerfile 中定义了这些。

  • 关于在K8s中运行 CronJobs ,请查看这个官方的 doc

  •