Kubernetes 如何部署 Python 应用并配置健康检查探针存活

文章导读
在 Kubernetes 中部署 Python 应用时,配置存活探针(livenessProbe)是确保服务高可用的核心步骤。当应用进程死锁或陷入不可恢复状态时,探针能触发容器自动重启,无需人工干预。
📋 目录
  1. 应用代码与镜像构建
  2. Kubernetes 资源配置
  3. 部署与验证
  4. 常见问题与排查
A A

在 Kubernetes 中部署 Python 应用时,配置存活探针(livenessProbe)是确保服务高可用的核心步骤。当应用进程死锁或陷入不可恢复状态时,探针能触发容器自动重启,无需人工干预。

核心要点:配置存活探针是防止应用死锁后无法自动恢复的关键手段,适用于大多数长运行 Python 服务。

  • 适用场景:Web 服务、后台 Worker 或需要自动重启的长运行进程。
  • 前置条件:Python 代码需暴露健康检查接口,且监听地址必须为 0.0.0.0。
  • 验收标准:部署后观察 Pod 的 RESTARTS 计数和事件日志,确认探针生效且无误杀。

应用代码与镜像构建

探针检查依赖于应用内部的状态反馈。以 Flask 为例,需要提供一个轻量级的健康检查接口,并确保应用启动时监听所有网络接口。

1. Python 应用代码(app.py)

Kubernetes 如何部署 Python 应用并配置健康检查探针存活

注意 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),防止容器因资源争抢导致探针超时。

Kubernetes 如何部署 Python 应用并配置健康检查探针存活
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

验证探针是否生效:

  1. 观察重启计数:使用 kubectl get pods 查看 RESTARTS 列。若应用故意挂起,该数字应增加。
  2. 查看事件日志:使用 kubectl describe pod <pod-name> 查看 Events 部分,应能看到 Liveness probe failed followed by Killing container 的记录。
  3. 本地模拟测试:可在代码健康接口中临时增加 time.sleep(10),模拟接口超时,验证探针是否触发重启。

常见问题与排查

  • Connection Refused:通常因 Python 应用默认监听 127.0.0.1 导致。确认代码中包含 host='0.0.0.0'
  • CrashLoopBackOff:initialDelaySeconds 设置过短,应用尚未启动完成即被探针杀死。需根据日志调整启动延迟时间。
  • 探针误杀:若健康检查接口依赖数据库或外部 API,外部抖动可能导致探针失败。建议健康接口仅检查进程状态,或调大 failureThreshold
  • 资源不足导致超时:若容器 CPU 受限严重,探针请求可能无法及时处理。检查 resources.limits.cpu 是否过低。