You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes(Minikube)中Django后端无法向前端返回图片的问题求助

问题排查:K8s中Django后端无法返回图片资源

我在Kubernetes(Minikube)中部署了三个Docker容器:React前端、Django后端、用于提供前端静态文件的Nginx。通过minikube service my-service访问Nginx站点时,后端能返回其他所有数据,但图片无法正常加载,求协助排查。

当前配置信息

Django相关配置

  • debug模式已设为true
  • settings.py中的媒体文件配置:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR , "/app/media")
  • 疑问:我的Django服务名称是django-service,是否需要修改settings.py中的以下配置为django-service?
ROOT_URLCONF = 'backend.urls'

WSGI_APPLICATION = 'backend.wsgi.application'

entrypoint.sh内容

#!/bin/sh

gunicorn backend.wsgi:application --bind 0.0.0.0:8000

Kubernetes部署资源配置

# Django Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: django-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: django-app
  template:
    metadata:
      labels:
        app: django-app
    spec:
      containers:
      - name: django-container
        image: ash414/e-cart-backend:v1.0
        ports:
        - containerPort: 8000

# Django Service
apiVersion: v1
kind: Service
metadata:
  name: django-service
  labels:
    app: django-app
spec:
  selector:
    app: django-app
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000

# Nginx Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
  labels:
    app: nginx-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-app
  template:
    metadata:
      labels:
        app: nginx-app
    spec:
      containers:
      - name: nginx-container
        # Not working images
        # image: e-cart-nginx:latest
        # image: ash414/e-cart-nginx:v1.0v
        # image: ash414/e-cart-nginx-dj4:v1.0
        image: ash414/nginx-app4:v1.0
        ports:
        - containerPort: 80

# Nginx Service
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx-app
spec:
  selector:
    app: nginx-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

# NodePort Service
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: nginx-app
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30007

排查方向建议

  1. 媒体文件路由配置检查:

    • 确认Django的urls.py中是否配置了媒体文件的路由,debug模式下需要添加:
      from django.conf import settings
      from django.conf.urls.static import static
      
      urlpatterns = [
          # 其他路由
      ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
      
    • 不需要修改ROOT_URLCONF和WSGI_APPLICATION为服务名称,这两个配置是指向Django项目的路由和WSGI入口,和K8s服务名称无关。
  2. Nginx反向代理配置检查:

    • 确保Nginx配置中,/media/路径的请求被转发到Django服务django-service:8000,示例配置片段:
      location /media/ {
          proxy_pass http://django-service:8000;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
      }
      
    • 检查当前使用的Nginx镜像内的nginx.conf或站点配置文件,确认包含上述反向代理规则。
  3. 媒体文件存储与权限检查:

    • 执行kubectl exec -it <django-pod-name> -- ls -l /app/media,确认Django容器内/app/media目录存在且有读写权限。
    • 若为用户上传的图片,确认文件实际存储在该目录下;若为静态媒体文件,确认构建Docker镜像时已将文件复制到MEDIA_ROOT路径。
  4. 网络连通性验证:

    • 在Nginx容器内测试访问Django服务:kubectl exec -it <nginx-pod-name> -- curl http://django-service:8000/media/<test-image-name.jpg>,检查返回是否正常。

内容的提问来源于stack exchange,提问作者Ash C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:12:48