จัดการ Persistent Storage บน Kubernetes ด้วย PV และ PVC

ในการจัดการแอปพลิเคชันบน Kubernetes นั้น การจัดการข้อมูลและการจัดเก็บอย่างถูกต้องถือว่าเป็นส่วนสำคัญอย่างยิ่ง โดยเฉพาะอย่างยิ่งสำหรับแอปพลิเคชันที่ต้องการเก็บข้อมูลอย่างถาวร (Persistent Data) เช่น ฐานข้อมูล, แอปพลิเคชัน Stateful, และระบบจัดเก็บไฟล์ต่างๆ บทความนี้จะอธิบายวิธีการจัดการ Persistent Storage บน Kubernetes โดยใช้ PersistentVolume (PV) และ PersistentVolumeClaim (PVC) อย่างละเอียด

ทำไม Storage ใน Kubernetes ถึงสำคัญ

Pod ในการสร้างและลบอย่างรวดเร็ว ซึ่งหมายความว่าข้อมูลที่เก็บไว้ในหน่วยความจำหรือ Local Storage ของ Pod จะหายไปเมื่อ Pod ถูกลบ สำหรับ Cloud VPS ที่จัดการโดย ผู้ให้บริการโฮสติ้ง นั้น การจัดการ Storage อย่างถูกต้องจึงช่วยให้ข้อมูลของคุณปลอดภัยและสามารถเข้าถึงได้อย่างสม่ำเสมอ โดยไม่สูญหายแม้ว่า Pod จะถูกสร้างใหม่

Volume ใน Kubernetes คืออะไร

Volume ใน Kubernetes เป็นวิธีการจัดเก็บข้อมูลแบบเบสิก ที่สามารถแชร์ข้อมูลได้ระหว่าง Container หลายๆ ตัวภายใน Pod เดียวกัน ตัวอย่างเช่น emptyDir, hostPath เป็นต้น อย่างไรก็ตาม Volume เหล่านี้มีข้อจำกัดคือข้อมูลจะหายไปเมื่อ Pod ถูกลบ

PersistentVolume (PV) คืออะไร

PersistentVolume (PV) เป็นทรัพยากรในคลัสเตอร์ที่แสดงถึงพื้นที่จัดเก็บ (Storage) ในระดับคลัสเตอร์ PV สามารถ Provisioned ได้ด้วย Administrator หรือสามารถสร้างขึ้นมาโดยอัตโนมัติผ่าน StorageClass นอกจากนี้ PV ยังมีลักษณะการทำงานที่เป็นอิสระจาก Pod ทั่วไป

ลักษณะสำคัญของ PV

  • Access Modes: วิธีการเข้าถึง Storage (ReadWriteOnce, ReadOnlyMany, ReadWriteMany)
  • Reclaim Policy: นโยบายการจัดการเมื่อ PVC ถูกลบออก (Retain, Delete, Recycle)
  • Storage Class: ประเภทของ Storage ที่ใช้
  • Capacity: ขนาดของ Storage

Access Modes ใน PersistentVolume

  • ReadWriteOnce (RWO): Volume สามารถ Mount ได้เพียงโหนดเดียว ด้วยสิทธิ์อ่าน-เขียน
  • ReadOnlyMany (ROX): Volume สามารถ Mount ได้ในหลายโหนด ด้วยสิทธิ์เฉพาะการอ่าน
  • ReadWriteMany (RWX): Volume สามารถ Mount ได้ในหลายโหนด ด้วยสิทธิ์อ่าน-เขียน

Reclaim Policy

  • Retain: ข้อมูลจะยังคงอยู่ใน Storage แม้ว่า PVC จะถูกลบออก
  • Delete: ข้อมูลจะถูกลบออกจาก Storage เมื่อ PVC ถูกลบออก
  • Recycle: ข้อมูลจะถูกลบออกแต่ Volume สามารถนำไปใช้ใหม่ได้

ตัวอย่าง YAML สำหรับ PersistentVolume

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-example
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  nfs:
    server: 192.168.1.100
    path: "/exported/path"

PersistentVolumeClaim (PVC) คืออะไร

