[K8S Seri] Backup – Restore Cụm K8S Bằng Velero Kết Hợp Với Minio

Lưu ý bài viết này thực hiện tháng 09/2025

Tiêu chíVelero (Công cụ Sao lưu)MinIO (Hệ thống Lưu trữ)
Mục đích chínhSao lưu và Phục hồi trạng thái, cấu hình và dữ liệu của cluster Kubernetes.Lưu trữ và Truy xuất dữ liệu dưới dạng các đối tượng (object) một cách an toàn, bền bỉ.
Loại công cụCông cụ Backup & Restore, Di chuyển Cluster.Hệ thống Lưu trữ đối tượng (Object Storage).
Chức năng cốt lõi– “Chụp ảnh” tài nguyên K8s (YAML).
– Tạo snapshot cho ổ đĩa (Persistent Volumes).
– Lên lịch sao lưu tự động.
– Thực thi quá trình phục hồi.
– Lưu trữ file/dữ liệu dưới dạng object.
– Cung cấp API tương thích S3.
– Quản lý phiên bản, mã hóa dữ liệu.
– Phân phối dữ liệu trên nhiều máy chủ.
Đối tượng tác độngCác tài nguyên Kubernetes (Pods, Services, PVs, PVCs…).Các “đối tượng” dữ liệu bất kỳ (file ảnh, video, file nén, các bản backup do Velero tạo ra…).
Phụ thuộcBắt buộc phải có một nơi để cất giữ các bản sao lưu (như MinIO, AWS S3, Google Cloud Storage…).Hoạt động độc lập. Nó là nền tảng cho các công cụ khác (như Velero) sử dụng.
Ví dụ sử dụng“Tôi dùng Velero để sao lưu ứng dụng trên Kubernetes của tôi mỗi đêm và cất bản sao lưu đó vào kho.”“Tôi dùng MinIO để làm cái kho chứa các bản sao lưu do Velero tạo ra.”
Kết luận

Không cần phải lựa chọn giữa Velero và MinIO. Thay vào đó, bạn quyết định sử dụng Velero VÀ MinIO cùng nhau để tạo nên một giải pháp sao lưu Kubernetes hoàn chỉnh, mạnh mẽ và tự quản lý.

  • Velerohành động (sao lưu/phục hồi).
  • MinIOđịa điểm (nơi lưu trữ các bản sao lưu).

1.Triển Khai

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

Tùy thuộc vào điều kiện của công ty/cá nhân minio sẽ được cài đặt ở đâu.

Bài viết này đang tận dụng tài nguyên có sẵn trên rancher để tối ưu về chi phí và thời gian cài đặt

Nhắc lại 1 chút về danh sách các VM

minio:
  image: minio/minio
  container_name: minio
  restart: always
  ports:
    - "9000:9000" # MinIO API Port
    - "9001:9001" # MinIO Console Port
  volumes:
    - ./data/minio:/data
  environment:
    MINIO_ROOT_USER: hoatrancntt
    MINIO_ROOT_PASSWORD: hoatrancntt
  command: server --console-address ":9001" /data
  networks:
    VLAN88:
      ipv4_address: 192.168.9.29

Lưu ý: Trong môi trường Lab có thể sử dụng mạng ngang hàng “IP chung dãy” còn trên môi trường thực tế thì nên tách lớp ip của backup riêng để tăng cường về bảo mật.

VLAN88 –>được tạo dạng Macvlan –> nói 1 cách dễ hiểu hơn là VLAN 88 đang được brigde từ máy VM vào các docker, bên trong.

Trong server rancher –>home/username/docker-compose.yml thêm phần minio

Build thành công

Đăng nhập vào http://192.168.9.29:9001/login

1.2 Tạo Bucket trên MiniO
Tiến hành tạo bucket : bấm Create Bucket > Đặt tên Bucket tại Bucket Name và bấm Create Bucket

1.3 Kết nối các K8s tới MiniO  
Áp dụng tất cả các client trong cụm

# Cài đặt client.
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 myminio http://192.168.9.29:9000 hoatrancntt hoatrancntt
# 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 myminio hoatrancntt
#Node 01
Access Key: 3L1B2PGLWZVKOH3CQR06
Secret Key: qfrpPWbkjjbsFBTLZm1gCvkTxkdYYM0ccF7kRZDg
Expiration: no-expiry
# Node 02
Access Key: 1A7G3KQGS00HUQ830D54
Secret Key: Qq6jqFRIputzBVF9WnyMdRy+AG+jz06+HEN9dqPf
Expiration: no-expiry
# Node 03
Access Key: V87J1FORPXDXMYU8T8GK
Secret Key: VFvN4T6F0+h7nFD6B4CDGskD63Pyg9KTvQQe8QoB
Expiration: no-expiry

