Kubernetes 成功显示 Cron 作业但未获得预期结果

问题描述

当我在 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),它具有单独的文件系统和挂载选项。

如果您想实现此方案,您必须将 PVCReadWriteMany 结合使用,多个容器 (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 的卷)。