Tự Động Backup Database Kubernetes (K8s) Lên Google Drive Bằng Rclone
Xây dựng hệ thống tự động trích xuất dữ liệu (dump) từ các Pod Database (MySQL) đang chạy trong Kubernetes, nén lại và tải lên Google Drive. Hệ thống có khả năng tự động báo lỗi và dọn dẹp các bản sao lưu cũ (Retention Policy) để tối ưu dung lượng.
⚙️ Bước 1: Cài đặt và kết nối Rclone với Google Drive
-
Cài đặt Rclone trên VPS: Mở Terminal trên VPS và chạy lệnh:
Bashcurl https://rclone.org/install.sh | sudo bash -
Cấu hình kết nối (Thiết lập Headless): Gõ lệnh
rclone configvà làm theo các bước sau:-
Bấm
n(New remote) -> Đặt tên làgdrive. -
Chọn loại lưu trữ là
drive(Google Drive). -
Các mục
client_id,client_secret,service_account_file-> Để trống (Enter). -
Cấp quyền truy cập: Chọn
1(Full access). -
Hỏi
Edit advanced config?-> Chọnn. -
ĐẶC BIỆT LƯU Ý: Hỏi
Use web browser to automatically authenticate...?-> BẮT BUỘC chọnn(Vì VPS không có trình duyệt web).
-
-
Xác thực Token:
-
VPS sẽ sinh ra một lệnh dạng
rclone authorize "drive" "...". -
Mở Terminal trên máy tính cá nhân (Mac/Windows đã cài sẵn rclone), dán lệnh đó vào và chạy.
-
Trình duyệt web trên máy tính sẽ mở ra để bạn đăng nhập Google. Đăng nhập xong, Terminal máy tính sẽ trả về một chuỗi Token rất dài.
-
Copy toàn bộ chuỗi Token đó, quay lại dán vào VPS và ấn Enter.
-
Chọn
nở mục Share Drive. Nhấnyđể xác nhận cấu hình vàqđể thoát.
-
-
Kiểm tra kết nối:
rclone lsd gdrive:(Nếu màn hình hiện ra danh sách các thư mục trên Drive của bạn tức là đã thành công 100%).

💻 Bước 2: Viết kịch bản Backup "Bọc Thép"
Kịch bản này được thiết kế để hút dữ liệu từ cả 2 hệ thống: Web SMM (PHP) và hệ thống com.quyenlt (Java), đồng thời kiểm soát lỗi chặt chẽ.
-
Tạo file script trên VPS:
vi /root/backup-db.sh -
Dán đoạn mã chuẩn sau vào và lưu lại (các bạn nhớ kiểm tra và thay đổi lại thông tin database của mình nhé). Ở script này mình đang thiết lập chỉ giữ lại 7 bản gần nhất và tí nữa sẽ set cron chạy 2 ngày 1 lần, nên mình sẽ xóa các bản backup được tạo hơn 14 ngày :
#!/bin/bash # 1. Cài đặt biến thời gian và thư mục DATE=$(date +"%Y-%m-%d_%H-%M") BACKUP_DIR="/root/db_backups" mkdir -p $BACKUP_DIR echo "=================================================" echo "BẮT ĐẦU TIẾN TRÌNH BACKUP LÚC $DATE" echo "=================================================" # Biến cờ hiệu theo dõi trạng thái STATUS_SMM="FAIL" STATUS_JAVA="FAIL" # 2. Hút data của Web SMM SMM_POD=$(kubectl get pods -l app=smm-db -o jsonpath="{.items[0].metadata.name}" 2>/dev/null) if [ -n "$SMM_POD" ]; then if kubectl exec $SMM_POD -- mysqldump -utobi -p"12345pass" smmtobi > $BACKUP_DIR/smm_db_$DATE.sql 2>/tmp/smm_error.log; then echo "✅ [SMM DB]: Dump dữ liệu THÀNH CÔNG!" STATUS_SMM="OK" else echo "❌ [SMM DB]: LỖI khi dump dữ liệu! Chi tiết lỗi:" cat /tmp/smm_error.log fi else echo "❌ [SMM DB]: KHÔNG TÌM THẤY POD!" fi # 3. Hút data của Web com.quyenlt (Java) JAVA_POD=$(kubectl get pods -l app=mysqldb -o jsonpath="{.items[0].metadata.name}" 2>/dev/null) if [ -n "$JAVA_POD" ]; then if kubectl exec $JAVA_POD -- mysqldump -uroot -p"12345pass" quyenlt > $BACKUP_DIR/java_db_$DATE.sql 2>/tmp/java_error.log; then echo "✅ [JAVA DB]: Dump dữ liệu THÀNH CÔNG!" STATUS_JAVA="OK" else echo "❌ [JAVA DB]: LỖI khi dump dữ liệu! Chi tiết lỗi:" cat /tmp/java_error.log fi else echo "❌ [JAVA DB]: KHÔNG TÌM THẤY POD!" fi # 4. Kiểm tra, Nén và Upload if [ "$STATUS_SMM" = "OK" ] || [ "$STATUS_JAVA" = "OK" ]; then TAR_FILE="$BACKUP_DIR/all_databases_$DATE.tar.gz" cd $BACKUP_DIR tar -czvf $TAR_FILE *.sql > /dev/null 2>&1 echo "⏳ Bắt đầu upload lên Google Drive..." if rclone copy $TAR_FILE gdrive:Backup_VPS/; then echo "✅ [GDRIVE]: Upload THÀNH CÔNG!" else echo "❌ [GDRIVE]: LỖI khi upload lên Google Drive!" fi else echo "⚠️ [CẢNH BÁO]: Cả 2 Database đều lỗi, hủy bỏ nén và upload!" fi # 5. Dọn dẹp rác trên VPS (Giữ file local 14 ngày) rm -f $BACKUP_DIR/*.sql find $BACKUP_DIR -type f -name "*.tar.gz" -mtime +14 -delete # 6. Dọn dẹp rác trên Google Drive (Xóa file Cloud cũ hơn 14 ngày) echo "⏳ Đang dọn dẹp file cũ trên Google Drive..." if rclone delete gdrive:Backup_VPS/ --min-age 14d; then echo "✅ [GDRIVE]: Đã dọn sạch các bản backup cũ hơn 14 ngày!" else echo "⚠️ [GDRIVE]: Lỗi dọn dẹp (Hoặc chưa có file quá hạn)." fi echo "=================================================" echo "HOÀN TẤT TIẾN TRÌNH LÚC $(date +"%Y-%m-%d_%H-%M")" echo "=================================================" -
Cấp quyền thực thi cho kịch bản:
chmod +x /root/backup-db.sh

⏰ Bước 3: Thiết lập tự động hóa (Crontab)
Cài đặt lịch trình để VPS tự động chạy kịch bản 2 ngày 1 lần vào lúc 2:00 sáng.
-
Mở trình quản lý Cron:
crontab -e -
Thêm dòng lệnh sau vào cuối file:
0 2 */2 * * /root/backup-db.sh >> /root/backup_cron.log 2>&1 -
Lưu và thoát. (Để kiểm tra log sau khi hệ thống chạy tự động, sử dụng lệnh:
cat /root/backup_cron.log)