ในการจัดการแอปพลิเคชันบน 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 ของคุณอย่างมีประสิทธิภาพและปลอดภัย
