部署在GCP K8s中的FastAPI应用出现502错误及重启问题排查
问题排查与配置修正建议
结合你提供的配置文件和问题描述,以下是导致应用反复重启、存活探针持续调用的核心配置错误及优化方案:
一、Dockerfile 关键错误
1. 工作目录语法错误
你的WORKDIR命令存在语法问题,无法正确设置容器内工作路径:
# 错误写法 WORKDIR .app work directory for code
修正为合法路径定义:
WORKDIR /app
路径错误会导致后续代码复制、模块导入混乱,直接引发应用启动失败。
2. COPY 命令路径错误与冗余
COPY . app:应改为COPY . /app,确保本地代码复制到容器的/app目录(配合正确WORKDIR);COPY poetry.lock pyproject.toml:缺少目标路径,修正为COPY poetry.lock pyproject.toml ./;- 删除重复的
COPY pyproject.toml pyproject.toml冗余命令。
3. 虚拟环境未全局生效
你创建了虚拟环境,但仅在单个RUN命令中临时激活,后续CMD不会使用该环境(每个RUN是独立Shell进程)。需将虚拟环境路径加入系统全局PATH:
ENV PATH="/opt/venv/bin:/root/.poetry/bin:$PATH"
否则CMD中的uvicorn会调用系统级Python,导致依赖缺失、应用启动不稳定。
4. PYTHONPATH 路径不匹配
ENV PYTHONPATH="${PYTHONPATH}:/appstuff"中的路径与代码实际存放路径不符,修正为:
ENV PYTHONPATH="${PYTHONPATH}:/app"
路径错误会导致应用无法导入模块,引发启动异常。
二、Deployment 配置优化
1. 存活探针配置不完整
当前仅设置initialDelaySeconds,缺少调用周期、失败阈值等关键参数,且未配置就绪探针。补充完整配置:
livenessProbe: httpGet: path: /alive port: 80 initialDelaySeconds: 120 periodSeconds: 30 failureThreshold: 3 successThreshold: 1 readinessProbe: httpGet: path: /alive port: 80 initialDelaySeconds: 60 periodSeconds: 10
就绪探针可确保应用真正就绪后再接收流量,避免未就绪状态下的异常。
2. 启动命令冗余
Deployment中command和args重复了Dockerfile的CMD内容,建议保持配置一致性:要么在Dockerfile中定义完整启动命令,要么在Deployment中覆盖,避免维护混乱。
三、额外排查方向
- 检查ConfigMap的
envConfig是否包含应用必需的环境变量(如数据库连接信息),缺失关键变量会导致应用启动后崩溃或卡住; - 通过
kubectl logs <pod-name> --previous查看容器上一次退出的日志,获取具体崩溃原因。
内容的提问来源于stack exchange,提问作者GustaMan9000
相关产品推荐
相关产品推荐

