Chuyển tới nội dung

Backup – Restore cụm k8s bằng Velero kết hợp với Minio

I. Các công cụ backup triển khai

Tiêu chíVeleroMinIO
Vai trò chínhCông cụ Backup & RestoreHệ thống Lưu trữ
Làm gì?Điều phối việc sao lưu, tạo snapshot, phục hồi tài nguyên K8s.Lưu trữ các file backup (và bất kỳ file nào khác) một cách an toàn.
Ví von‍Đội trưởng đội dọn nhà.Kho chứa đồ.
Tại sao dùng nó?Giải pháp backup “chuẩn ngành” cho K8s, mã nguồn mở, mạnh mẽ.Để có một kho lưu trữ giống S3 ngay tại nhà (on-premise) hoặc trong cluster.

II. Triển khai

1. Cấu hình docker-compose.yml cài đặt MiniO (Thực hiện trên nfs-server)

Cấu hình mạng để giao tiếp vói các thành phần trong cụm.

docker network create -d macvlan --subnet=10.100.1.0/24 --ip-range=10.100.1.0/28 --gateway=10.100.1.1 -o macvlan_mode=bridge -o parent=ens160 storage_network

file ~/devops/docker-compose.yml

version: '3'
services:
  minio:
    image: minio/minio
    container_name: minio
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - ./storage:/data
    environment:
      MINIO_ROOT_USER: beobeo
      MINIO_ROOT_PASSWORD: BeoBeo123@123a
    command: server --console-address ":9001" /data
    networks:
      storage_network:
	ipv4_address: 10.100.1.58
networks:
  storage_network:
    external: true

Giải thích:
storage_network Tôi đã tạo trước và cùng lớp mạng các node là 10.100.1.0/24 được mapping vào dạng macvlan . Mục đích đưa vào vậy là để các giao tiếp về network tới các thành phần trong cụm xuyên suốt ổn định và dạt hiệu năng tốt hơn
– Thực tế thì bạn nên thiết lập 1 network riêng dùng cho mục đích backup thì sẽ tối ưu hơn về hiệu năng cũng như an toàn cho hệ thống.

Cài đặt hệ thống miniO:

cd ~/devops/minio
sudo docker compose up -d

Hệ thống minio đã được cài thành công:

Truy cập vào địa chỉ: http://10.100.1.58:9001
Username: beobeo
Password: BeoBeo123@123a

2. Tạo Bucket trên MiniO.

Truy cập vào MiniO bằng IP: 10.100.1.58:9001 và tiến hành tạo bucket. Bấm Create Bucket -> Đặt tên Bucket Name và bấm Create Bucket

3. Tạo xác thực MiniO

Tại một máy khác (trong cùng lớp mạng) ở đây ta cài trên máy rancher ta cài đặt mc-client

Bước 1: Cài đặt MinoClient

wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/mc

Bước 2: Cấu hình alias kết nối đến MiniO server

# mc alias set <TÊN_ALIAS>  <ACCESS_KEY_GỐC> <SECRET_KEY_GỐC>
mc alias set beobeo-minio http://10.100.1.58:9000 beobeo BeoBeo123@123a

Added `beobeo-minio` successfully.

Bước 3: Tạo Service Account (Access Key & Secret Key mới)

# mc admin user svcacct add <TÊN_ALIAS> <TÊN_USER_SỞ_HỮU>
mc admin user svcacct add beobeo-minio beobeo
Kết quả:
Access Key: U7IFWKZHS9DPTL4FPXI9
Secret Key: bubhqJhl0rPRYzngZaNMQod23j7hZFdn9bWotJwI
Expiration: no-expiry

4. Cài đặt Velero client (Thực hiện trên node master hoặc kubectl shell Rancher)

Ta truy cập trực tiếp vào Releases · vmware-tanzu/velero để lấy bản mới nhất

# wget https://github.com/vmware-tanzu/velero/releases/download/v1.17.0-rc.1/velero-v1.17.0-rc.1-linux-amd64.tar.gz
# tar -xvf velero-*
# sudo mv velero-v1.17.0-rc.1-linux-amd64/velero /usr/local/bin

5. Cấu hình các biến MiniO

Thực hiện trên node master hoặc kubectl shell Rancher

