【问题标题】:How do I run a cron inside a kubernetes pod/container which has a running spring-boot application?如何在具有正在运行的 spring-boot 应用程序的 kubernetes pod/容器中运行 cron?
【发布时间】:2019-03-29 22:54:50
【问题描述】:

我有一个在容器上运行的 spring-boot 应用程序。其中一个 API 是文件上传 API,每次上传文件时都必须对其进行病毒扫描。我们有 uvscan 来扫描上传的文件。我正在考虑将 uvscan 添加到基本映像,但病毒定义需要每天更新。我创建了一个脚本来更新病毒定义。目前最简单的方法是在调用脚本的容器内运行一个 cron。有没有其他选择可以做到这一点? uvscan 实用程序是否可以与应用程序 pod 隔离并从应用程序调用?

【问题讨论】:

    标签: spring-boot docker kubernetes cron


    【解决方案1】:

    有很多方法可以解决这个问题。我希望,我可以帮助你找到最适合你的。

    从我的角度来看,拥有一个CronJob 会非常方便,它可以每天使用 uvscan 和更新的病毒定义数据库构建和推送新的 docker 映像。

    在您的文件处理序列中,您可以使用 Kubernetes API 创建扫描 Job,并为其提供对共享 volume 的访问权限以及您需要扫描的文件。

    扫描作业将使用:latestimage,如果新图像出现在注册表中,它将下载新图像并从中创建 pod。

    缺点是当您每天创建映像时,它会消耗“一些”磁盘空间,因此您可能需要发明从注册表和 Kubernetes 集群每个节点上的 docker 缓存中删除旧映像的过程。

    或者,您可以将 AV 数据库放在共享卷上或使用 Mount Propagation 并独立于 pod 进行更新。如果 uvscan 在read-only mode 中打开 AV 数据库,它应该是可能的。

    另一方面,将病毒定义加载到内存中通常需要时间,因此以Deployment 运行病毒扫描可能比在将新映像推送到注册表后每天重新启动的作业更好。

    【讨论】:

    • 感谢@VAS 的回答。我采用了另一种方法,已添加到此线程中。
    【解决方案2】:

    在我的工作地点,我们还在 EC2 实例中运行我们的 dockerized 服务。如果您只需要每天更新一次定义,我建议您使用 AWS Lamda 函数。它相对实惠,您无需担心调度程序的开销等。如果您在设置 Lambda 时需要帮助,我总是可以提供更多上下文。不过,我只是在 AWS 领域为您提供另一种解决方案。

    【讨论】:

      【解决方案3】:

      所以基本上我只是在容器内运行的应用程序中添加了一个 cron 来更新病毒定义。

      【讨论】:

        猜你喜欢
        • 2018-07-11
        • 2020-05-13
        • 2021-04-26
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 2021-09-08
        • 2019-08-01
        • 1970-01-01
        相关资源
        最近更新 更多