Django + Gunicorn + Kubernetes:新部署后网站宕机几分钟

Django + Gunicorn + Kubernetes:新部署后网站宕机几分钟

我在使用 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

答案2

所以最终的结果是,django-storages出于某种原因调用的库在启动时会遍历所有媒体文件。我们有 80GB 的数据,循环遍历整个 S3 存储桶导致了这种延迟。

我们升级了库,错误立即停止了。希望这能对将来的某些人有所帮助。

相关内容