# Cú pháp : echo -e "[default]\naws_access_key_id=YOUR_ACCESS_KEY\naws_secret_access_key=YOUR_SECRET_KEY" > ./credentials-velero hoặc
cat << EOF >./credentials-velero
[default]
aws_access_key_id=YOUR_ACCESS_KEY
aws_secret_access_key=YOUR_SECRET_KEY
EOF

Như vậy trong case của Tôi sẽ là:

# Cú pháp :
echo -e "default]\naws_access_key_id=U7IFWKZHS9DPTL4FPXI9\naws_secret_access_key=bubhqJhl0rPRYzngZaNMQod23j7hZFdn9bWotJwI" > ./credentials-velero 

6. Cài đặt Velero với MiniO làm backend lưu trữ các bản sao lưu của Kubernetes

Thực hiện trên node master hoặc kubectl shell Rancher
Chạy lệnh cài đặt velero trên k8s-master

velero install \
	--provider aws \
	--plugins velero/velero-plugin-for-aws:v1.10.0 \
	--bucket beobeo-k8s-backup \
	--namespace velero \
	--secret-file ./credentials-velero \
	--use-volume-snapshots=false \
	--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://10.100.1.58:9000

III. Sử dụng

1. Backup tài nguyên
1.1 Namespace cụ thể.
Thực hiện trên node master hoặc kubectl shell Rancher

# Backup 1 namespace cụ thể
velero backup create backup-beobeo-ecommerce-20250903 --include-namespaces beobeo-ecommerce
# Kiểm tra trạng thái của backup
velero backup describe backup-beobeo-ecommerce-20250903

1.2. Backup cả cụm k8s

velero backup create full-cluster-except-system-20250903 --exclude-namespaces kube-system,velero

Kiểm tra backup

velero backup describe full-cluster-except-system-20250903

Kiểm tra backup trên minio

Truy cập vào minio và vào bucket sẽ thấy dữ liệu backup được tạo ra.

2. Restore

2.1 Phục hồi toàn bộ từ một bản backup

velero restore create --from-backup <TÊN_BẢN_BACKUP>

Ví dụ:

velero restore describe full-cluster-except-system-20250903

2.2 Khôi phục một namespace cụ thể

Đây là trường hợp phổ biến khi bạn chỉ muốn lấy lại dữ liệu cho một ứng dụng bị lỗi

velero restore create <TÊN_RESTORE> --from-backup <TÊN_BẢN_BACKUP> --include-namespaces <TÊN_NAMESPACE>

Ví dụ:

velero restore create restore-shoppingcart-only --from-backup full-cluster-backup-2025-08-31 --include-namespaces beobeo-ecommerce

2.3 Phục hổi một namespace này sang một namespace khác

Bạn có thể phục hổi một namespace từ backup nhứng đổi tên nó thành một namespace mới. Điều này rất hữu ích khi tạo một môi trường staging/dev từ backup của production.

velero restore create <TÊN_RESTORE> \
    --from-backup <TÊN_BACKUP> \
    --namespace-mappings <NAMESPACE_CŨ>:<NAMESPACE_MỚI>

Ví dụ: Phục hồi namespace Production sang Staging

velero restore create restore-prod-to-staging --from-backup backup-production-app --namespace-mappings production:staging

Kiểm tra trạng thái phục hồi

# Xem danh sách
velero restore get

# Xem chi tiết một lần phục hồi
velero restore describe <TÊN_RESTORE>

2.4 Lập lịch Backup tự động (Scheduling)

Velero sử dụng cú pháp Cron tiêu chuẩn để lập lịch. Bạn sẽ không cần phải backup thủ công hàng ngày nữa.

Lệnh chính là velero schedule create.
Ví dụ 1: Backup toàn bộ cluster hàng ngày
Backup vào lúc 2 giờ sáng mỗi ngày và tự động xóa các bản backup cũ hơn 30 ngày (720h).

velero schedule create daily-full-backup \
--schedule="0 2 * * *" \
--ttl 720h0m0s
  • --schedule="0 2 * * *": Cú pháp Cron cho “2:00 sáng mỗi ngày”.
  • --ttl 720h0m0sRất quan trọng! Time-To-Live, thời gian tồn tại của backup. 720 giờ = 30 ngày. Giúp tự động dọn dẹp, tránh làm đầy bộ nhớ lưu trữ.

Ví dụ 2: Backup một namespace cụ thể hàng tuần
Backup namespace production vào 3 giờ sáng Chủ Nhật hàng tuần.

velero schedule create weekly-production-backup \
--schedule="0 3 * * 0" \
--include-namespaces production \
--ttl 720h0m0s

