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

如何在本地Minikube集群中创建PVC以持久化FastAPI日志

解决FastAPI服务日志持久化问题(Kubernetes PV/PVC实现)

步骤1:调整应用代码与Docker配置

首先需要修改日志存储路径到专门目录,并确保容器内存在该目录:

  1. 修改app/main.py的日志路径:
    将日志文件路径改为容器内的/logs/my.log,避免和应用代码目录混在一起:

    import logging
    
    from fastapi import FastAPI
    
    logging.basicConfig(filename="/logs/my.log",  # 修改为/logs目录下的文件
                        level=logging.DEBUG,
                        format="%(asctime)s [%(levelname)s] %(message)s")
    app = FastAPI()
    
    
    @app.get("/")
    def read_root():
        logging.info("Inside the `read_root` function.")
        return {"Hello": "World"}
    
    
    @app.get("/item/{item_id}")
    def read_item(item_id: int):
        item_message = "This is the item message."
        logging.info(f"The item_id is the following: {item_id}")
        return {"item_id": item_id, "item_message": item_message}
    
  2. 更新Dockerfile创建日志目录:
    在Dockerfile中添加RUN mkdir /logs,确保容器启动时该目录存在:

    FROM python:3.9-alpine
    
    WORKDIR /code
    
    RUN mkdir /logs  # 创建日志存储目录
    
    COPY ./requirements.txt /code/requirements.txt
    RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
    
    COPY ./app /code/app
    
    CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
    
  3. 重新构建并加载镜像到Minikube:

    # 构建新版本镜像
    docker build -t fastapi-log:v2 .
    # 将镜像加载到Minikube集群
    minikube image load fastapi-log:v2
    

步骤2:创建Persistent Volume(PV)

使用hostPath类型的PV(适合本地Minikube环境),将Minikube节点的本地目录映射为PV:

创建pv-log.yaml文件:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: log-pv
spec:
  capacity:
    storage: 1Gi  # 按需调整存储大小
  accessModes:
    - ReadWriteOnce  # 单节点读写
  hostPath:
    path: "/data/logs"  # Minikube节点上的存储路径
    type: DirectoryOrCreate  # 目录不存在则自动创建

执行命令创建PV:

kubectl apply -f pv-log.yaml

验证PV状态:

kubectl get pv log-pv

步骤3:创建Persistent Volume Claim(PVC)

PVC用于申请PV资源,需要和PV的访问模式、存储需求匹配:

创建pvc-log.yaml文件:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: log-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi  # 需小于等于PV的容量

执行命令创建PVC:

kubectl apply -f pvc-log.yaml

验证PVC是否绑定成功:

kubectl get pvc log-pvc

步骤4:更新Deployment挂载PVC

修改Deployment配置,将PVC挂载到容器的/logs目录:

假设原Deployment文件为fastapi-deployment.yaml,更新后的内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fastapi-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fastapi
  template:
    metadata:
      labels:
        app: fastapi
    spec:
      containers:
      - name: fastapi-container
        image: fastapi-log:v2  # 使用新版本镜像
        ports:
        - containerPort: 8000
        volumeMounts:
        - name: log-volume
          mountPath: /logs  # 挂载到容器内的日志目录
      volumes:
      - name: log-volume
        persistentVolumeClaim:
          claimName: log-pvc  # 引用创建的PVC

执行命令更新Deployment:

kubectl apply -f fastapi-deployment.yaml

步骤5:验证日志持久化效果

  1. 访问服务生成日志:

    # 获取Service的访问地址
    minikube service <你的服务名称> --url
    # 访问接口生成日志
    curl $(minikube service <你的服务名称> --url)/
    curl $(minikube service <你的服务名称> --url)/item/123
    
  2. 删除当前Pod:

    kubectl delete pod $(kubectl get pods -l app=fastapi -o jsonpath="{.items[0].metadata.name}")
    
  3. 新Pod启动后,查看日志文件:

    # 进入新Pod查看日志
    kubectl exec -it $(kubectl get pods -l app=fastapi -o jsonpath="{.items[0].metadata.name}") -- cat /logs/my.log
    # 或者直接在Minikube节点查看宿主机上的日志
    minikube ssh -- cat /data/logs/my.log
    

此时应该能看到Pod删除前生成的日志记录,说明日志已成功持久化。

内容的提问来源于stack exchange,提问作者Péter Szilvási

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:13:14