Django应用Kubernetes存活探针始终返回400错误求助
Kubernetes存活探针返回400错误的解决方法
我是Kubernetes新手,在配置应用健康检查时遇到问题:设置livenessProbe后始终返回400错误,但移除探针后,进入Pod执行curl 127.0.0.1/health能正常得到{"status": "ok"}。运行环境为本地Minikube主机。
以下是我的相关配置文件:
Dockerfile
FROM python:3.11 # setup env variables ENV PYTHONBUFFERED=1 ENV DockerHOME=/app/django-app # Expose port EXPOSE 8000 # create work dir RUN mkdir -p $DockerHOME # set work dir WORKDIR $DockerHOME # copy code to work dir COPY . $DockerHOME # install dependencies RUN pip install -r requirements.txt # move working dir to where manage.py is WORKDIR $DockerHOME/flag_games # set default command (I thinkk) ENTRYPOINT ["python"] # run commands for app to run CMD ["manage.py", "collectstatic", "--noinput"] CMD ["manage.py", "runserver", "localhost:8000"]
deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: flag-game-deployment labels: app: flag-game-deployment spec: replicas: 3 selector: matchLabels: app: flag-game-deployment template: metadata: labels: app: flag-game-deployment spec: containers: - image: docker-django imagePullPolicy: Never name: docker-django livenessProbe: httpGet: path: /health port: 8000 scheme: HTTP initialDelaySeconds: 5 periodSeconds: 5
构建步骤Makefile
minikube-deploy: make docker-build minikube start minikube image load $(IMAGE_NAME) kubectl apply -f "$(PWD)\manifests\deployment.yaml" kubectl expose deployment $(KUBE_DEPLOYMENT_NAME) --type=NodePort --port=8000 --dry-run=client -o yaml | kubectl apply -f -
健康检查代码(views.py & urls.py)
# views.py def health_check(request): # Perform any checks to determine the health of your application is_healthy = True # Return a JSON response with the health status if is_healthy: return JsonResponse({'status': 'ok'}, status=200) else: return JsonResponse({'status': 'error'}, status=503) # urls.py urlpatterns = [ path('', views.index, name='index'), path('world_flags/', include('world_flags.urls')), path('health', views.health_check), ]
问题原因与解决方案
1. 核心问题:Django服务仅监听localhost
你的Dockerfile中,runserver命令绑定的是localhost:8000,这意味着服务只接受容器内部127.0.0.1的请求。而Kubernetes的存活探针由Kubelet从容器外部IP发起请求,无法访问仅监听localhost的服务,因此返回400错误。
解决方法:将runserver的绑定地址改为0.0.0.0:8000,让服务监听容器内所有网卡:
CMD ["manage.py", "runserver", "0.0.0.0:8000"]
2. Dockerfile多CMD失效问题
Dockerfile中多个CMD仅最后一个生效,因此你的collectstatic命令实际未执行。若需在启动服务前执行该命令,可合并两个操作:
# 移除原ENTRYPOINT和CMD,替换为以下内容 CMD ["sh", "-c", "python manage.py collectstatic --noinput && python manage.py runserver 0.0.0.0:8000"]
3. 可选:URL路由规范调整
当前路由path('health', views.health_check)可匹配/health请求,但为了更规范,建议给路由添加结尾斜杠并同步调整探针路径:
- 修改urls.py:
path('health/', views.health_check), - 修改deployment.yaml探针配置:
path: /health/
完成以上修改后,重新构建镜像并部署,存活探针即可正常返回200状态码。
内容的提问来源于stack exchange,提问作者mike_gundy123
相关产品推荐
相关产品推荐

