K8S組態備份還原說明.md
採用邏輯與組態全面抽離設計,確保備份架構未來可跨環境移植(可直接移轉至測試或生產機)。 環境變數組態檔 標準儲存路徑:/etc/k8s-backup.env 安全防護:必須執行 sudo chmod 600 /etc/k8s-backup.env,防堵非 root 使用者窺探儲存架構。Ini, TOML ===================================================================== K8s 每日自動化備份 - 獨立環境變數組態設定檔 ===================================================================== 備份目的地絕對路徑 (可改為外接硬碟、NAS 掛載點等)BACKUP_ROOT="/home/brassaikao/k8s_backups" 舊備份歷史檔案保留天數 (超過此天數的資料夾將自動滾動清理)KEEP_DAYS=2 MicroK8s 二進位執行檔標準路徑MICROK8S_BIN="/snap/bin/microk8s" K8s 底層實體 Persistent Volume 儲存目錄K8S_STORAGE_DIR="/var/snap/microk8s/common/default-storage/" 核心備份維運腳本 標準儲存路徑:/usr/local/bin/k8s-daily-backup.sh 安全防護:必須執行 sudo chmod +x /usr/local/bin/k8s-daily-backup.sh。Bash#!/bin/bash ===================================================================== K8s 每日在線全自動熱備份腳本 (本機保底最新 + 外接歷史備份雙軌版) ===================================================================== 1. 載入外部環境變數設定ENV_FILE="/etc/k8s-backup.env"if -f "$ENV_FILE" ; then source "$ENV_FILE"else echo "❌ $(date '+%T') 錯誤:找不到環境變數設定檔 $ENV_FILE" >&2 exit 1fiTODAY=$(date +%F) 本地端備份目錄與當天目標目錄LOCAL_BACKUP_ROOT="$BACKUP_ROOT"LOCAL_TARGET_DIR="$LOCAL_BACKUP_ROOT/k8s_backup_$TODAY" 外接裝置路徑EXTERNAL_ROOT="/run/media/brassaikao/Transcend"EXTERNAL_TARGET_DIR="$EXTERNAL_ROOT/k8s_backup_$TODAY"echo "=== $(date '+%T') 開始執行 K8s 全叢集每日在線備份 ===" --------------------------------------------------------------------- 第一階段:一律先在「本地端」建立最新的備份 ---------------------------------------------------------------------echo "📂 正在本地建立備份目錄..."mkdir -p "$LOCAL_TARGET_DIR" 結構備份:在線匯出全叢集 YAMLecho "📦 本地 正在匯出叢集組態設定 (YAML)..."$MICROK8S_BIN kubectl get all,pvc,ingress,configmap,secret,clusterrole,clusterrolebinding -A -o yaml > "$LOCAL_TARGET_DIR/cluster-config-all.yaml" 實體備份:在線熱打包 PVCecho "💾 本地 正在在線打包所有 PVC 實體資料..."sudo tar -czvf "$LOCAL_TARGET_DIR/pvc-data-all.tar.gz" -C "$K8S_STORAGE_DIR" . >/dev/null 2>&1 備份維運核心組態、腳本、排程與家目錄 Manifestsecho "⚙️ 本地 正在備份維運參數、腳本、Crontab 與設計圖..."sudo cp "$ENV_FILE" "$LOCAL_TARGET_DIR/k8s-backup.env.bak"sudo cp /usr/local/bin/k8s-daily-backup.sh "$LOCAL_TARGET_DIR/k8s-daily-backup.sh.bak" 2>/dev/null || truesudo cp /usr/local/bin/k8s-image-archive.sh "$LOCAL_TARGET_DIR/k8s-image-archive.sh.bak" 2>/dev/null || truesudo crontab -l > "$LOCAL_TARGET_DIR/root-crontab.bak" 2>/dev/nullsudo tar -czvf "$LOCAL_TARGET_DIR/home-k8s-manifests.tar.gz" -C /home/brassaikao k8s-manifests >/dev/null 2>&1 --------------------------------------------------------------------- 第二階段:偵測外接裝置,若存在則「複製一份」過去 ---------------------------------------------------------------------USING_EXTERNAL=falseif -d "$EXTERNAL_ROOT" && -w "$EXTERNAL_ROOT" ; then echo "💾 $(date '+%T') 偵測到外接儲存裝置,正在同步備份至外接硬碟..." # 複製本機剛做好的備份到外接硬碟 mkdir -p "$EXTERNAL_TARGET_DIR" cp -a "$LOCAL_TARGET_DIR/." "$EXTERNAL_TARGET_DIR/" if $? -eq 0 ; then USING_EXTERNAL=true echo "✅ 外接裝置同步完成!" else echo "❌ $(date '+%T') 警告:同步至外接裝置失敗,請檢查硬碟空間。" >&2 fielse echo "⚠️ $(date '+%T') 未偵測到外接裝置(或無寫入權限),略過外接備份。"fi --------------------------------------------------------------------- 第三階段:雙軌滾動清理 --------------------------------------------------------------------- 1. 本地端:永遠只留最新的一份(刪除除了剛剛建立的本地目錄以外的所有舊備份)echo "🧹 本地端 正在清理,僅保留最新一份備份..."find "$LOCAL_BACKUP_ROOT" -maxdepth 1 -type d -name "k8s_backup_*" ! -path "$LOCAL_TARGET_DIR" -exec rm -rf {} \; 2. 外接端:若有成功寫入外接硬碟,則針對外接硬碟執行 KEEP_DAYS 保留if "$USING_EXTERNAL" = true ; then echo "🧹 外接端 正在檢查並清理 $EXTERNAL_ROOT 中 $KEEP_DAYS 天前的舊備份..." find "$EXTERNAL_ROOT" -maxdepth 1 -type d -name "k8s_backup_*" -mtime +$KEEP_DAYS -exec rm -rf {} \;fiecho "==== ✅ $(date '+%T') 雙軌備份與自我組態備份順利完成! ====" 系統層級 Crontab 定時排程為確保具備完整權限調用底層實體硬碟資料,定時任務必須登錄在系統 root 管理員排程表中。 登錄命令:sudo crontab -e 排程宣告(每天凌晨 02:00 執行,並留下完整運維日誌): Plaintext 0 2 * * * /usr/local/bin/k8s-daily-backup.sh >> /var/log/k8s-daily-backup.log 2>&1 維運組態資產(腳本與設定檔)一次性備份 當面臨作業系統重大升級、更換硬碟、或需要跨機器遷移維運工具時,可使用本快照指令。一鍵打包維運資產命令:Bashsudo tar -czvf ~/k8s_infra_backup_$(date +%F).tar.gz /usr/local/bin/k8s-daily-backup.sh /etc/k8s-backup.env 備份標的:包含核心備份邏輯腳本與專屬環境變數設定檔。 資安稽核規範:若將此類資產移轉至 Git 庫(如 GitHub/GitLab),嚴禁將 .env 實體檔案推上雲端。應改為建立 k8s-backup.env.example 範本,實體密鑰金鑰則應妥善保管於企業密碼管理器(如 Bitwarden/1Password)中。

Leave a comment