Chaos Engineering 簡介
在分散式雲端環境中,故障是不可避免的。混沌工程 (Chaos Engineering) 是一門對系統進行實驗的學科,目的是建立對系統承受生產環境中動盪條件能力的信心。我們與其等待災難發生,不如主動注入故障來觀察系統的反應。
對於 Professional Cloud Architect 來說,Chaos Engineering 是從「希望系統可靠」轉向「證明系統具備韌性」的過程。
白話文解釋 Chaos Engineering
比喻 1 — 疫苗接種
Chaos Engineering 就像是疫苗。你將微量且受控的「病毒」(故障)注入體內(系統),以訓練免疫系統(自我修復機制)。這樣一來,當真正的「病毒」(重大停機)襲來時,身體已經準備好與之對抗,而不會生病。
比喻 2 — 消防演習
Chaos Engineering 是不預先通知的消防演習。如果你只在大家都知道演習即將到來時才進行練習,你將無法得知人們在真正遇到濃煙時會如何反應。透過出其不意地(以受控的方式)拉響警報,你可以發現逃生出口是否被堵塞,或是警報聲是否太小而聽不見。
比喻 3 — 撞擊測試
汽車製造商不只是「希望」汽車是安全的。他們會進行撞擊測試。他們故意讓汽車撞上牆壁(故障注入),以觀察安全氣囊是否彈出以及車架是否保護了乘客。Chaos Engineering 就是針對你的軟體架構進行的撞擊測試。
Chaos 實驗或真實故障所影響的範圍。Chaos Engineering 的一個關鍵原則是最小化爆炸半徑,以防止意外導致生產環境停機。
Chaos Engineering 的原則
- 定義「穩態 (Steady State)」: 了解「正常」情況下的表現(例如:99.9% 的成功率,延遲 <200ms)。
- 提出假設: 預測注入故障時會發生什麼(例如:「如果執行個體 A 故障,執行個體 B 將在 5 秒內接管」)。
- 注入故障: 引入現實世界中的事件,如伺服器當機、網路延遲或格式錯誤的資料。
- 觀察與學習: 系統是否恢復到穩態?假設是否成立?
- 修復弱點: 如果系統失敗,請改進架構(例如:增加冗餘、實作斷路器)。
穩態 (Steady State) 必須定義為可量測的業務指標(例如 Cloud Monitoring SLO availability >= 99.9%、p99 latency < 200ms),而不是 CPU 之類的系統指標。如果你的假設是「刪除一個 GKE node 不會讓 order-success SLI 掉到 99.5% 以下」,就可以用 Cloud Monitoring 的硬數據來證實或推翻韌性,而不是憑感覺判斷。
在 Google Cloud 上進行 Chaos Engineering
- GKE 韌性: 使用 Chaos Mesh 或 Gremlin(第三方)等工具來刪除 Pod、耗盡節點的 CPU,或模擬命名空間之間的網路延遲。
- Compute Engine: 故意刪除受管理執行個體群組 (Managed Instance Group, MIG) 中的執行個體,以測試自動修復 (Auto-healing) 和自動調整規模 (Auto-scaling) 的行為。
- 網路: 使用 Firewall Rules 模擬區域 (Region) 或可用區 (Zone) 之間的連線中斷,以測試容錯移轉 (Failover) 邏輯。
測量與最小化爆炸半徑 (Blast Radius)
Chaos Engineering 最大的恐懼是真正破壞了生產環境。為了防止這種情況:
- 從小規模開始: 先在預備環境 (Staging environment) 中開始。
- 金絲雀測試 (Canary Testing): 僅對小部分使用者運行實驗。
- 停止按鈕: 務必設有一個「大紅鈕 (Big Red Button)」,以便在情況惡化時立即中止實驗並恢復系統。
架構師洞察: 在 PCA 考試中,如果情境詢問如何「驗證多區域 (Multi-Regional) DR 計畫的可靠性」,最佳答案是定期進行 Chaos 實驗(如演練日 Game Days),而不僅僅是「審查文件」。 ::
GCE 故障注入測試 (Fault Injection Testing)
Compute Engine 提供多種第一方工具,可以在不依賴第三方工具的情況下,安全地注入基礎架構層的故障。
透過 MIG 注入執行個體層級故障
Managed Instance Group (MIG) 搭配 autohealing 是最簡單的 chaos 測試目標。經典實驗如下:
- 定義穩態: L7 Load Balancer backend
healthy_backend_count >= 4、請求成功率 >= 99.9%。 - 注入故障: 對 MIG 中隨機一個成員執行
gcloud compute instances delete instance-1 --zone=us-central1-a。 - 觀察: MIG 的 autohealer 應該在設定的
initialDelaySec內,根據 instance template 重新建立執行個體。Cloud Load Balancing 應透過connection_draining_timeout_sec平滑地清空連線。 - 學習: 如果成功率掉到 99.9% 以下,代表 MIG 規模太小或 health check 的
unhealthyThreshold太激進。
模擬可用區與區域層級故障
要進行更大爆炸半徑的實驗,可以使用 VPC Firewall Rules 來「隔離」一個 zone:
gcloud compute firewall-rules create chaos-block-zone-a \
--direction=INGRESS --action=DENY --rules=tcp \
--source-ranges=0.0.0.0/0 --target-tags=zone-a-instances
這可以驗證 Regional MIG 是否正確地將流量重新分配到存活的 zone(us-central1-b、us-central1-c),以及 Cloud DNS failover 政策是否在預期的 TTL 時間內生效。
磁碟與快照恢復演練
從一台運行中的 VM 卸載 Persistent Disk(gcloud compute instances detach-disk),可以驗證應用程式是否能優雅地處理 I/O 錯誤,以及 Snapshot Schedule 還原程序是否符合 RTO 目標。請將還原時間記錄在事後回顧 (post-mortem) 中,讓團隊有實際數據而非估計值。
Cloud Deploy 金絲雀部署故障測試
Cloud Deploy 負責將應用程式持續交付到 GKE、Cloud Run 與 Anthos 目標。它的 canary(金絲雀) 策略本身就是一種 chaos engineering 原則 — 你刻意把有問題的版本提供給一小部分流量,藉此驗證 rollback 安全機制是否運作。
設定金絲雀驗證階段 (Verification Phase)
DeliveryPipeline 採用 canary 策略時,可以定義漸進式階段(10%、25%、50%、100%),每個階段都明確設定 verify 步驟。搭配 Cloud Deploy automation rules(promoteRelease、repair),讓系統做到:
- 如果
verify工作失敗(Cloud Build job 退出碼非零、Skaffold custom test 失敗),rollout 自動 rollback 回前一個Release。 - 如果金絲雀階段在 dwell time 結束後 Cloud Monitoring 沒有觸發告警,automation 會自動推進到下一階段。
刻意製造失敗的實驗
要證明安全機制有效,就刻意在 staging 環境部署一個「壞掉」的金絲雀:
- 錯誤設定實驗: 推送一個 Release,container 的
readinessProbe路徑故意設錯。驗證 Cloud Deploy 是否在progressDeadlineSeconds內偵測到不健康的 pod 並觸發repair。 - SLO 退化實驗: 推送一個會多睡 500ms 的版本。Cloud Monitoring 的 SLO burn-rate 告警應該要觸發,下一階段的
pre-deployhook 應該要拒絕推進。
常見的架構陷阱:為了「省 10 分鐘」,把生產環境 Cloud Deploy 的 verify 階段關掉。下次部署出問題時,唯一的回退路徑只剩手動 gcloud deploy rollouts rollback,在壓力下往往要花 20 至 30 分鐘。請務必保留 verify 並持續測試 — 你該做的是測量 verify 耗時,而不是把它砍掉。
Spanner 與多區域 GCS 的區域容錯演練
GCP 架構中最大的可靠性宣稱都在多區域儲存 — nam-eur-asia1 Spanner 執行個體、nam4 GCS dual-region、multi-region BigQuery。這些都需要定期演練,不能只是相信 SLA。
Cloud Spanner 多區域容錯演練
多區域 Spanner 設定(例如 nam3 = us-east4 + us-east1 + witness)可以在單一區域失效時透明地維持服務。要驗證它:
- 穩態: Spanner client p99 commit latency < 100ms、錯誤率 < 0.01%,從第三個區域(例如
us-central1)跑的 workload generator 來測量,避免量測偏差。 - 注入故障: 使用 VPC Firewall Rules 或移除 Private Service Connect endpoint,阻斷應用程式連到 read-write region。Spanner clients 應該會透明地路由到下一個 replica。
- 驗證: 延遲可能短暫飆高,但寫入不應該失敗。
spanner.googleapis.com/api/request_count指標依replica_type分組可以看到流量轉移。
Spanner 容錯演練必須從失效區域外部測量 — 否則 workload generator 會跟著區域一起掛掉,導致你誤判為「瞬間恢復」。要把 load generator 跑在第三個區域(如果你封鎖了 us-east4,就放在 us-central1),並從那裡繪製 p99 latency 圖。同時不要選 leader region 流量自然偏低的時間來演練;要挑能代表典型負載的時段,這樣延遲變化才看得出來。
多區域 GCS Bucket 容錯
對於設定了 turbo replication 的 dual-region GCS bucket(nam4 = us-central1 + us-east1),RPO 為 15 分鐘。演練步驟:
- 使用 deny-all 防火牆,或從 VM 透過
gcloud storage --impersonate-service-account(該 service account 的 IAM 只授權給其中一個區域)。 - 確認應用程式 client library 的 retry policy(
storage.Client(retry=...))能在區域阻斷下存活,且不會把錯誤暴露給使用者。 - 比對演練前後的
storage.googleapis.com/replication/missing_dest_object_count,驗證 turbo replication 是否追上。
把區域容錯演練排在每季的第一個星期三,並在 on-call 團隊的行事曆上設成定期事件。PCA 考試偏好那種團隊有證據(在 Cloud Logging 中留有每季演練紀錄)證明 DR 確實可行的答案,而不是只有一份書面 runbook。請把演練節奏當作合約義務,而不是「有空才做」。
事後回顧文化與演練日 (Game Days)
Chaos Engineering 只有在組織能消化學習成果時才會產生訊號。能把迴圈閉合起來的兩個組織實踐:blameless post-mortem 與 Game Day。
Blameless 事後回顧流程
GCP 上有用的事後回顧應該引用實際 artifacts,而不是個人意見:
- Cloud Logging 連結指向衝擊發生的時刻(使用
timestamp >= "2026-05-12T10:00:00Z" AND severity >= ERROR)。 - Cloud Monitoring 儀表板快照,顯示 SLI 退化與恢復過程。
- Error Reporting 群組 ID,列出事件期間飆升的錯誤。
- 行動項目以 Cloud Build issue 或 Jira ticket 開立,指派負責人與到期日。
Blameless 思維聚焦在系統缺口(「autoscaler 花了 4 分鐘才反應」),而非個人(「工程師推了錯誤的設定」)。這樣才能解鎖誠實回報,並讓下一輪 chaos 實驗可以針對的架構問題浮上檯面。
Game Day 的運作機制
一個 Game Day 是 2 至 4 小時的預定演練,由一個團隊設計情境,另一個團隊在毫無預警下進行回應。
- 情境設計: 「14:00 將刪除 Cloud SQL
prod-orders的 read replica。Tier-1 服務必須維持可用。」 - 角色分工: Incident Commander、Communications Lead、Subject Matter Experts、Observers(負責記錄供事後回顧使用)。
- 工具: 用實際的 on-call 頻道執行演練,使用真實的 Cloud Monitoring 告警。不要「模擬」通知 — 收到真實 PagerDuty 通知的摩擦本身就是測試的一部分。
Chaos Engineering 五大原則(依 PCA 考試順序): (1) 圍繞穩態 (steady state) 行為建立假設,(2) 變化真實世界事件,(3) 在生產環境執行實驗(最終要做到),(4) 自動化實驗以持續執行,(5) 最小化爆炸半徑 (blast radius)。考試經常測第 5 條 — 「如何安全地開始 chaos 測試」的正確答案永遠是「先最小化爆炸半徑」,而不是「先在生產環境測試」。
FAQ — Chaos Engineering 與韌性
Q1. Chaos Engineering 與測試 (Testing) 相同嗎?
不完全相同。傳統測試檢查程式碼是否按照預期執行(輸入 A -> 輸出 B)。Chaos Engineering 則是探索系統在壓力下的表現等未知領域(故障 X -> 系統穩定性?)。
Q2. 我們應該在生產環境中進行 Chaos 實驗嗎?
最終是需要的。在預備環境中測試很好,但預備環境永遠無法完美匹配生產環境的規模和複雜性。但是,只有在你對預備環境的結果有信心並擁有嚴格的「停止按鈕」時,才轉向生產環境。
Q3. 什麼是「斷路器 (Circuit Breaker)」?
斷路器是一種軟體模式,當達到特定的錯誤閾值時,它會停止服務嘗試呼叫發生故障的依賴項。這可以防止單一故障導致整個系統發生「級聯故障 (Cascading failure)」。
Q4. 「優雅降級 (Graceful Degradation)」是如何運作的?
優雅降級意味著當系統的一部分發生故障時,系統的其餘部分仍能保持運作,但功能會有所減少。例如,如果「推薦引擎」停機,電子商務網站仍允許使用者搜尋和購買產品,但沒有個人化的建議。
Q5. 什麼是「演練日 (Game Days)」?
演練日 (Game Day) 是一個預定的活動,團隊成員聚集在一起執行 Chaos 實驗。這是一項社交與技術性的練習,旨在協作環境中練習事件回應並發現系統弱點。