Backup และ Disaster Recovery สำหรับ Kubernetes Cluster บน Cloud VPS

บทนำ: ทำไม Backup Kubernetes ถึงสำคัญ

การดำเนินการ Kubernetes Cluster บน Cloud VPS นั้น เราต้องเตรียมตัวสำหรับสถานการณ์ฉุกเฉิน เช่น ความเสียหาย โหลดตกค้าง หรือการลบข้อมูลโดยไม่ตั้งใจ การมี Backup Plan ที่ดีคือกุญแจสำคัญในการจัดการ Kubernetes ที่มีความเสี่ยงสูง

ในบทความนี้ เราจะสำรวจวิธีการสร้าง Backup และ Disaster Recovery (DR) Plan สำหรับ Kubernetes Cluster ที่ทำงานบน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง โดยใช้เครื่องมือ Velero ซึ่งเป็น Solution ที่ได้รับความนิยมสำหรับการ Backup K8s

ภาพรวมการวางแผน Backup Strategy

Backup Strategy ที่ดีนั้น ต้องครอบคลุมส่วนต่าง ๆ ของ Kubernetes:

  • etcd Database: ฐานข้อมูลของ Kubernetes ที่เก็บสถานะ Cluster ทั้งหมด
  • Application Resources: Deployment, Service, ConfigMap, Secret, PVC เป็นต้น
  • Persistent Data: Data ใน Persistent Volume ที่ต้องเก็บรักษา
  • Configurations: Network Policy, RBAC, Storage Classes

ขนาดและความถี่ของ Backup ต้องพิจารณาตามความสำคัญของ Application และความสามารถของ Storage

Velero คืออะไร

Velero (เดิมชื่อ Ark) เป็น Open Source Project ของ VMware ที่ออกแบบมาเพื่อ:

  • Backup ทั้ง Kubernetes Cluster resources และ Persistent Volumes
  • Restore Cluster ไปยังจุดที่ต้องการในอดีต
  • Migrate Workload ระหว่าง Cluster ต่าง ๆ
  • Schedule Backup อัตโนมัติ

Velero ไม่ใช่ Backup สำหรับ etcd โดยตรง แต่จะ Backup Application Resources และ PV ลง Object Storage (S3, MinIO, etc.)

ติดตั้ง Velero บน Kubernetes

ข้อกำหนดเบื้องต้น

  • Kubernetes Cluster ที่ทำงานอยู่บน Cloud VPS
  • kubectl ที่ติดตั้งและ Connected ไปยัง Cluster
  • Object Storage Backend (S3 compatible, MinIO, Azure Blob, GCP)
  • Helm (optional แต่ขอแนะนำ)

วิธีติดตั้ง Velero ด้วย Helm

# เพิ่ม Helm Repository ของ Velero
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm repo update

# ติดตั้ง Velero namespace
kubectl create namespace velero

# ติดตั้ง Velero ผ่าน Helm
helm install velero vmware-tanzu/velero \
  --namespace velero \
  --set configuration.backupStorageLocation.bucket=my-backup-bucket \
  --set configuration.backupStorageLocation.provider=aws \
  --set configuration.schedules.daily.schedule="0 2 * * *" \
  --set configuration.schedules.daily.template.ttl=720h

ตั้งค่า Storage Backend (S3/MinIO)

Velero ต้องการ Object Storage เพื่อเก็บ Backup Files โปรแกรมแนะนำให้ใช้ Storage ที่อยู่นอก Cluster

ตัวอย่างการตั้งค่า MinIO บน Cloud VPS

# สร้าง Secret สำหรับ Credentials
kubectl create secret generic cloud-credentials \
  --from-literal=cloud=\"[default]\n\naws_access_key_id = minioadmin\n\naws_secret_access_key = minioadmin\" \
  --namespace velero

# สร้าง BackupStorageLocation
cat <<EOF | kubectl apply -f -
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
  name: default
  namespace: velero
spec:
  provider: aws
  bucket: velero-backups
  config:
    s3Url: https://minio.example.com:9000
    insecureSkipTLSVerify: false
    publicUrl: https://minio.example.com:9000
    s3ForcePathStyle: "true"
EOF

สร้าง Backup ด้วย Velero

Backup ทั้ง Cluster

# สร้าง Backup เต็ม Cluster
velero backup create full-cluster-backup --wait

# ตรวจสอบสถานะ
velero backup get
velero backup logs full-cluster-backup

Backup บาง Namespace เท่านั้น

# Backup เฉพาะ production namespace
velero backup create prod-backup \
  --include-namespaces production \
  --wait

Backup ที่ Exclude บาง Resources

# Backup ทั้งหมด แต่ยกเว้น Logs
velero backup create backup-no-logs \
  --exclude-resources logs \
  --wait

Schedule Backup อัตโนมัติ

กำหนด Backup ให้ทำงานอัตโนมัติตามตารางเวลา:

# สร้าง Schedule Backup ทุกวันเวลา 2 โมงเช้า
velero schedule create daily-backup \
  --schedule="0 2 * * *" \
  --include-namespaces "*" \
  --ttl 720h

# ตรวจสอบ Schedules
velero schedule get
velero schedule describe daily-backup

Restore จาก Backup

Restore ทั้ง Cluster

# Restore จาก Backup
velero restore create --from-backup full-cluster-backup --wait

# ตรวจสอบสถานะ Restore
velero restore get
velero restore logs full-cluster-backup-1234567890

Restore บาง Namespace เท่านั้น

