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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:25:05