Kubernetes部署Python网站关键在于三件事:容器必须监听0.0.0.0而非127.0.0.1,Deployment需配置resources和readinessProbe(如/healthz端点、initialDelaySeconds≥15),Service的selector必须与Pod labels逐字完全匹配,任一缺失都将导致流量无法到达。

直接说结论:Kubernetes 部署 Python 网站,不是“把 Flask/FastAPI 丢进去就行”,关键在于三件事——容器镜像必须暴露正确端口并监听 0.0.0.0,Deployment 要配好资源请求和就绪探针,Service 必须匹配 Pod 的 containerPort 和标签选择器。漏掉任一环,服务就收不到流量。
Python Web 应用必须监听 0.0.0.0,不能只写 127.0.0.1
这是最常踩的坑。本地开发时用 flask run --host=127.0.0.1 或 FastAPI 默认的 uvicorn main:app(它默认只绑 127.0.0.1),在容器里会直接导致 Service 流量进不来,Pod 状态可能是 Running,但 kubectl logs 看不到请求,curl 也超时。
实操建议:
- Flask:启动命令必须显式指定
--host=0.0.0.0 --port=5000,例如flask run --host=0.0.0.0 --port=5000 - FastAPI:用
uvicorn main:app --host 0.0.0.0 --port 8000,注意是空格分隔,不是等号 - Dockerfile 中的
EXPOSE只是声明,不强制生效;真正起作用的是 CMD 启动时的绑定地址 - 可在容器内验证:
kubectl exec -it <pod-name> -- netstat -tuln | grep :5000,应看到*:5000而非127.0.0.1:5000
Deployment 的 readinessProbe 不能省,尤其对 Web 服务
没有就绪探针,Kubernetes 会在应用刚启动、还没完成初始化(比如数据库连接、配置加载)时,就把流量转发过去,结果返回 502 或连接拒绝。用户看到的就是“服务部署成功但打不开”。
立即学习“Python免费学习笔记(深入)”;
实操建议:
- 用 HTTP 探针最稳妥,路径设为健康检查端点(如
/healthz或根路径),不要用 TCP 探针——它只确认端口通,不确认应用就绪 - 初始延迟
initialDelaySeconds至少设为 10–15 秒,给 Python 应用冷启动留足时间(特别是带 ORM 或大模型加载的) - 失败阈值
failureThreshold建议 ≥3,避免因短暂 GC 或日志刷屏误判 - 示例片段:
readinessProbe: httpGet: path: /healthz port: 8000 initialDelaySeconds: 15 periodSeconds: 10
Service 的 selector 必须和 Deployment 的 pod template labels 完全一致
这是 YAML 层最隐蔽的错误。哪怕只差一个空格或大小写,kubectl get endpoints 就会显示 <none>,意味着 Service 根本没关联到任何 Pod,所有请求都会 404 或 connection refused。
实操建议:
- 先确认 Deployment 中的
template.metadata.labels,例如:app: my-fastapi-app - 再检查 Service 的
spec.selector是否**逐字匹配**,包括引号、连字符、大小写——YAML 不自动 trim - 用命令快速验证:
kubectl get pods -l app=my-fastapi-app应列出对应 Pod;若为空,说明 label 没对上 - 别依赖
matchLabels外的字段(如 annotations)做路由,Service 只认 labels
Minikube 或 Docker Desktop 本地调试时,别忘了启用 ingress 插件
如果你用 NodePort 还能访问,但换成 Ingress 就 404,大概率是 Ingress Controller 没开。Minikube 默认不启用,Docker Desktop 的 Kubernetes 设置里也得手动勾选。
实操建议:
- Minikube:
minikube addons enable ingress,然后等nginx-ingress-controllerPod 变成 Running - Docker Desktop:打开 Settings → Kubernetes → 勾选 “Enable ingress controller”
- Ingress 资源里
spec.rules.host如果写了域名(如myapp.local),记得在本地/etc/hosts加一行127.0.0.1 myapp.local - 验证是否生效:
kubectl get ingress看 ADDRESS 是否有 IP;kubectl describe ingress查看 Events 有没有 “Successfully created”
真正卡住人的,往往不是写不出 YAML,而是 Pod 日志里没报错、kubectl get pods 显示 Running、kubectl get svc 看起来都正常——但流量就是不进来。这时候要一层层查:netstat 看端口绑定、kubectl get endpoints 看后端是否为空、kubectl describe pod 看 Events 里有没有 probe failure 或 FailedScheduling。K8s 的“正常”,有时只是表面正常。


















