สาเหตุหลัก
เมื่อ Zeabur สร้าง volume จะตั้งค่า mountPath ของ PVC เป็น /insforge-storage (root directory) โดยอัตโนมัติ แต่แอปพลิเคชัน insforge จริงๆ แล้วเขียนไฟล์ลงใน /app/backend/insforge-storage
การที่ path ทั้งสองไม่ตรงกันทำให้เกิดปัญหาดังนี้:
- PVC ถูก mount ไว้ที่
/insforge-storage→ มีความคงทน (persistent) แต่แอปไม่ได้เขียนข้อมูลลงที่นี่ - แอปเขียนข้อมูลลงที่
/app/backend/insforge-storage→ ไม่มี PVC คุ้มครอง เป็นเพียงพื้นที่ชั่วคราวภายใน container เท่านั้น
ทุกครั้งที่ pod รีสตาร์ท filesystem ของ container จะถูกรีเซ็ต ทำให้ข้อมูลใน /app/backend/insforge-storage หายไป
วิธีแก้ไข
ตรวจสอบเบื้องต้น
ตรวจสอบว่าภายใน pod ปัจจุบันมีข้อมูลใน /app/backend/insforge-storage ที่จำเป็นต้องเก็บรักษาไว้หรือไม่:
kubectl exec -n <namespace> <pod-name> -- ls -la /app/backend/insforge-storage/
ขั้นตอนที่ 1: หากมีข้อมูล ให้สำรองข้อมูลไปยัง PVC
ก่อนที่จะเปลี่ยน mountPath ในขณะที่ pod ยังทำงานอยู่ ให้คัดลอกข้อมูลไปยัง PVC ที่ mount อยู่ในปัจจุบัน (/insforge-storage):
kubectl exec -n <namespace> <pod-name> -- cp -r /app/backend/insforge-storage/. /insforge-storage/
วิธีนี้จะทำให้ข้อมูลถูกเก็บไว้อย่างปลอดภัยใน PVC และคุณสามารถดึงข้อมูลกลับมาในตำแหน่งที่ถูกต้องได้หลังจากแก้ไข mountPath แล้ว
ขั้นตอนที่ 2: แก้ไข mountPath ของ volumeMount ใน Deployment
ค้นหา Deployment ที่เกี่ยวข้อง (service-698431469758a4530cd3b774) แล้วเปลี่ยน path ของ volumeMounts จาก:
mountPath: /insforge-storage
เป็น:
mountPath: /app/backend/insforge-storage
ขั้นตอนที่ 3: ทำการ rollout ใหม่
หลังจากใช้การเปลี่ยนแปลงแล้ว ให้ pod รีสตาร์ท pod ใหม่จะทำการ mount PVC ไปที่ /app/backend/insforge-storage โดยตรง ทำให้ข้อมูลที่แอปเขียนลงไปมีความคงทนอย่างแท้จริง