PersistentVolume, PVC และ StorageClass
ขอที่เก็บถาวรแบบไม่ต้องรู้ว่าดิสก์จริงอยู่ที่ไหน
พื้นฐานที่ควรรู้: ในคลัสเตอร์ขนาดใหญ่ นักพัฒนาแอป (Developer) อาจไม่รู้ว่าระบบใช้ฮาร์ดดิสก์ยี่ห้ออะไร หรือเชื่อมต่อกับ Storage แบบไหน (เช่น AWS EBS หรือ NFS) K8s จึงสร้างระบบที่เป็นตัวกลาง เพื่อแยก "คนที่ต้องการใช้พื้นที่" ออกจาก "คนที่จัดการพื้นที่"
เทียบกับการเช่าโกดัง: PVC (PersistentVolumeClaim) = "ใบขอ" ที่บอกว่าอยากได้พื้นที่ 10GB แบบเขียน-อ่านได้ · PV (PersistentVolume) = โกดังจริงที่ถูกจัดให้ · StorageClass = ผู้ให้เช่าที่สร้างโกดังใหม่ให้อัตโนมัติเมื่อมีใบขอ
นักพัฒนาขอผ่าน PVC · StorageClass สร้างดิสก์จริงให้
นักพัฒนาไม่ต้องรู้ว่าเบื้องหลังเป็น EBS/NFS — แค่เขียน PVC
แนวคิดคือแยก"คนใช้" ออกจาก "คนจัดหา" — นักพัฒนาแค่เขียน PVC บอกความต้องการ ไม่ต้องรู้ว่าเบื้องหลังเป็น AWS EBS, NFS หรืออะไร · StorageClass ทำ dynamic provisioning สร้าง PV ให้เองเมื่อมี PVC เข้ามา
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"] # เขียนได้จาก node เดียว
resources:
requests:
storage: 10Gi
storageClassName: gp3 # ชื่อ StorageClass (เช่น AWS gp3)สรุป Key Takeaways
- PVC = ใบขอที่เก็บ (นักพัฒนาเขียน) · PV = ดิสก์จริง · StorageClass = สร้าง PV ให้อัตโนมัติ
- แยกคนใช้ออกจากคนจัดหา — ไม่ต้องรู้ว่าเบื้องหลังเป็น EBS/NFS
- RWO = node เดียวเขียน (block) · RWX = หลาย node เขียน (file/NFS/EFS)
- reclaimPolicy Retain ปกป้องข้อมูลสำคัญตอนลบ PVC
คำถามที่พบบ่อย
PV, PVC, StorageClass สามตัวนี้สัมพันธ์กันยังไง
เปรียบเป็นการจองห้อง: PVC = "ใบขอ" ของแอป (ขอ 10Gi แบบ ReadWriteOnce) · PV = "ห้องจริง" (ดิสก์ EBS ลูกหนึ่ง) · StorageClass = "ผู้รับเหมา" ที่สร้างห้องใหม่ให้อัตโนมัติเมื่อมีใบขอ (dynamic provisioning) — แอปรู้จักแค่ PVC ไม่ต้องรู้ว่าดิสก์จริงคืออะไร
ReadWriteOnce กับ ReadWriteMany ต่างกันยังไง ทำไมสำคัญ
RWO = mount เขียนได้จาก "node เดียว" (EBS เป็นแบบนี้) ส่วน RWX = หลาย node พร้อมกัน (ต้องใช้ NFS/EFS) — ปัญหาคลาสสิก: Deployment หลาย replica แชร์ PVC แบบ RWO แล้ว pod ที่ไปตกเครื่องอื่น mount ไม่ได้ — ถ้าต้องแชร์ไฟล์หลายตัวจริงให้ใช้ RWX หรือเปลี่ยนดีไซน์ไปใช้ object storage
ลบ PVC แล้วข้อมูลหายเลยไหม
ขึ้นกับ reclaimPolicy ของ PV: Delete = ดิสก์จริงถูกลบตาม (default ของ StorageClass ส่วนใหญ่) ส่วน Retain = PV ค้างไว้ให้กู้ข้อมูลได้ — ฐานข้อมูล production ควรตั้ง Retain และมี backup แยกเสมอ