PersistentVolumeClaim (PVC) เป็นคำขอของผู้ใช้เพื่อใช้ Storage จาก PV โดยผู้ใช้ (Developer) ไม่จำเป็นต้องรู้รายละเอียดเกี่ยวกับ Storage Infrastructure ในระดับคลัสเตอร์ PVC ทำให้การจัดการ Storage เป็นแบบ Abstract และชัดเจนมากขึ้น

ตัวอย่าง YAML สำหรับ PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-example
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: manual
  resources:
    requests:
      storage: 5Gi

StorageClass และ Dynamic Provisioning

StorageClass เป็นวิธีการกำหนดประเภท Storage ที่สามารถใช้ได้ในคลัสเตอร์ โดยเปิดใช้งาน Dynamic Provisioning ซึ่งหมายความว่า PersistentVolume จะถูกสร้างขึ้นมาโดยอัตโนมัติเมื่อ PersistentVolumeClaim ถูกสร้างขึ้น นี่คือวิธีการที่มีประสิทธิภาพมากกว่า Manual Provisioning

ตัวอย่าง YAML สำหรับ StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  iops: "3000"
  fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true

ประเภท Storage Provisioner

  • AWS EBS: สำหรับ Amazon Web Services
  • Google Cloud Storage: สำหรับ Google Cloud Platform
  • Azure Disk: สำหรับ Microsoft Azure
  • NFS: สำหรับระบบ NFS Server
  • Local: สำหรับ Local Storage บนโหนด

ตัวอย่าง Storage Backends

HostPath (สำหรับ Development/Test)

HostPath ใช้สำหรับสภาพแวดล้อม Development หรือ Test เท่านั้น เพราะข้อมูลจะเก็บไว้บนโหนดเฉพาะและหากโหนดนั้นหัวเราะ ข้อมูลจะหายไป

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-hostpath
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  hostPath:
    path: "/mnt/data"

NFS (Network File System) – Production Setup

NFS เหมาะสำหรับสภาพแวดล้อม Production ที่ต้องการแชร์ข้อมูลระหว่างหลายโหนด NFS สนับสนุน ReadWriteMany Access Mode ซึ่งหมายความว่า Pod หลายๆ ตัวสามารถเข้าถึง Volume เดียวกันได้ในเวลาเดียวกัน เมื่อใช้บริการ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง คุณสามารถติดตั้ง NFS Server บนเซิร์ฟเวอร์หลักและเชื่อมต่อจากโหนด Kubernetes อื่นๆ

ตัวอย่าง YAML สำหรับ NFS PersistentVolume:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs
spec:
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: nfs-server.example.com
    path: "/exports/kubernetes"

การติดตั้ง NFS Server บน Cloud VPS:

# ติดตั้ง NFS Server package
sudo apt-get update
sudo apt-get install -y nfs-kernel-server

# สร้าง Directory สำหรับ Export
sudo mkdir -p /data/kubernetes-storage
sudo chown nobody:nogroup /data/kubernetes-storage
sudo chmod 777 /data/kubernetes-storage

# เพิ่มการ Export ใน /etc/exports
echo "/data/kubernetes-storage *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports

# Restart NFS Server
sudo exportfs -a
sudo systemctl restart nfs-kernel-server

การใช้ PVC กับ Pod และ Deployment

เมื่อสร้าง PVC แล้ว สามารถใช้มันกับ Pod หรือ Deployment ได้ดังตัวอย่างต่อไปนี้

ตัวอย่าง Pod ที่ใช้ PVC

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app
    image: nginx:latest
    volumeMounts:
    - name: data
      mountPath: "/data"
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: pvc-example

ตัวอย่าง Deployment ที่ใช้ PVC

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: app
        image: myapp:1.0
        volumeMounts:
        - name: data
          mountPath: "/app/data"
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: pvc-example

Storage Monitoring และ Quota Management

การติดตามการใช้งาน Storage เป็นสิ่งสำคัญเพื่อหลีกเลี่ยงการเต็มพื้นที่ใจสถานเก็บข้อมูล

ตรวจสอบการใช้งาน PV:

# ดูรายการ PersistentVolumes ทั้งหมด
kubectl get pv

