运行 安排工作的最佳方式是什么

What is the best way to run a scheduled job

我有一个包含两部分的项目:第一个是 Flask Api,第二个是应该安排的脚本。 Flask 应用程序通过 运行 在 Openshift 中的 docker 图像提供。

我的问题是我应该在哪里安排第二个脚本。我可以访问 Gitlab CI/CD 但这并不是它的真正目的。 构建 docker 图像并 运行 在 Openshift 上安装它也是不可能的,因为如果 pods 大于 1,它将比需要的次数 运行 多。 我想到的唯一选择就是使用带有 cron 的常规服务器。

您有更好的解决方案吗?

谢谢

您的问题涉及多个方面,也有多种解决方法,我将简要介绍一下从哪里开始。

Python 方式

您可以部署一个 celery worker,它将处理计划的作业。您可以在 python 中查看有关如何解决它的芹菜文档:https://docs.celeryproject.org/en/latest/userguide/workers.html

您或许可以从 this article on dev.to 了解如何扩展部署以支持 celery,其中显示了 celery 的完整部署:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: celery-worker
  labels:
    deployment: celery-worker
spec:
  replicas: 1
  selector:
    matchLabels:
      pod: celery-worker
  template:
    metadata:
      labels:
        pod: celery-worker
    spec:
      containers:
        - name: celery-worker
          image: backend:11
          command: ["celery", "worker", "--app=backend.celery_app:app", "--loglevel=info"]
          env:
            - name: DJANGO_SETTINGS_MODULE
              value: 'backend.settings.minikube'

            - name: SECRET_KEY
              value: "my-secret-key"

            - name: POSTGRES_NAME
              value: postgres

            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: user

            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: password

Kubernetes 方式

在 Kubernetes 中(Openshift 是 Kubernetes 的一个发行版)——你可以创建一个 cronjob,它会按计划执行特定的任务,类似于这样:

kubectl run --generator=run-pod/v1 hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"

我从 Kubernetes docs.

中提取的

云途

您还可以使用无服务器平台,例如AWS Lambda 执行预定作业。 AWS Lambda 的妙处在于其免费套餐足以满足您的用例。

参见 AWS example code here