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
排查方向建议
媒体文件路由配置检查:
- 确认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服务名称无关。
- 确认Django的urls.py中是否配置了媒体文件的路由,debug模式下需要添加:
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或站点配置文件,确认包含上述反向代理规则。
- 确保Nginx配置中,
媒体文件存储与权限检查:
- 执行
kubectl exec -it <django-pod-name> -- ls -l /app/media,确认Django容器内/app/media目录存在且有读写权限。 - 若为用户上传的图片,确认文件实际存储在该目录下;若为静态媒体文件,确认构建Docker镜像时已将文件复制到
MEDIA_ROOT路径。
- 执行
网络连通性验证:
- 在Nginx容器内测试访问Django服务:
kubectl exec -it <nginx-pod-name> -- curl http://django-service:8000/media/<test-image-name.jpg>,检查返回是否正常。
- 在Nginx容器内测试访问Django服务:
内容的提问来源于stack exchange,提问作者Ash C
相关产品推荐
相关产品推荐

