我读过在K8s集群中周期性运行任务的各种方法,但似乎没有一种方法能很好地适用于这个特定的情况。我有一个部署“my-depl”,它可以运行任意数量的pod,任务需要在每个pod中周期性地执行(基本上是一个shell命令,大约每周“轻推”主应用程序一次)。
Kubernetes Cronjob功能在它自己的容器中启动一个任务。这个K8s任务不知道当前有多少pod在为“my-depl”运行,并且不能在这些pod中运行任何东西。可以想象,我可以在这个K8s Cronjob中运行kubectl,但是这看起来非常的笨拙和危险。
第二种选择是让crond(或者像Jobber或Cronenberg这样的替代工具)作为pod的一部分运行,但这意味着两个进程正在运行,如果cron进程停止运行,容器可能不会停止运行。
第三种选择是通过一个特殊的init进程(如s6-overlay)来运行多进程容器,如果一个子进程死亡,可以使其死亡,但这似乎相当复杂,几乎不是一个一流的特性。
我能想到的第四个选择是“不要这样做,这很愚蠢。重新设计你的应用程序,这样它就不需要每周被”轻推“一次”。这是一个合理的建议,但有很多工作要做,我至少需要一个临时的解决方案。
那么,有没有人有比这里详细介绍的更好的想法?
1条答案
按热度按时间odopli941#
我认为最简单的解决方案是在sidecar容器(即同一pod中的另一个容器)中运行
crond
(或您选择的替代方案),请记住,pod中的所有容器共享相同的网络名称空间,因此localhost
对于所有容器都是相同的。这意味着您的cron容器可以很高兴地运行
curl
或wget
命令(或任何其他必要的命令)来通过本地端口ping您的API。例如,类似于下面这样,我们的cron任务只是针对
api
容器中运行的Web服务器运行wget
: