问题描述
当我在 Kubernetes 中运行 cronjob 时,那个时候 cron 使我成功了 cron 但没有得到想要的结果
apiVersion: batch/v1beta1
kind: CronJob
Metadata:
name: {{ $.Values.appName }}
namespace: {{ $.Values.appName }}
spec:
schedule: "* * * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: test
image: image
command: ["/bin/bash"]
args: [ "test.sh" ]
restartPolicy: OnFailure
另外,我正在共享 test.sh
#!/bin/sh
rm -rf /tmp/*.*
echo "remove done"
cronjob 运行成功但是 当我检查容器时,文件没有被删除到 /tmp 目录
解决方法
Cronjob 在一个特定的容器中运行,如果您想从另一个容器中删除文件或目录,它将不起作用。
如果您的主容器在部署下运行,而当您的作业或 cronjob 被触发时,它会创建一个新容器 (POD),它具有单独的文件系统和挂载选项。
如果您想实现此方案,您必须将 PVC 与 ReadWriteMany 结合使用,多个容器 (POD) 可以与您的 强>单个 PVC 并共享文件系统。
通过这种方式,您的 cronjob 容器 (POD) 开始使用现有的 PVC 文件系统,您可以使用 job 或 cronjobs 删除目录。
将相同的 PVC 安装到 cronjob 容器和主容器,它就会工作。
,您需要将持久性卷附加到您正在使用的 pod 和 cronjob,以便它可以在脚本执行时删除所有文件。您需要在脚本中相应地安装和提供路径。要添加 kubernetes cronjobs,请通过此 link
,将 test.sh
更改为:
#!/bin/sh
set -e
rm -rf /tmp/*.*
echo "remove done"
如果没有 -e
,您的 bash 脚本将返回与上一个命令相同的状态。在这种情况下,它是一个 echo
,所以它的状态总是 0
(成功)。如果 set -e
命令失败,使用 rm
将使您的脚本中止并失败。
此外,如果没有任何卷挂载,这个 cron 作业不会做任何有意义的事情。如果您想从另一个容器中删除某些文件,则需要在该容器中使用 Cron(或具有带有 ReadWriteMany
的卷)。