ข้ามไปเนื้อหาหลัก
คอนเทนเนอร์· ~15 นาที· อัปเดตล่าสุด

PersistentVolume, PVC และ StorageClass

ขอที่เก็บถาวรแบบไม่ต้องรู้ว่าดิสก์จริงอยู่ที่ไหน

พื้นฐานที่ควรรู้: ในคลัสเตอร์ขนาดใหญ่ นักพัฒนาแอป (Developer) อาจไม่รู้ว่าระบบใช้ฮาร์ดดิสก์ยี่ห้ออะไร หรือเชื่อมต่อกับ Storage แบบไหน (เช่น AWS EBS หรือ NFS) K8s จึงสร้างระบบที่เป็นตัวกลาง เพื่อแยก "คนที่ต้องการใช้พื้นที่" ออกจาก "คนที่จัดการพื้นที่"

การเช่าโกดังเก็บของ

เทียบกับการเช่าโกดัง: PVC (PersistentVolumeClaim) = "ใบขอ" ที่บอกว่าอยากได้พื้นที่ 10GB แบบเขียน-อ่านได้ · PV (PersistentVolume) = โกดังจริงที่ถูกจัดให้ · StorageClass = ผู้ให้เช่าที่สร้างโกดังใหม่ให้อัตโนมัติเมื่อมีใบขอ

นักพัฒนาขอผ่าน PVC · StorageClass สร้างดิสก์จริงให้

Podmount /data
อ้าง
PVCขอ 10Gi RWO
ตาม class
StorageClassgp3
สร้าง
PV (EBS)ดิสก์จริง

นักพัฒนาไม่ต้องรู้ว่าเบื้องหลังเป็น EBS/NFS — แค่เขียน PVC

Pod → PVC (ใบขอ) → StorageClass สร้าง PV (ดิสก์จริง เช่น EBS) ให้อัตโนมัติ

แนวคิดคือแยก"คนใช้" ออกจาก "คนจัดหา" — นักพัฒนาแค่เขียน 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)
pvc.yaml — ขอพื้นที่ 10Gi

สรุป 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 แยกเสมอ

อ่านจบแล้วอย่าลืมทำเครื่องหมาย