K8S組態備份還原說明

K8S組態備份還原說明.md
採用邏輯與組態全面抽離設計,確保備份架構未來可跨環境移植(可直接移轉至測試或生產機)。
1. 環境變數組態檔
標準儲存路徑:/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/"
2. 核心備份維運腳本
標準儲存路徑:/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 1
fi
TODAY=$(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"
# 結構備份:在線匯出全叢集 YAML
echo "📦 [本地] 正在匯出叢集組態設定 (YAML)..."
$MICROK8S_BIN kubectl get all,pvc,ingress,configmap,secret,clusterrole,clusterrolebinding -A -o yaml > "$LOCAL_TARGET_DIR/cluster-config-all.yaml"
# 實體備份:在線熱打包 PVC
echo "💾 [本地] 正在在線打包所有 PVC 實體資料..."
sudo tar -czvf "$LOCAL_TARGET_DIR/pvc-data-all.tar.gz" -C "$K8S_STORAGE_DIR" . >/dev/null 2>&1
# 備份維運核心組態、腳本、排程與家目錄 Manifests
echo "⚙️ [本地] 正在備份維運參數、腳本、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 || true
sudo cp /usr/local/bin/k8s-image-archive.sh "$LOCAL_TARGET_DIR/k8s-image-archive.sh.bak" 2>/dev/null || true
sudo crontab -l > "$LOCAL_TARGET_DIR/root-crontab.bak" 2>/dev/null
sudo tar -czvf "$LOCAL_TARGET_DIR/home-k8s-manifests.tar.gz" -C /home/brassaikao k8s-manifests >/dev/null 2>&1
# ---------------------------------------------------------------------
# 第二階段:偵測外接裝置,若存在則「複製一份」過去
# ---------------------------------------------------------------------
USING_EXTERNAL=false
if [ -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
fi
else
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 {} \;
fi
echo "==== ✅ [$(date '+%T')] 雙軌備份與自我組態備份順利完成! ===="
3. 系統層級 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
## 維運組態資產(腳本與設定檔)一次性備份 ##
當面臨作業系統重大升級、更換硬碟、或需要跨機器遷移維運工具時,可使用本快照指令。
一鍵打包維運資產命令:
Bash
sudo 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

This site uses Akismet to reduce spam. Learn how your comment data is processed.