Kiểm tra lịch đã tạo:

velero schedule get

IV. Phương thức backup

1. Các phương thức backup
Cách Velero định nghĩa các phương thức này hơi khác só với các hệ thống backup truyền thống.

Full Backup (Backup toàn bộ)

  • Velero hiểu là: Sao lưu toàn bộ định nghĩa (metadata) các đối tượng Kubernetes (Deployments, Services, YMLs,..) mà bạn chỉ định
  • Thực tế: MỌI LỆNH velero backup create BẠN CHẠY ĐỀU LÀ MỘT BẢN “FULL BACKUP” đối với các tài nguyên Kubernetes. Nó sẽ kết nối tời API Server và lấy về trạng thái đầy đủ các object tại thời điểm đó.

Incremental Backup (Sao lưu gia tăng)

  • Velero hiểu là: Khái niệm này CHỈ ÁP DỤNG CHO DỮ LIỆU CỦA PERSISTENT VOLUME (PV), không áp dụng cho các object Kubernetes.
  • Cách hoạt động: Khi bạn bật tính năng snapshot cho volume, lần đầu tiên Velero sẽ tạo một bản snapshot full. Các lần backup sau đó, nó sẽ chỉ sao luwu những khối dữ liệu (data blocks) đã thay đổi kể từ lần snapshot trước đó.
  • Lợi ích: Nhanh hơn rất nhiều và cực kỳ tiết kuệm dung lượng lưu trữ
  • Lưu ý: Vì lúc cài đặt bàn dùng cờ --use-volume-snapshots=false nên hiện tại bạn chưa sử dụng tính năng này. Đây là tính năng cho các ứng dụng có trạng thái (stateful applications) như database.

Differential Backup (Sao lưu khác biệt)

  • Velero không hỗ trợ khái niệm này theo cách truyền thống. Nó chủ yếu sử dụng cơ chết Increamental cho dữ liệu của PVs

Bảng tóm tắt

LoạiVelero hiểu là…Ghi chú
FullBackup toàn bộ các object Kubernetes được chỉ định (YAMLs).Đây là mặc định cho TẤT CẢ các backup của Velero.
IncrementalChỉ áp dụng cho dữ liệu của Persistent Volume (PV). Chỉ backup các block dữ liệu thay đổi so với lần snapshot trước đó.Nhanh, tiết kiệm dung lượng. Yêu cầu storage provider hỗ trợ.
DifferentialVelero không có khái niệm này một cách rõ ràng.

Backup “toàn bộ hệ thống” không có nghĩa là bắt buộc phải dùng agent. Cả hai phương pháp (có agent và không agent) đều có thể backup toàn thể hệ thống. Sự khác biệt ở cách thứcloại dữ liệu chúng có thể xử lý.

2. Tổng quan 2 Phương pháp backup của Velero

Trong Velero, có 2 trường phải để sao lưu dữ liệu của ứng dụng (Persistent Volume):

Volume Snapshot (Không cần Agent): Nhanh và hiệu quả, là phương pháp được khuyến nghị.

File-System Backup (FSB) (Cần Agent): Linh hoạt hơn, tương thích với mọi loại lưu trữ, nhưng chậm hơn

Bảng so sánh chi tiết giữa: Snapshot vs File-System Backup

Tiêu chíVolume Snapshot (Không Agent)✅File-System Backup (Có Agent)
Tên gọi khácSnapshot, Block-level backupFSB, Restic (cũ), File-level backup
Cài đặt Velerovelero install ... (Mặc định)velero install ... --use-node-agent
Thành phần K8sChỉ có DeploymentCó Deployment và DaemonSet
Cách hoạt độngRa lệnh cho hạ tầng lưu trữ (cloud, SAN, NAS) “chụp ảnh” toàn bộ ổ đĩa ở cấp độ block.Agent trên từng node truy cập vào volume và sao chép từng file, từng thư mục.
Tốc độRất nhanhChậm hơn đáng kể
Hiệu năngÍt ảnh hưởng, thực hiện ở tầng hạ tầng.Tốn nhiều CPU và IO trên node K8s.
Loại Volume hỗ trợYêu cầu storage có CSI driver hỗ trợ snapshot (VD: AWS EBS, GCE PD, Ceph, vSphere…).Hỗ trợ mọi loại volume, kể cả hostPathlocalNFS.
Trường hợp nên dùngMặc định cho mọi trường hợp có thể. Môi trường cloud, hạ tầng lưu trữ hiện đại (CSI), CSDL lớn.Môi trường on-premise không có storage xịn, cần backup hostPathlocal volume, hoặc các hệ thống NFS cũ.
Nhược điểmPhụ thuộc vào hạ tầng lưu trữ.Chậm, tốn tài nguyên, kém nhất quán với CSDL đang ghi liên tục.

