我在使用 Django + Gunicorn + Kubernetes 时遇到了这个问题。
当我将新版本部署到 Kubernetes 时,2 个容器会使用我的当前映像启动。一旦 Kubernetes 将它们注册为就绪状态(因为日志显示 gunicorn 正在接收请求),网站就会停机几分钟。它只会超时大约 7-10 分钟,直到再次完全可用:
日志显示请求已进入并返回 200 个响应,但当我尝试通过浏览器打开网站时,它超时了。此外,AWS Route53 等健康检查器通知我,该网站几分钟内无法访问。
我尝试了很多方法,比如使用 gunicorn worker/threads 等等。但我就是无法让它在不停机的情况下切换到新的部署。
以下是我的配置(仅列出我认为相关的部分):
要求
django-cms==3.7.4 # https://pypi.org/project/django-cms/
django==2.2.16 # https://pypi.org/project/Django/
gevent==20.9.0 # https://pypi.org/project/gevent/
gunicorn==20.0.4 # https://pypi.org/project/gunicorn/
Gunicorn 配置
/usr/local/bin/gunicorn config.wsgi \
-b 0.0.0.0:5000 \
-w 1 \
--threads 3 \
--timeout 300 \
--graceful-timeout 300 \
--chdir=/app \
--access-logfile -
Kubernetes 配置
livenessProbe:
path: "/health/"
initialDelaySeconds: 60
timeoutSeconds: 600
scheme: "HTTP"
probeType: "httpGet"
readinessProbe:
path: "/health/"
initialDelaySeconds: 60
timeoutSeconds: 600
scheme: "HTTP"
probeType: "httpGet"
resources:
limits:
cpu: "3000m"
memory: 12000Mi
requests:
cpu: "3000m"
memory: 12000Mi
值得注意的是,代码库大约有 20K 行。在我看来,不是很大。此外,流量也不是很高,平均大约有 500-1000 个用户。
在基础设施方面,我使用以下 AWS 服务和相应的实例类型:
服务器实例(正在运行 3 个实例,为我的 Django 应用程序运行 2 个 pod)
m5a.xlarge(4 个 vCPU,16GB 内存)
数据库 (Amazon Aurora RDS)
db.r4.large(2 个 vCPU,16GB RAM)
Redis(ElastiCache)
cache.m3.xlarge(13.3GB内存)
ElasticSearch
m4.large.elasticsearch(2 个 vCPU,8GB RAM)
我很少在 Stack Overflow 上提问,因此如果您需要更多信息,请告诉我,我可以提供。
答案1
这可能与os.fchmod
AWS 中的行为有关。试试这个https://docs.gunicorn.org/en/stable/faq.html#how-do-i-avoid-gunicorn-excessively-blocking-in-os-fchmod
答案2
所以最终的结果是,django-storages
出于某种原因调用的库在启动时会遍历所有媒体文件。我们有 80GB 的数据,循环遍历整个 S3 存储桶导致了这种延迟。
我们升级了库,错误立即停止了。希望这能对将来的某些人有所帮助。