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。