在 Kubernetes 中部署 Python 应用时,配置存活探针(livenessProbe)是确保服务高可用的核心步骤。当应用进程死锁或陷入不可恢复状态时,探针能触发容器自动重启,无需人工干预。
核心要点:配置存活探针是防止应用死锁后无法自动恢复的关键手段,适用于大多数长运行 Python 服务。
- 适用场景:Web 服务、后台 Worker 或需要自动重启的长运行进程。
- 前置条件:Python 代码需暴露健康检查接口,且监听地址必须为 0.0.0.0。
- 验收标准:部署后观察 Pod 的 RESTARTS 计数和事件日志,确认探针生效且无误杀。
应用代码与镜像构建
探针检查依赖于应用内部的状态反馈。以 Flask 为例,需要提供一个轻量级的健康检查接口,并确保应用启动时监听所有网络接口。
1. Python 应用代码(app.py)
注意 host='0.0.0.0' 配置,若默认监听 localhost,Kubernetes 探针将无法连通。
from flask import Flask
app = Flask(__name__)
@app.route('/healthz')
def healthz():
# 此处可添加简单的逻辑检查,避免依赖数据库等外部重依赖
return 'OK', 200
if __name__ == '__main__':
# 必须绑定 0.0.0.0 允许外部访问
app.run(host='0.0.0.0', port=8080)
2. Dockerfile 示例
构建镜像时需确保暴露端口与代码监听端口一致。
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install `--no-cache-dir` -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["python", "app.py"]
Kubernetes 资源配置
以下是完整的 Deployment 配置示例。除了存活探针,建议同时配置资源限制(resources),防止容器因资源争抢导致探针超时。
apiVersion: apps/v1
kind: Deployment
metadata:
name: python-app
labels:
app: python-app
spec:
replicas: 2
selector:
matchLabels:
app: python-app
template:
metadata:
labels:
app: python-app
spec:
containers:
- name: app
image: your-registry/python-app:latest
ports:
- containerPort: 8080
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
关键参数说明:
initialDelaySeconds:容器启动后等待多久开始检查,需大于应用实际启动时间。timeoutSeconds:探针请求超时时间,若健康检查逻辑复杂需适当调大。resources:生产环境必须配置,避免节点负载高时探针因调度延迟而失败。
部署与验证
保存上述 YAML 为 deployment.yaml,执行以下命令部署并观察状态。
kubectl apply -f deployment.yaml
kubectl get pods -w
验证探针是否生效:
- 观察重启计数:使用
kubectl get pods查看 RESTARTS 列。若应用故意挂起,该数字应增加。 - 查看事件日志:使用
kubectl describe pod <pod-name>查看 Events 部分,应能看到Liveness probe failedfollowed byKilling container的记录。 - 本地模拟测试:可在代码健康接口中临时增加
time.sleep(10),模拟接口超时,验证探针是否触发重启。
常见问题与排查
- Connection Refused:通常因 Python 应用默认监听 127.0.0.1 导致。确认代码中包含
host='0.0.0.0'。 - CrashLoopBackOff:若
initialDelaySeconds设置过短,应用尚未启动完成即被探针杀死。需根据日志调整启动延迟时间。 - 探针误杀:若健康检查接口依赖数据库或外部 API,外部抖动可能导致探针失败。建议健康接口仅检查进程状态,或调大
failureThreshold。 - 资源不足导致超时:若容器 CPU 受限严重,探针请求可能无法及时处理。检查
resources.limits.cpu是否过低。