# ดูรายละเอียดของ PV เฉพาะ
kubectl describe pv pv-nfs

# ดูการใช้งาน Storage ของแต่ละ PVC
kubectl get pvc -A
kubectl describe pvc pvc-example

ตั้งค่า Storage Quota:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: storage-quota
  namespace: default
spec:
  hard:
    requests.storage: 100Gi
  scopeSelector:
    matchExpressions:
    - operator: In
      scopeName: PriorityClass
      values: ["high"]

Backup และ Disaster Recovery Strategy

สำหรับการใช้งาน Production บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง ควรมีการสำรองข้อมูลอย่างสม่ำเสมอ

วิธีการ Backup PVC:

# ใช้ kubectl exec เพื่อ Backup ข้อมูลจาก Pod
kubectl exec pod-name -- tar czf - /app/data | gzip > backup.tar.gz

# Restore จากไฟล์ Backup
kubectl exec -it pod-name -- tar xzf - -C / < backup.tar.gz

ใช้ Velero สำหรับ Backup ประจำ:

# ติดตั้ง Velero
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm install velero vmware-tanzu/velero \
  --namespace velero \
  --create-namespace \
  --set schedules.daily.schedule="0 2 * * *"

# สร้าง Backup Schedule
velero schedule create daily-backup --schedule="0 2 * * *"

Best Practices สำหรับ Persistent Storage

  • เลือก Access Mode ที่เหมาะสม: ใช้ ReadWriteOnce สำหรับแอปพลิเคชัน Single Instance และ ReadWriteMany สำหรับแอปพลิเคชันที่มี Multiple Replicas
  • กำหนด Reclaim Policy อย่างถูกต้อง: ใช้ Retain สำหรับข้อมูลสำคัญ เพื่อป้องกันการลบข้อมูลโดยไม่ตั้งใจ
  • ใช้ StorageClass สำหรับ Dynamic Provisioning: ช่วยให้การจัดการ Storage เป็นแบบอัตโนมัติและยืดหยุ่น
  • ติดตามขนาด Storage: ตรวจสอบการใช้งาน Storage เป็นประจำเพื่อหลีกเลี่ยงการเต็ม
  • ใช้ Backup Strategy: สำรองข้อมูลสำคัญเป็นประจำโดยใช้เครื่องมือเช่น Velero
  • ตั้งค่า Resource Limits: กำหนด Resource Limit สำหรับ Pod ที่ใช้ Persistent Storage เพื่อป้องกันการใช้ Resource มากเกินไป
  • ใช้ StorageClass ที่เหมาะสม: เลือก StorageClass ที่มีประสิทธิภาพสูงสำหรับ Production workloads

การจัดการ Storage บน ผู้ให้บริการโฮสติ้ง Cloud VPS

บริการ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง (https://de.co.th/cloud-vps) มีการสนับสนุน Kubernetes ที่มีประสิทธิภาพ โดยคุณสามารถใช้ PersistentVolume และ PersistentVolumeClaim เพื่อจัดการ Storage อย่างยืดหยุ่นได้ นอกจากนี้ยังสนับสนุน NFS และ Block Storage ซึ่งเหมาะสำหรับแอปพลิเคชัน Production ที่ต้องการความเสถียรและประสิทธิภาพสูง รวมถึง High Availability Storage Solutions ที่ช่วยให้ข้อมูลของคุณปลอดภัยและสามารถเข้าถึงได้ตลอดเวลา

สรุป

การจัดการ Persistent Storage บน Kubernetes โดยใช้ PersistentVolume และ PersistentVolumeClaim นั้นเป็นส่วนสำคัญของการจัดการแอปพลิเคชันแบบ Stateful ผ่านการทำความเข้าใจ PV, PVC, StorageClass และ Dynamic Provisioning คุณจะสามารถออกแบบและนำไปใช้งาน Storage Strategy ที่เหมาะสมสำหรับแอปพลิเคชันของคุณ ไม่ว่าจะเป็นการใช้ HostPath สำหรับ Development หรือ NFS สำหรับ Production บริการ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง พร้อมที่จะสนับสนุนการจัดการ Storage ของคุณอย่างมีประสิทธิภาพและปลอดภัย