1.4 Cài đặt Velero client (Thực hiện trên server k8s-master-1 hoặc kubectl shell Rancher)

#Ta truy cập trực tiếp vào https://github.com/vmware-tanzu/velero/releases để 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

1.5 Cài đặt Velero với MinIO làm backend lưu trữ các bản sao lưu của K8S

[Thực hiện trên K8s Master hoặc trên Kube shell Rancher]

Mục đích: Tạo một file tên là credentials-velero chứa cặp khóa Access KeySecret Key của MinIO.

Tại sao lại có aws_?: Velero sử dụng plugin S3 của AWS để giao tiếp. Do MinIO tương thích hoàn toàn với API S3 của AWS, Velero sử dụng cùng một định dạng credentials đó để kết nối, ngay cả khi máy chủ không phải của AWS.

echo -e "[default]\naws_access_key_id=Your acess key\naws_secret_access_key=Password acess key" > ./credentials-velero

echo -e "[default]\naws_access_key_id=PU872KE9Z9H2MH59YLF6\naws_secret_access_key=qjXr7zinDnhmYaomJ6I8e8VjbR9tl2cbWruUMPMe" > ./credentials-velero

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

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

2. Backup tài nguyên của Namespace cụ thể

2.1 Backup

#Backup cho một Namspace cụ thể

velero backup create backup-hoatranlocal-ecommerce-020925 --include-namespaces hoatranlocal-ecommerce

Kiểm tra lại thông tin đã backup

velero backup describe backup-hoatranlocal-ecommerce-020925

#Backup cả cụm cluster

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

Kiểm tra trạng thái backup

2.2 Restore K8s

#Phục hồi từ một bảng backup

Lệnh này sẽ khôi phục lại tất cả tài nguyên có trong một bản backup cụ thể.

full-cluster-except-system-020925 –> là bảng backup full ở trên.

velero restore create --from-backup full-cluster-except-system-020925

#Chỉ phục hồi từ một Namspace cụ thể.

Trường hợp này là khôi phục khi một ứng dụng bị lỗi.

velero restore create --from-backup <TÊN_BẢN_BACKUP> --include-namespaces <TÊN_NAMESPACE>
velero restore create restore-hoatranlocal-ecommerce-only --from-backup full-cluster-except-system-020925 --include-namespaces hoatranlocal-ecommerce

#Phục hồi từ namespace này sang namespace khác. (Thường hay sử dụng và rất hữu ích)

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. Cực kỳ hữu ích để tạo 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 thành staging.

velero restore create restore-prod-to-staging --from-backup backup-hoatranlocal-ecommerce-020925 --namespace-mappings hoatranlocal-ecommerce:hoatranlocal-ecommerce-staging

2.3 Lập lịch tự động.

Sử dụng cú pháp Cron trong lunix để tiếp hành lập lịch backup dữ liệu hằng ngày.

Lệnh thực hiên:

# velero schedule create
Ví dụ: thực hiện sao chép dữ liệu vào lúc 1h sáng hằng ngày, thời gian lưu trữ 720h.
velero schedule create daily-full-backup\
 --schedule="0 1 * * * " \
 --ttl 720h0m0s

Thực hiện backup namespace hằng tuần vào chủ nhật, 3 giờ sáng.

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

2.4 Kịch bản phục hồi sau thảm họa.

Bài toán giả định khôi phục dữ liệu của data center bị mất dựa trên backup đã lưu trên minio ở một khu vực khác.

2.4.1. Chuẩn bị một vùng dữ liệu 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ẽ.

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

2.4.2 Cài đặt Velero ở dạng chỉ khôi phục (Restore only mode)

  • Chuẩn bị file credentials-velero: Tạo lại file chứa access key và secret key của MinIO server.
  • 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 bk-hoatranlocal-k8s
    --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

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

2.5. Thực hiện phục hồi

2.5.1 Chọn bản backup cần phục hồi từ lệnh get bên trên.

2.5.2 Chạy lệnh restore

velero restore create restore-from-disaster --from-backup <file backup của bạn>

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

2.5.4 Kiểm tra xác nhận hoàn thành

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 Xem 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
  3. Kiểm tra Ingress/Gateway: Truy cập vào ứng dụng của bạn 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.