← Về danh sách bài học Bài 9/25

💾 Bài 9: Volumes & Persistent Storage

⏱️ Thời gian: 25 phút | 📚 Độ khó: Trung bình

🎯 Sau bài học này, bạn sẽ:

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...)

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