← Về danh sách bài học
Bài 9/25
💾 Bài 9: Volumes & Persistent Storage
🎯 Sau bài học này, bạn sẽ:
- Hiểu các loại Volume trong K8s
- Phân biệt Volume, PersistentVolume, PersistentVolumeClaim
- Tạo PV/PVC để lưu trữ dữ liệu bền vững
- Hiểu StorageClass và dynamic provisioning
1. Tại Sao Cần Volume?
Container filesystem là ephemeral (tạm thời). Khi Pod restart/xóa, dữ liệu mất!
💡 Volume giải quyết:
• Lưu dữ liệu ngoài container lifecycle
• Chia sẻ dữ liệu giữa containers trong Pod
• Mount storage từ cloud (AWS EBS, GCP PD...)
• Lưu dữ liệu ngoài container lifecycle
• Chia sẻ dữ liệu giữa containers trong Pod
• Mount storage từ cloud (AWS EBS, GCP PD...)
2. Các Loại Volume Phổ Biến
emptyDir - Tạm thời trong Pod
apiVersion: v1
kind: Pod
metadata:
name: cache-pod
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: cache-volume
mountPath: /cache
volumes:
- name: cache-volume
emptyDir: {} # Tạo thư mục trống, xóa khi Pod xóa
hostPath - Mount từ Node
volumes:
- name: host-volume
hostPath:
path: /var/log/app
type: DirectoryOrCreate # Tạo nếu chưa có
⚠️ hostPath: Tránh dùng trong production! Dữ liệu gắn với node cụ thể, Pod đổi node sẽ
mất dữ liệu.
3. PersistentVolume (PV) & PersistentVolumeClaim (PVC)
Tách biệt việc tạo storage (PV - Admin) và yêu cầu storage (PVC - Developer).
Admin tạo: PersistentVolume (PV) - Storage thực tế
↑
| bind
↓
Developer tạo: PersistentVolumeClaim (PVC) - Yêu cầu storage
↑
| mount
↓
Pod sử dụng PVC
Bước 1: Tạo PersistentVolume
# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce # RWO: 1 node mount read-write
persistentVolumeReclaimPolicy: Retain # Giữ lại data khi PVC xóa
hostPath: # Demo - production dùng cloud storage
path: /mnt/data
Bước 2: Tạo PersistentVolumeClaim
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi # Yêu cầu 5Gi
Bước 3: Sử dụng trong Pod
apiVersion: v1
kind: Pod
metadata:
name: app-with-storage
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: data-volume
mountPath: /data
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: my-pvc
4. Access Modes
| Mode | Mô tả |
|---|---|
ReadWriteOnce (RWO) |
1 node mount read-write |
ReadOnlyMany (ROX) |
Nhiều nodes mount read-only |
ReadWriteMany (RWX) |
Nhiều nodes mount read-write (NFS, CephFS) |
5. StorageClass & Dynamic Provisioning
Tự động tạo PV khi có PVC request (không cần admin tạo trước).
# storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-storage
provisioner: kubernetes.io/aws-ebs # AWS EBS provisioner
parameters:
type: gp3
fsType: ext4
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
# pvc với storageClass
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dynamic-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: fast-storage # Chỉ định StorageClass
resources:
requests:
storage: 20Gi
# Kiểm tra
kubectl get pv
kubectl get pvc
kubectl get storageclass
📝 Tóm Tắt Bài Học
- emptyDir: Tạm thời, trong Pod lifecycle
- hostPath: Mount từ node (không dùng production)
- PV/PVC: Persistent storage chuyên nghiệp
- StorageClass: Dynamic provisioning tự động
- Access modes: RWO, ROX, RWX