【发布时间】:2021-12-22 08:46:02
【问题描述】:
我在 K8s 集群上部署了一个 Django 应用程序。我需要发送一些电子邮件(一些是预定的,其他应该异步发送),我的想法是将这些电子邮件委托给 Celery。
所以我在集群上设置了一个 Redis 服务器(带有 Sentinel),并为 Celery worker 部署了一个实例,为 Celery beat 部署了另一个实例。
用于部署 Celery worker 的 k8s 对象与用于 Django 应用程序的对象非常相似。主要区别在于 celery worker 上引入的命令:['celery', '-A', 'saleor', 'worker', '-l', 'INFO']
发送预定的电子邮件没有问题(celery worker 和 celery beat 在连接到 Redis 服务器时没有任何问题)。但是,异步电子邮件 - 由 Django 应用程序“委托” - 不会发送,因为无法连接到 Redis 服务器 (ERROR celery.backends.redis Connection to Redis lost: Retry (1/20) in 1.00 second. [PID:7:uWSGIWorker1Core0])
错误 1:
socket.gaierror: [Errno -5] No address associated with hostname
错误 2:
redis.exceptions.ConnectionError: Error -5 connecting to redis:6379. No address associated with hostname.
Redis 服务器、Celery worker 和 Celery beat 位于“redis”命名空间中,而其他事物(包括 Django 应用程序)位于“development”命名空间中。
这是我定义的变量:
- name: CELERY_PASSWORD
valueFrom:
secretKeyRef:
name: redis-password
key: redis_password
- name: CELERY_BROKER_URL
value: redis://:$(CELERY_PASSWORD)@redis:6379/1
- name: CELERY_RESULT_BACKEND
value: redis://:$(CELERY_PASSWORD)@redis:6379/1
我也尝试定义CELERY_BACKEND_URL(与CELERY_RESULT_BACKEND具有相同的值),但没有任何区别。
无法连接到 Redis 服务器的原因可能是什么?我是否缺少任何变量?可能是因为 pod 位于不同的命名空间中?
谢谢!
【问题讨论】:
-
这是一个正确的变体,还是您对您的问题进行了更改 -
value: redis://:$(CELERY_PASSWORD)@redis:6379/1?如果它是原创的,那么我有两个问题。为什么//后面有冒号,用户在哪里?通常的形式是redis://user:pass@host:port -
我看过一堆设置 Redis 和 Celery 的教程,但我真的无法告诉你为什么我有这样的 atm。但这是ConnectionPool() class of redis 上的示例。尽管如此,celery worker 和 celery beat pod 连接到 Redis 没有问题(日志说它们连接到
redis://:**@redis:6379/1)。我真的认为将 Django 应用程序放在另一个命名空间中才是真正的问题。 -
默认情况下,Pod 可以通过 IP 地址相互通信,无论它们位于哪个命名空间。
-
将 Redis 服务器更改为与 Django 应用程序相同的命名空间 ????♀️ @AndrewSkorkin
标签: django kubernetes redis celery