运行 安排工作的最佳方式是什么
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
我有一个包含两部分的项目:第一个是 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