Chuyển đến nội dung chính

第9課:etcd 備份 & 還原

etcdctl snapshot 備份與還原。CKA 考試中的 etcd 操作。 TLS 憑證路徑與故障排除。

etcd 備份與還原流程

1. etcd — 叢集狀態儲存

etcd 儲存了 Kubernetes 叢集的所有資料:
  - Pods、Services、Deployments 的定義
  - ConfigMaps、Secrets
  - RBAC 設定
  - 叢集狀態

etcd 是唯一的持久化儲存 → 備份 etcd = 備份整個叢集

2. etcd 備份

# 方法1:etcdctl snapshot save
ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-backup.db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# 確認備份
ETCDCTL_API=3 etcdctl snapshot status /tmp/etcd-backup.db --write-table

考試重點:TLS 憑證路徑是 CKA 考試的重點。從 etcd manifest 取得正確路徑:cat /etc/kubernetes/manifests/etcd.yaml | grep -E 'cert|key|ca'。

3. 取得 TLS 憑證路徑

# 從 etcd manifest 取得
cat /etc/kubernetes/manifests/etcd.yaml

# 找到以下參數:
--cert-file=/etc/kubernetes/pki/etcd/server.crt      → --cert
--key-file=/etc/kubernetes/pki/etcd/server.key        → --key
--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt     → --cacert
--listen-client-urls=https://127.0.0.1:2379           → --endpoints

# 或用 grep 快速找到
grep -E 'cert-file|key-file|trusted-ca|listen-client' \
  /etc/kubernetes/manifests/etcd.yaml

4. etcd 還原

# 步驟1:還原 snapshot 到新目錄
ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup.db \
  --data-dir=/var/lib/etcd-restored

# 步驟2:修改 etcd manifest 的 data-dir
# 編輯 /etc/kubernetes/manifests/etcd.yaml
# 將 hostPath 改為 /var/lib/etcd-restored
# 或修改 --data-dir 參數

# 修改前:
  volumes:
  - hostPath:
      path: /var/lib/etcd
  
# 修改後:
  volumes:
  - hostPath:
      path: /var/lib/etcd-restored

# 步驟3:kubelet 會偵測到 manifest 變更並重新建立 etcd Pod
# 等待 etcd Pod 啟動
kubectl get pods -n kube-system | grep etcd

5. etcd 故障排除

# 確認 etcd 健康狀態
ETCDCTL_API=3 etcdctl endpoint health \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# 列出 etcd 成員
ETCDCTL_API=3 etcdctl member list \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

6. 速查表

任務指令
備份etcdctl snapshot save FILE --cert --key --cacert --endpoints
確認備份etcdctl snapshot status FILE --write-table
還原etcdctl snapshot restore FILE --data-dir=NEW_DIR
健康檢查etcdctl endpoint health ...
取得憑證路徑grep cert /etc/kubernetes/manifests/etcd.yaml

7. 練習題

Q1:CKA 考試中被要求備份 etcd。第一步應該做什麼?

  • A) 直接執行 etcdctl snapshot save
  • B) 從 /etc/kubernetes/manifests/etcd.yaml 取得 TLS 憑證路徑和 endpoints ✓
  • C) 停止 kubelet
  • D) 建立新的 etcd Pod

解析:etcdctl 需要 TLS 憑證和正確的 endpoint。從 etcd manifest 取得 --cert-file、--key-file、--trusted-ca-file 和 --listen-client-urls。記住 ETCDCTL_API=3。

Q2:etcd 還原後,如何讓 kubelet 使用新的資料目錄?

  • A) 重新啟動 kubelet
  • B) 修改 /etc/kubernetes/manifests/etcd.yaml 的 hostPath 指向新目錄 ✓
  • C) 執行 kubectl apply
  • D) 刪除並重新建立 etcd Pod

解析:etcd 以靜態 Pod 運行,manifest 在 /etc/kubernetes/manifests/。修改 etcd.yaml 的 volumes.hostPath 和 --data-dir 參數為還原後的新目錄。kubelet 會自動重新載入。

Q3:ETCDCTL_API=3 環境變數的作用是什麼?

  • A) 指定 etcd 伺服器版本
  • B) 使用 etcdctl v3 API(v2 和 v3 有不同的資料結構和指令) ✓
  • C) 設定連線逾時
  • D) 啟用加密

解析:etcd v2 和 v3 的 API 不同。Kubernetes 使用 v3 API 儲存資料。snapshot save/restore 指令只在 v3 API 下可用。ETCDCTL_API=3 確保使用 v3 API。