如何在本地Minikube集群中创建PVC以持久化FastAPI日志
解决FastAPI服务日志持久化问题(Kubernetes PV/PVC实现)
步骤1:调整应用代码与Docker配置
首先需要修改日志存储路径到专门目录,并确保容器内存在该目录:
修改
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}更新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"]重新构建并加载镜像到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:验证日志持久化效果
访问服务生成日志:
# 获取Service的访问地址 minikube service <你的服务名称> --url # 访问接口生成日志 curl $(minikube service <你的服务名称> --url)/ curl $(minikube service <你的服务名称> --url)/item/123删除当前Pod:
kubectl delete pod $(kubectl get pods -l app=fastapi -o jsonpath="{.items[0].metadata.name}")新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
相关产品推荐
相关产品推荐