3. Vậy có cần sử dụng velero song song với cách giải pháp backup hạ tầng truyền thống như veeam hay không

Câu trả lời là CÓ, trong mội trường production quan trọng, việc sử dụng Velero song song với các giải phảp truyền thống như Veeam là một best practice

Chúng không thay thế lẫn nhau mà bổ sung cho nhau, mỗi công cụ bảo vệ một “lớp” khác nhau của hệ thống. Việc chỉ dùng một trong hai sẽ để lại những lỗ hổng rủi ro nghiêm trọng.

3.1 Bảng so sánh vai trò: Veeam vs. Velero

Hãy coi cụm Kubernetes của bạn như một ngôi nhà

Tiêu chíVeeam (Backup Hạ tầng)Velero (Backup Kubernetes)
Phạm vi (Scope)Backup toàn bộ Máy ảo (VMs) hoặc máy chủ vật lý.Backup các tài nguyên Kubernetes và dữ liệu ứng dụng (PVs).
“Nhìn thấy” gì?Nhìn thấy ổ đĩa ảo (.vmdk.vhdx), CPU, RAM của VM.Nhìn thấy DeploymentsServicesNamespacesPVCs.
Mục đích chínhPhục hồi thảm họa hạ tầng (mất VM, hỏng host ESXi).Phục hồi thảm họa ứng dụng (xóa nhầm namespace), di chuyển/sao chép ứng dụng.
Độ chi tiếtThấp (phục hồi nguyên cả VM).Rất cao (phục hồi 1 object, 1 namespace).
Ví vonBackup cả “ngôi nhà” .Backup “đồ đạc” bên trong nhà ️.

3.2 Cách sử dụng hợp lý (Chiến lược 2 lớp)

Đây là cách kết hợp chúng một cách hiệu quả trong thực tế.

3.2.1 Lớp 1: Veeam/Giải Pháp Backup Hạ Tầng Toàn Diện Khác – Lớp bảo vệ hạ tầng (Ít thường xuyên)

  • Mục tiêu: Bảo vệ nền móng của hệ thống. Dùng để phòng các kịch bản “ngày tận thế” như hỏng hệ điều hành, xóa nhầm VM, lỗi phần cứng host.
  • Tần suất: Backup ít thường xuyên hơn, ví dụ: hàng đêm hoặc hàng tuần.
  • Kịch bản sử dụng:
    • Một admin lỡ tay xóa mất VM của K8s control plane.
    • Host vật lý (ESXi) bị hỏng và làm sập tất cả các VM trên đó.
    • Hành động: Dùng Veeam để khôi phục lại các máy ảo trống về trạng thái ổn định gần nhất. Sau khi các VM đã “sống lại” và cụm K8s trống đã hoạt động, bạn sẽ dùng Velero ở bước tiếp theo.

3.2.2 Lớp 2: Velero – Lớp bảo vệ ứng dụng (Thường xuyên)

  • Mục tiêu: Phục vụ các nhu cầu vận hành hàng ngày. Bảo vệ dữ liệu và cấu hình của các ứng dụng đang chạy trên Kubernetes.
  • Tần suất: Backup thường xuyên hơn rất nhiều, ví dụ: mỗi giờ hoặc vài lần một ngày, tùy thuộc vào độ quan trọng của ứng dụng.
  • Kịch bản sử dụng:
    • Lỗi người dùng: Một developer xóa nhầm Deployment hoặc Service quan trọng. → Dùng Velero phục hồi chỉ object đó trong vài phút.
    • Dữ liệu ứng dụng bị hỏng: Một bản cập nhật lỗi làm hỏng dữ liệu trong database. → Dùng Velero phục hồi PV của database về trạng thái 1 giờ trước.
    • Sao chép/Di chuyển: Sếp yêu cầu tạo một môi trường staging giống hệt production. → Dùng Velero backup namespace production và restore nó sang namespace staging.

V. Kịch bản phục hồi thảm họa (Disaster Recovery) với Velero

