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

  1. Provisioning
  2. Binding
  3. Using
  4. 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.