# Restore เฉพาะ production namespace
velero restore create prod-restore \
  --from-backup prod-backup \
  --include-namespaces production

Restore พร้อม Transformation

# Restore ไปยัง Cluster อื่นโดยเปลี่ยน Namespace
velero restore create multi-cluster-restore \
  --from-backup full-cluster-backup \
  --namespace-mappings old-namespace:new-namespace

Backup etcd Database

etcd คือ Database ที่เก็บข้อมูลส่วนสำคัญของ Kubernetes เราต้อง Backup etcd แยกต่างหาก

Backup etcd ด้วย etcdctl

# ค้นหา etcd Pod
kubectl get pods -n kube-system | grep etcd

# สร้าง Snapshot
kubectl exec -n kube-system etcd-master-node \
  -- etcdctl --endpoints=127.0.0.1:2379 \
  snapshot save /tmp/etcd-backup.db

# Copy Snapshot ออกจาก Container
kubectl cp kube-system/etcd-master-node:/tmp/etcd-backup.db \
  ./etcd-backup.db

วางแผน Disaster Recovery

Components ของ DR Plan

  1. RTO (Recovery Time Objective): ระยะเวลาที่ยอมรับได้ในการ Restore Service
  2. RPO (Recovery Point Objective): ระยะเวลาของข้อมูลที่อาจสูญหายไป
  3. Backup Frequency: ความถี่ของ Backup (ทุกชั่วโมง/วัน)
  4. Storage Redundancy: Backup ต้องเก็บในตำแหน่งหลายแห่ง
  5. Documentation: เอกสารการ Restore Step-by-Step

ตัวอย่าง DR Strategy สำหรับ Production

  • RTO: 1 ชั่วโมง
  • RPO: 15 นาที
  • Backup ทุก 15 นาที (เฉพาะ Critical Applications)
  • Full Backup ทุกวันเวลา 2 โมงเช้า
  • เก็บ Backup ไว้ 30 วัน
  • Backup เก็บในหลายตำแหน่ง (Primary + Secondary Storage)

ทดสอบ DR Procedure

การทดสอบ Disaster Recovery Plan เป็นขั้นตอนสำคัญ:

Test 1: Restore ไปยัง Development Cluster

# ใช้ Backup จาก Production
velero restore create test-restore-dev \
  --from-backup full-cluster-backup \
  --namespace-mappings production:production-test

# ตรวจสอบว่า Services ทำงานถูกต้อง
kubectl get pods -n production-test
kubectl get pvc -n production-test

Test 2: Restore Single Application

# Restore เฉพาะ Application ที่สำคัญ
velero restore create app-restore \
  --from-backup prod-backup \
  --include-namespaces my-app-namespace

Test 3: Regular DR Drills

ควรทำการทดสอบ DR ทุก ๆ เดือน:

  • ทดสอบ Backup ในแต่ละสัปดาห์
  • ทดสอบ Restore Process ทุก ๆ 2 สัปดาห์
  • ทำเอกสาร Lessons Learned

Best Practices สำหรับ Kubernetes Backup

  • ความสม่ำเสมอ: สร้าง Backup ตามตารางเวลาที่เหมาะสม
  • Verification: ทดสอบการ Restore เป็นประจำ
  • Retention Policy: กำหนดระยะเวลาการเก็บ Backup
  • Encryption: เข้ารหัส Backup ระหว่างการส่ง และเก็บ
  • Monitoring: ติดตาม Backup Status ด้วย Alerts
  • Documentation: จดบันทึกการ Backup และ Restore Procedures
  • Multi-Region: เก็บ Backup ในหลายภูมิภาค (ถ้าเป็นไปได้)

การใช้ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง สำหรับ Backup

ผู้ให้บริการโฮสติ้ง ของเรา (de.co.th/cloud-vps) มีศักยภาพ:

  • Performance สูงสำหรับการ Backup/Restore ขนาดใหญ่
  • Network ที่เสถียรและความเร็วสูง
  • ความปลอดภัยระดับ Enterprise พร้อม DDoS Protection
  • Flexible Architecture เหมาะสำหรับ Kubernetes

คุณสามารถใช้ Cloud VPS เพื่อ:

  • รัน Kubernetes Control Plane พร้อมความเชื่อถือได้สูง
  • ตั้ง MinIO หรือ Storage Backend สำหรับเก็บ Backup
  • รัน Secondary Cluster สำหรับ DR Testing

สรุป

Backup และ Disaster Recovery Plan นั้น เป็นส่วนสำคัญของการจัดการ Kubernetes Cluster ที่มีความเสี่ยงต่ำ ด้วย Velero ทำให้การทำ Backup ข้อมูลและ Configuration ของ K8s เป็นเรื่องง่ายขึ้น

สิ่งสำคัญคือ:

  1. สร้าง Backup Plan ที่ชัดเจน
  2. ติดตั้ง Velero และตั้งค่า Storage Backend
  3. Schedule Backup อัตโนมัติ
  4. ทดสอบการ Restore เป็นประจำ
  5. ติดตาม Backup Status

โดยการใช้ Cloud VPS ของ ผู้ให้บริการโฮสติ้ง คุณสามารถมั่นใจว่า Kubernetes Cluster ของคุณได้รับการปกป้องจากการสูญหายข้อมูลและสามารถ Recover ได้อย่างรวดเร็ว

หากคุณมีคำถามเกี่ยวกับ Backup และ DR สำหรับ Kubernetes บน Cloud VPS ของเรา สามารถติดต่อ ผู้ให้บริการโฮสติ้ง ได้