Giả định toàn bộ data center bị hỏa hoạn, giờ ta phải cài phục hồi lại hệ thống dựa trên bản backup đã lưu trên Minio ở một nơi khác.

Giai đoạn 1: Chuẩn bị “Mảnh đất” mới

Trước khi phục hồi, bạn cần có một môi trường Kubernetes hoàn toàn mới, sạch sẽ.

  1. Dựng hạ tầng mới: Chuẩn bị các máy chủ (vật lý hoặc ảo) mới hoàn toàn.
  2. Dựng lại cụm Kubernetes: Cài đặt một cụm Kubernetes mới toanh trên các máy chủ đó. Cụm này phải có phiên bản Kubernetes tương đương hoặc mới hơn phiên bản của cụm cũ đã bị mất.
  3. Cài đặt công cụ cần thiết: Trên máy quản trị (admin machine), bạn cần cài đặt kubectl để kết nối tới cụm K8s mới và quan trọng nhất là cài lại Velero CLI.

Giai đoạn 2: Cài đặt Velero ở chế độ phục hồi (Restore-Only Mode)

Đây là bước cực kỳ quan trọng. Bạn không cài đặt Velero như bình thường. Bạn sẽ cài nó ở một chế độ đặc biệt để nó chỉ đọc dữ liệu từ MinIO chứ không tạo ra các bản backup mới.

1. Chuẩn bị file credentials-velero: Tạo lại file chứa access key và secret key của MinIO server.

2. Chạy lệnh velero install với cờ --restore-only:

velero install \
	--provider aws \
	--plugins velero/velero-plugin-for-aws:v1.10.0 \
	--bucket beobeo-k8s-backup \
	--secret-file ./credentials-velero \
	--use-volume-snapshots=false \
	--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://<ĐỊA_CHỈ_IP_MINIO_MỚI>:9000 \
	--restore-only
  • s3URL: Phải trỏ đến địa chỉ của MiniO server an toàn của bạn
  • --restore-only: Cờ này báo cho Velero rằng “chỉ phục hồi thôi, đừng chạy backup hay dọn dẹp gì cả”

3. Kiểm tra kết nối: Sau khi cài đặt xong, hãy kiểm tra xem Velero trên cụm mới đã “nhìn thấy” các bản backup cũ hay chưa.

velero backup get

Nếu lệnh này liệt kê ra được danh sách các bản backup cũ của bạn, bạn đã sẵn sàng để phục hồi.

Giai đoạn 3: Thực hiện phục hồi

Bây giờ là lúc “đặt lại những bức ảnh” vào ngôi nhà mới.

  1. Xác định bản backup cần phục hồi: Chọn bản backup cuối cùng và tốt nhất từ danh sách bạn vừa get được. Ví dụ: full-cluster-backup-20250903
  2. Chạy lệnh velero restore:
velero restore create restore-from-disaster --from-backup full-cluster-backup-202509031
  • restore-from-disaster: Là tên bạn đặt cho phiên phục hồi này.
  • --from-backup ...: Chỉ định rõ bản backup cần dùng.

3. Theo dõi tiến trình:

# Xem trạng thái chung 
velero restore get 
# Xem chi tiết, bao gồm các lỗi nếu có 
velero restore describe restore-from-disaster 

Quá trình này có thể mất một lúc, tùy thuộc vào số lượng tài nguyên bạn cần phục hồi.

Giai đoạn 4: Kiểm tra và xác nhận

Sau khi Velero báo Completed, bạn cần kiểm tra lại toàn bộ hệ thống để đảm bảo mọi thứ đã trở lại.

1. Kiểm tra Pods:

kubectl get pods --all-namespaces

Xen các pod ứng dụng của bạn có đang ở trạng thái Running không

2. Kiểm tra Services:

kubectl get services --all-namespaces

Đảm bảo các service đã được tạo tại và trỏ đúng vào các pod

3. Kiểm tra Ingress/ Gateway: Truy cập vào từng ứng dụng của ban từ bên ngoài thông qua tên miền để xác nhận kết nối end-to-end

4. Kiểm tra dữ liệu (Nếu có): Nếu bạn có phục hồi cả Volume, hãy đăng nhập vào ứng dụng và kiểm tra xem dữ liệu có đúng như tại thời điểm backup hay không

Sau khi hoàn thành các bước trên, hệ thống của bạn đã được phục hồi thành công từ thảm họa.

Liên hệ