Volumes & Storage - Persistent Data trong Kubernetes
Tổng quan
Volumes provide persistent storage cho containers. Persistent Volumes (PV) và Persistent Volume Claims (PVC) abstract storage details.
Volume Types
EmptyDir
Temporary storage, deleted khi pod terminated.
HostPath
Mount file/directory từ host node.
ConfigMap/Secret
Mount configuration data.
PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data"
Persistent Volume Claims
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
Storage Classes
Dynamic provisioning của persistent volumes.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
Access Modes
- ReadWriteOnce (RWO)
- ReadOnlyMany (ROX)
- ReadWriteMany (RWX)
Volume Lifecycle
- Provisioning
- Binding
- Using
- Reclaiming
Best Practices
- Use PVCs thay vì direct volume mounts
- Choose appropriate access modes
- Set storage requests và limits
- Backup important data
- Monitor storage usage
Cloud Storage Integration
AWS EBS
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp2-sc
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
GCP Persistent Disks
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard-gcp
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
Azure Disks
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-premium
provisioner: kubernetes.io/azure-disk
parameters:
skuName: Premium_LRS
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
NFS
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-client
provisioner: example.com/nfs
parameters:
archiveOnDelete: "false"
Ceph
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: kubernetes.io/rbd
parameters:
monitors: 10.1.2.3:6789
adminId: admin
adminSecretName: ceph-admin-secret
pool: k8s
userId: kube
userSecretName: ceph-kube-secret
reclaimPolicy: Delete
Backup Procedures (Velero Example)
Velero là một công cụ mã nguồn mở giúp sao lưu và khôi phục các tài nguyên Kubernetes và persistent volumes.
Cài đặt Velero
# Tải Velero CLI
wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.0/velero-v1.9.0-linux-amd64.tar.gz
tar -zxvf velero-v1.9.0-linux-amd64.tar.gz
sudo mv velero-v1.9.0-linux-amd64/velero /usr/local/bin/
# Cài đặt Velero trên cluster (ví dụ AWS S3)
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.5.0 \
--bucket velero-backup-bucket \
--secret-file ./aws-credentials
Tạo Backup
# Sao lưu toàn bộ namespace
velero backup create my-app-backup --include-namespaces my-app-namespace
# Sao lưu tất cả tài nguyên trong cluster
velero backup create full-cluster-backup
Khôi phục từ Backup
# Liệt kê các bản sao lưu
velero backup get
# Khôi phục một bản sao lưu cụ thể
velero restore create --from-backup my-app-backup
Java Integration for Velero (Conceptual)
Bạn có thể tích hợp Velero vào các quy trình Java bằng cách thực thi các lệnh Velero CLI thông qua ProcessBuilder hoặc sử dụng Fabric8 Kubernetes Client để tương tác với các Custom Resources của Velero (nếu có).
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class VeleroBackupManager {
public static void executeVeleroCommand(String command) throws IOException, InterruptedException {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("bash", "-c", command);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
int exitVal = process.waitFor();
if (exitVal == 0) {
System.out.println("Velero command executed successfully.");
} else {
System.err.println("Velero command failed with exit code: " + exitVal);
}
}
public static void main(String[] args) {
try {
// Ví dụ: Tạo một bản sao lưu mới
executeVeleroCommand("velero backup create my-daily-backup --include-namespaces production");
// Ví dụ: Liệt kê các bản sao lưu
executeVeleroCommand("velero backup get");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
Nội dung đã được mở rộng với cloud storage examples và backup procedures, cùng các ví dụ Java.