【发布时间】:2018-01-04 19:57:26
【问题描述】:
在我的 django pod 中启动 celery beat 和工作进程的最简单方法是什么?
我正在将我的 Openshift v2 Django 应用程序迁移到 Openshift v3。我正在使用 Pro 订阅。我真的是 Openshift v3 和 docker 以及容器和 kubernetes 的菜鸟。我已经使用本教程https://blog.openshift.com/migrating-django-applications-openshift-3/ 来迁移我的应用程序(效果很好)。
我现在正在努力研究如何开始芹菜。在 Openshift 2 上,我只使用了一个动作挂钩 post_start:
source $OPENSHIFT_HOMEDIR/python/virtenv/bin/activate
python $OPENSHIFT_REPO_DIR/wsgi/podpub/manage.py celery worker\
--pidfile="$OPENSHIFT_DATA_DIR/celery/run/%n.pid"\
--logfile="$OPENSHIFT_DATA_DIR/celery/log/%n.log"\
python $OPENSHIFT_REPO_DIR/wsgi/podpub/manage.py celery beat\
--pidfile="$OPENSHIFT_DATA_DIR/celery/run/celeryd.pid"\
--logfile="$OPENSHIFT_DATA_DIR/celery/log/celeryd.log" &
-c 1\
--autoreload &
这是一个非常简单的设置。它只是使用 django 数据库作为消息代理。没有rabbitMQ之类的。
会为此分配一个 openshift“工作”吗?还是更好地使用 powershift image (https://pypi.python.org/pypi/powershift-image) 操作命令?但我不明白如何执行它们。
这是我唯一的应用程序的当前部署配置“
apiVersion: v1
kind: DeploymentConfig
metadata:
annotations:
openshift.io/generated-by: OpenShiftNewApp
creationTimestamp: 2017-12-27T22:58:31Z
generation: 67
labels:
app: django
name: django
namespace: myproject
resourceVersion: "68466321"
selfLink: /oapi/v1/namespaces/myproject/deploymentconfigs/django
uid: 64600436-ab49-11e7-ab43-0601fd434256
spec:
replicas: 1
selector:
app: django
deploymentconfig: django
strategy:
activeDeadlineSeconds: 21600
recreateParams:
timeoutSeconds: 600
resources: {}
rollingParams:
intervalSeconds: 1
maxSurge: 25%
maxUnavailable: 25%
timeoutSeconds: 600
updatePeriodSeconds: 1
type: Recreate
template:
metadata:
annotations:
openshift.io/generated-by: OpenShiftNewApp
creationTimestamp: null
labels:
app: django
deploymentconfig: django
spec:
containers:
- image: docker-registry.default.svc:5000/myproject/django@sha256:6a0caac773acc65daad2e6ac87695f9f01ae3c99faba14536e0ec2b65088c808
imagePullPolicy: Always
name: django
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /opt/app-root/src/data
name: data
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: data
persistentVolumeClaim:
claimName: django-data
test: false
triggers:
- type: ConfigChange
- imageChangeParams:
automatic: true
containerNames:
- django
from:
kind: ImageStreamTag
name: django:latest
namespace: myproject
lastTriggeredImage: docker-registry.default.svc:5000/myproject/django@sha256:6a0caac773acc65daad2e6ac87695f9f01ae3c99faba14536e0ec2b65088c808
type: ImageChange
我正在使用 mod_wsgi-express,这是我的 app.sh
ARGS="$ARGS --log-to-terminal"
ARGS="$ARGS --port 8080"
ARGS="$ARGS --url-alias /static wsgi/static"
exec mod_wsgi-express start-server $ARGS wsgi/application
非常感谢您的帮助。谢谢
【问题讨论】:
-
最简单的可能是在启动脚本中有一个环境变量,检查它是否运行工作进程或节拍进程。然后有两个部署,一个用于工作人员,另一个用于设置环境变量以运行节拍进程。除了部署名称和环境变量之外,部署将是相同的。
-
感谢您的回答。但我认为我对 Openshift 的了解仍然太少,无法真正理解您的答案。您是否建议我在部署配置中添加更多容器?或者为 celery worker 和 beat 创建单独的部署配置/应用程序?如果我有单独的 celery 应用程序,它们将如何与我的 django 应用程序交互?我在持久存储上使用 sqlite 数据库。为了清楚起见,我添加了我的部署配置。
-
将持久卷与 SQLite 一起使用会使事情变得复杂,因为我期望您使用单独的数据库实例。您是否有理由不能使用 Django 和 Celery 都可以与之交互的单独的 PostgreSQL 数据库?
-
顺便说一句,您使用的是什么 WSGI 服务器?如果您使用的是 mod_wsgi-express,它有一个特性可以用来运行和管理 Celery 进程。这种方式都可以在一个容器中完成。如果您使用的是 mod_wsgi-express,请向我展示您当前用于启动它的
app.sh文件,然后我可以提出修改建议和其他操作。 -
其实我没有特别的理由需要使用 sqlite。我只是想对使用 sqlite 的 openshift v2 应用程序进行快速而肮脏的迁移。我愿意稍后转移到 postgreSQL 数据库。我将我的 app.sh 添加到帖子中
标签: django celery openshift openshift-3