1. 什麼是混沌工程
Chaos Engineering is the discipline of experimenting on a system in order to build confidence in the system’s capability to withstand turbulent conditions in production.
-《混沌工程原理》http://principlesofchaos.org/
混沌工程是一門在系統上進行實驗的學科,目的是建立對系統抵禦生產環境中失控條件的能力以及信心。
在2010 年 Netflix 從物理機基礎設施遷移到 AWS 過程中,爲保證 EC2 實例故障不會對業務造成影響,其團隊開發出了殺 EC2 實例的工具,這也是混沌工程的雛形。
混沌工程的行爲:通常是通過主動製造故障的方式來觀察目標服務的穩定性,從而不斷的發現服務的潛在性風險
混沌工程的目標:根據已發現的穩定性風險,建設優化策略,不斷的提高服務的穩定性。
2. 爲什麼需要混沌工程
隨着業務的發展,系統的架構也會隨之更新迭代,特別是在分佈式系統架構下服務數量變多,調用鏈路變長,服務間的依賴關係日漸複雜。對於單個服務的故障很難評估出對整個系統的影響,在系統高速迭代的過程中,如何持續性的保證系統的穩定性一直受到很大的挑戰。
混沌工程的思想是通過主動的注入故障,提前發現系統中的異常點,當發現異常點後即可對其進行改進,從而不斷的增強系統的穩定性。
這裏從四個角色來說明混沌工程的重要性:
實施混沌工程可以提早發現生產環境上的問題,提升故障應急處理效率、梳理服務間的強弱依賴關係、驗證預案有效性等等,逐漸建設具有韌性的高可用系統。
3. 混沌工程產品
目前收集在CNCF全景視圖混沌工程分類下的開源產品:
-
其中Chaos Mesh是由PingCAP團隊開源的一款雲原生混沌工程平臺,Chaos Mesh 起源於 TiDB 的核心測試平臺
-
另一款ChaosBlade混沌工程平臺本文將重點介紹
4. ChaosBlade-混沌之刃
4.1 介紹
ChaosBlade 中文名混沌之刃,起初是由阿里巴巴開源的一款遵循混沌工程原理和混沌實驗模型的實驗注入工具,提供了豐富的故障注入場景。
後來在2021年重磅開源混沌工程平臺ChaosBlade Box,ChaosBlade-Box是一款面向多集羣、多語言、多環境,阿里開源的雲原生混沌工程控制檯。主要功能有:提供混沌實驗用戶界面、混沌工程工具部署(ChaosBlade、LitmusChaos...)、支持實驗場景管理和多維度實驗等
ChaosBlade是故障注入工具集,基於統一的故障模型,對目標發起攻擊,目前支持的實驗場景如下:
ChaosBlade按照不同的故障場景按照領域封裝成不同的項目,目前包含的項目:
-
chaosblade:混沌實驗管理工具,包含創建實驗、銷燬實驗、查詢實驗、實驗環境準備、實驗環境撤銷等命令,是混沌實驗的執行工具,執行方式包含 CLI 和 HTTP 兩種。提供完善的命令、實驗場景、場景參數說明,操作簡潔清晰。
-
chaosblade-spec-go: 混沌實驗模型 Golang 語言定義,便於使用 Golang 語言實現的場景都基於此規範便捷實現。
-
chaosblade-exec-os: 基礎資源實驗場景實現。
-
chaosblade-exec-docker: Docker 容器實驗場景實現,通過調用 Docker API 標準化實現。
-
chaosblade-exec-cri: 容器實驗場景實現,通過調用 CRI 標準化實現。
-
chaosblade-operator: Kubernetes 平臺實驗場景實現,將混沌實驗通過 Kubernetes 標準的 CRD 方式定義,很方便的使用 Kubernetes 資源操作的方式來創建、更新、刪除實驗場景,包括使用 kubectl、client-go 等方式執行,而且還可以使用上述的 chaosblade cli 工具執行。
-
chaosblade-exec-jvm: Java 應用實驗場景實現,使用 Java Agent 技術動態掛載,無需任何接入,零成本使用,而且支持卸載,完全回收 Agent 創建的各種資源。
-
chaosblade-exec-cplus: C++ 應用實驗場景實現,使用 GDB 技術實現方法、代碼行級別的實驗場景注入。
4.2 使用方式
Chaosblade 是一個二進制的工具包,可以在命令行中直接執行blade命令來創建故障,以CPU故障舉例:
# 已創建 CPU 滿載實驗舉例
blade create cpu load
# 返回結果如下
{"code":200,"success":true,"result":"beeaaf3a7007031d"}
# code 的值等於 200 說明執行成功,其中 result 的值就是 uid。使用 top 命令驗證實驗效果
Tasks: 100 total, 2 running, 98 sleeping, 0 stopped, 0 zombie
%Cpu0 : 21.3 us, 78.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 20.9 us, 79.1 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 20.5 us, 79.5 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 20.9 us, 79.1 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
其他故障場景在這裏就不一一列舉了,想了解更多故障場景使用方法可參考:https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/
4.3 小結
ChaosBlade 本質上是一個故障注入的工具集,它提供了故障注入,故障銷燬,狀態查詢等多種能力,也支持多種故障場景例如:基礎資源、java、docker、k8s等。
但是缺點也比較明顯,它沒有可視化的界面,也不能對故障場景進行管理,多個故障注入也沒有編排能力,每一次故障注入都需要先到目標機器上安裝ChaosBlade等等,這對於真正的落地使用混沌工程來說還是有很多挑戰的。
5. ChaosBlade Box
5.1 介紹
爲了解決上面提到的問題,在2021年重磅開源混沌工程平臺ChaosBlade-Box,提供統一的可視化界面,並提供演練場景,經驗庫,應用管理,探針管理,演練編排等功能。
5.2 UI
以下是在ChaosBlade-Box平臺上進行一次演練的全過程,支持串行、並行兩種流程編排,通過多種安全策略保證演練得到恢復,如手動觸發和自動停止,自動停止通過在演練配置的時候設置超時參數來進行配置,這樣即便平臺和探針(Agent)失聯,無法進行手動停止時,也能在超時時間到達的時候,自動恢復故障。
5.3 小結
ChaosBlade Box是混沌工程演練平臺,主要解決了ChoasBlade工具集的痛點,提供可視化管理故障、編排執行故障的能力,並支持探針管理從此不再需要到每一個節點上安裝ChoasBlade,大大提升故障注入的效率以及易用性。
6. ChaosBlade-架構
在ChasoBlade Box開源後,ChaosBlade的整體架構中主要包括以下幾個組件:
-
ChaosBlade-Box Console:ChaosBlade可視化組件,主要提供一套用戶友好的Web界面,用戶可以通過該界面進行混沌工程實驗的編排與操作管理。
-
ChaosBlade-Box Server:核心邏輯組件,主要負責混沌工程實驗的管理與編排,探針與應用管理。包括組件,Chaos Engine:演練引擎,包括流程編排、安全管控、演練報告等功能;Chaos Runner:演練執行器,兼容多種執行工具;Chaos Experinece:演練經驗庫等。
-
Agent:核心邏輯組件,部署在用戶終端的主機或Kubernetes集羣內,主要負責和ChaosBlade-Box Server建聯上報心跳並作爲命令下發通道。
-
ChaosBlade:主要執行工具,能在主機和Kubernetes等不同環境上執行故障注入,能對系統網絡設備、文件系統、內核及系統上運行的應用等進行故障干擾。
7. 總結
通過混沌工程可以主動發現系統的中的潛在問題,從而對其進行優化,不斷的提升系統的穩定性。ChaosBlade是一款遵循混沌工程理念的開源產品,其中主要包含ChaosBlade Tool(提供豐富的故障場景注入能力)以及ChaosBlade Box提供可視化的混沌工程實施平臺。
8. 作者介紹
張斌斌(Github 賬號:binbin0325,公衆號:檸檬汁Code)Sentinel-Golang Committer 、ChaosBlade Committer 、 Nacos PMC 、Apache Dubbo-Go Committer。目前主要關注於混沌工程、中間件以及雲原生方向。