如何以最便宜、最简单的方式运行定期的Docker进程

74次阅读
没有评论

问题描述

有一个docker化的Python进程,希望每月一到两次运行。该进程调用多个Google APIs,并将结果存储在Google表格中。它不接受网络请求。用户希望提供一个”魔术按钮”,点击后会启动Docker容器,然后关闭所有内容。用户以前将此部署到AWS EC2微型实例中,通过Docker Cloud进行管理。但这种方式有两个问题:一是EC2实例(Docker主机)持续运行,无论Docker容器是否启动,造成了高额成本;二是Docker Cloud已于一个月前关闭。用户希望了解替代方案,Google和AWS Kubernetes服务是其中之一,但担心它们会对客户来说过于复杂。寻求建议。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1:使用AWS Fargate进行计划任务

AWS现在提供了Fargate,这是由他们管理的服务,而不是像ECS那样需要你管理服务器。Fargate基本上是”无服务器”的ECS。你可以使用CloudWatch定时事件,在Fargate ECS集群上按计划运行任务。因此,你只需要为你使用的资源付费。需要注意的是,Fargate的费用相对于在自己的EC2实例上运行的ECS要高得多,但如果你运行不频繁,你可能会看到一些小的节省。

方案2:自动化任务

另一种选择是类似的自动化方法。创建一个具有ASG支持的ECS集群,并根据ECS的需求调整其规模,然后使用CloudWatch来启动容器。ECS可以自动扩展,但这可能会有些棘手,因为这种方法通常是根据CloudWatch触发器自动扩展ECS集群的,所以你可能需要在CloudWatch中进行一些修改,可能还需要编写一个Lambda脚本,因为你并不是按照它的预期方式使用它。从成本效益上来看,这可能是最划算的方法,但在你的情况下,成本节省可能微不足道。

方案3:Heroku的容器注册表

如果你希望选择一个便宜的解决方案,你可以考虑使用Heroku的容器注册表。这是一个完全免费、易于使用和部署的选择。你甚至不需要使用Heroku CLI,只需将你的镜像通过docker push上传到registry.heroku.com并使用你的认证令牌。尽管可能不是最佳解决方案,但根据你的评论,我认为这对你来说应该足够了。你可以在这里找到一些可能的问题。

方案4:使用Zappa和Hug转换为AWS Lambda

你可以结合ZappaHug的强大功能,将你的代码转换为一个无服务器的AWS Lambda函数。只需在你的Python进程的主函数上添加一个装饰器即可。

import hug

@hug.get('/your_endpoint_name')
def your_function_name():
    """Here goes your code"""
    # ...
    return "Function finished successfully"

然后,你可以使用zappa deploy prod将其部署到AWS Lambda,并且每月只需调用返回的URL两次。

方案5:使用KubeSail进行定时任务

虽然通常情况下我会同意其他答案认为Kubernetes过于臃肿,但KubeSail尽可能地简化了它,以便使其易于运行类似你的任务。有一个免费的层次,应该可以让你无限期地运行你的作业。你只需使用GitHub登录,获取你的Kube配置,然后使用以下配置:

apiVersion: batch/v1
kind: Job
metadata:
  name: my-python-script
spec:
  template:
    spec:
      containers:
      - name: my-python-script
        image: asciimo/my-python-image

将上面的内容保存为my-job.yaml,将image: asciimo/my-python-image替换为你在DockerHub(或其他注册表)上的镜像名称,然后运行以下命令:

kubectl apply -f my-job.yaml

请注意,这种方式会根据CloudWatch触发器自动扩展ECS集群,但由于你在技术上没有按照预期的方式使用它,所以可能需要在CloudWatch中进行一些调整。从成本节约的角度来看,这可能是最划算的方法,但在你的情况下,成本节约可能微不足道。

以上是一些可以考虑的解决方案,你可以根据你的需求和客户的情况选择最适合的方法。

正文完