如何在 openshift 3 上使用 django 运行 celery
how to run celery with django on openshift 3
在我的 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 "job" 是否适用于此?或者更好地使用 powershift 图像 (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
非常感谢您的帮助。谢谢
我已经设法让它工作了,尽管我对它不太满意。我很快就会转向 postgreSQL 数据库。这是我所做的:
wsgi_mod-express 有一个名为 service-script 的选项,它会启动除实际应用程序之外的附加进程。所以我更新了我的 app.sh:
#!/bin/bash
ARGS=""
ARGS="$ARGS --log-to-terminal"
ARGS="$ARGS --port 8080"
ARGS="$ARGS --url-alias /static wsgi/static"
ARGS="$ARGS --service-script celery_starter scripts/startCelery.py"
exec mod_wsgi-express start-server $ARGS wsgi/application
注意最后一行 ARGS=... 行。
我创建了一个 python 脚本来启动我的 celery worker 并击败它。
startCelery.py:
import subprocess
OPENSHIFT_REPO_DIR="/opt/app-root/src"
OPENSHIFT_DATA_DIR="/opt/app-root/src/data"
pathToManagePy=OPENSHIFT_REPO_DIR + "/wsgi/podpub"
worker_cmd = [
"python",
pathToManagePy + "/manage.py",
"celery",
"worker",
"--pidfile="+OPENSHIFT_REPO_DIR+"/%n.pid",
"--logfile="+OPENSHIFT_DATA_DIR+"/celery/log/%n.log",
"-c 1",
"--autoreload"
]
print(worker_cmd)
subprocess.Popen(worker_cmd, close_fds=True)
beat_cmd = [
"python",
pathToManagePy + "/manage.py",
"celery",
"beat",
"--pidfile="+OPENSHIFT_REPO_DIR+"/celeryd.pid",
"--logfile="+OPENSHIFT_DATA_DIR+"/celery/log/celeryd.log",
]
print(beat_cmd)
subprocess.Popen(beat_cmd)
这确实有效,但当我尝试启动 celery worker 时,我不断收到一条消息说
“运行 当工作人员接受用 pickle 序列化的消息时拥有超级用户权限的工作人员是一个非常糟糕的主意!
如果你真的想继续,那么你必须设置 C_FORCE_ROOT 环境变量(但请在做之前考虑一下)。"
尽管我将这些配置添加到我的 settings.py 中以删除 pickle 序列化程序,但它一直给我同样的错误消息。
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACEEPT_CONTENT = ['json']
我不知道为什么。
最后,我将 C_FORCE_ROOT 添加到我的 .s2i/enviroment
C_FORCE_ROOT=true
现在可以用了,至少我是这么认为的。我的下一份工作将在几个小时后 运行。我仍然愿意接受任何进一步的建议和建议。
在我的 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 "job" 是否适用于此?或者更好地使用 powershift 图像 (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
非常感谢您的帮助。谢谢
我已经设法让它工作了,尽管我对它不太满意。我很快就会转向 postgreSQL 数据库。这是我所做的:
wsgi_mod-express 有一个名为 service-script 的选项,它会启动除实际应用程序之外的附加进程。所以我更新了我的 app.sh:
#!/bin/bash
ARGS=""
ARGS="$ARGS --log-to-terminal"
ARGS="$ARGS --port 8080"
ARGS="$ARGS --url-alias /static wsgi/static"
ARGS="$ARGS --service-script celery_starter scripts/startCelery.py"
exec mod_wsgi-express start-server $ARGS wsgi/application
注意最后一行 ARGS=... 行。
我创建了一个 python 脚本来启动我的 celery worker 并击败它。 startCelery.py:
import subprocess
OPENSHIFT_REPO_DIR="/opt/app-root/src"
OPENSHIFT_DATA_DIR="/opt/app-root/src/data"
pathToManagePy=OPENSHIFT_REPO_DIR + "/wsgi/podpub"
worker_cmd = [
"python",
pathToManagePy + "/manage.py",
"celery",
"worker",
"--pidfile="+OPENSHIFT_REPO_DIR+"/%n.pid",
"--logfile="+OPENSHIFT_DATA_DIR+"/celery/log/%n.log",
"-c 1",
"--autoreload"
]
print(worker_cmd)
subprocess.Popen(worker_cmd, close_fds=True)
beat_cmd = [
"python",
pathToManagePy + "/manage.py",
"celery",
"beat",
"--pidfile="+OPENSHIFT_REPO_DIR+"/celeryd.pid",
"--logfile="+OPENSHIFT_DATA_DIR+"/celery/log/celeryd.log",
]
print(beat_cmd)
subprocess.Popen(beat_cmd)
这确实有效,但当我尝试启动 celery worker 时,我不断收到一条消息说 “运行 当工作人员接受用 pickle 序列化的消息时拥有超级用户权限的工作人员是一个非常糟糕的主意! 如果你真的想继续,那么你必须设置 C_FORCE_ROOT 环境变量(但请在做之前考虑一下)。"
尽管我将这些配置添加到我的 settings.py 中以删除 pickle 序列化程序,但它一直给我同样的错误消息。
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACEEPT_CONTENT = ['json']
我不知道为什么。 最后,我将 C_FORCE_ROOT 添加到我的 .s2i/enviroment
C_FORCE_ROOT=true
现在可以用了,至少我是这么认为的。我的下一份工作将在几个小时后 运行。我仍然愿意接受任何进一步的建议和建议。