作者 | 肖長軍(穹谷) 桑傑
ChaosBlade 是阿裡巴巴 2019 年開源的混沌工程項目,已加入到 CNCF Sandbox 中。起初包含面向多環境、多語言的混沌工程實驗工具 chaosblade,到現在發展到面向多叢集、多環境、多語言的混沌工程平台 chaosblade-box,平台支援實驗工具托管和工具自動化部署,通過統一使用者實驗界面,将使用者的精力聚焦在通過混沌工程解決雲原生過程中高可用問題上。本文從混沌實驗模型抽象、混沌實驗工具開源和混沌工程平台更新項目三階段出發,詳細介紹 ChaosBlade。
在今年可信雲測評中,阿裡雲故障演練平台以最高分首批通過可信雲混沌工程平台能力要求最高等級-先進級認證。
混沌實驗模型
ChaosBlade 項目覆寫基礎資源、應用服務、容器服務等混沌實驗場景。在實驗工具設計之初就考慮了場景模型統一,便于場景擴充和沉澱,也為平台托管實驗工具實作統一場景調用提供模型依據。ChaosBlade 項目中所有的實驗場景均遵循此實驗模型設計,下面通過實驗模型的推導、介紹、意義和具體的應用來詳細介紹此模型。
1、實驗模型的推導
混沌實驗主要包含故障模拟,我們一般對故障的描述如下:
- 10.0.0.1 機器上挂載的 A 磁盤滿造成了服務不可用;
- 所有節點上的 B dubbo 服務因為執行緩慢造成上遊 A dubbo 服務調用延遲,進而造成使用者通路緩慢;
- Kubernetes A 叢集中 B 節點上 CPU 所有核使用率滿載,造成 A 叢集中的 Pod 排程異常;
- Kubernetes C 叢集中 D Pod 網絡異常,造成 D 相關的 Service 通路異常。
通過上述,我們可以使用以下句式來描述故障:因為某某機器(或叢集中的資源,如 Node,Pod)上的哪個元件發生了什麼故障,進而造成了相關影響。我們也可以通過下圖來看故障描述拆分:

可以通過這四部分來描述現有的故障場景,所有我們抽象出了一個故障場景模型,也稱為混沌實驗模型。
2、實驗模型的介紹
此實驗模型較長的描述如下:
- Scope: 實驗實施範圍,指具體實施實驗的機器、叢集及其資源等。
- Target: 實驗靶點,指實驗發生的元件。如基礎資源場景中的 CPU、網絡、磁盤等,Java 場景中的應用元件如 Dubbo、Redis、RocketMQ、JVM 等,容器場景中的 Node、Pod、Container自身等。
- Matcher: 實驗規則比對器,根據所配置的 Target,定義相關的實驗比對規則,可以配置多個。由于每個 Target 可能有各自特殊的比對條件,比如 RPC 領域的 Dubbo、gRPC 可以根據服務提供者提供的服務和服務消費者調用的服務進行比對,緩存領域的 Redis,可以根據 set、get 操作進行比對。還可以對 matcher 進行擴充,比如擴充實驗場景執行政策,控制實驗觸發時間。
- Action: 指實驗模拟的具體場景,Target 不同,實施的場景也不一樣,比如磁盤,可以演練磁盤滿,磁盤 IO 讀寫高,磁盤硬體故障等。如果是應用,可以抽象出延遲、異常、傳回指定值(錯誤碼、大對象等)、參數篡改、重複調用等實驗場景。如果是容器服務,可以模拟 Node、Pod、Container 資源異常或者其上的基礎資源異常等。
使用此模型可以很清晰表達出以下實施混沌實驗需要明确的問題:
- 混沌實驗的實施範圍是什麼
- 實施混沌實驗的對象是什麼
- 實驗對象觸發實驗的條件有哪些
- 具體實施什麼實驗場景
3、實驗模型的意義
此模型具有以下特點:
- 簡潔:層次清晰,通俗易懂;
- 通用:覆寫目前所有的故障場景,包含基礎資源、應用服務、容器服務、雲資源等;
- 易實作:很友善的定義清晰的接口規範,實驗場景擴充實作簡單;
- 語言、領域無關:可以擴充多語言、多領域的模型實作。
此模型具有以下的意義:
- 更精準的描述混沌實驗場景;
- 更好的了解混沌實驗注入;
- 友善沉澱現有的實驗場景;
- 依據模型發掘更多的場景;
- 混沌實驗工具更加規範、簡潔。
4、實驗模型的應用
混沌實驗模型的應用可歸納為以下幾點:
- 混沌實驗模型使實驗場景變量參數化,參數規範化;
- 可遵循模型實作實驗場景領域化的水準擴充;
- 可将混沌實驗模型和領域内标準化實作相結合,便捷實作領域内場景垂直擴充;
- 上層的領域場景可以複用遵循混沌實驗模型定義的場景;
- 通過混沌實驗模型聲明的場景描述可以很好的接入到 ChaosBlade 中;
- 遵循實驗模型可以很友善的建構上層混沌實驗平台。
下文重點介紹基于此模型實作的混沌工程工具 ChaosBlade。
混沌工程實驗工具:ChaosBlade
阿裡巴巴内部從最早引入混沌工程解決微服務的依賴問題,到業務服務、雲服務穩态驗證,進一步更新到公共雲、專有雲的業務連續性保障,以及在驗證雲原生系統的穩定性等方面積累了比較豐富的場景和實踐經驗。并且當時混沌工程相關的開源工具存在場景能力分散、上手難度大、缺少實驗模型标準,場景難以擴充和沉澱等問題。這些問題就會導緻很難實作平台化,你很難通過一個平台去囊括這些工具。是以開源混沌工程實驗執行工具 chaosblade,下面通過場景介紹、使用方式、架構設計和案例來詳細介紹此工具。
1、混沌實驗場景
Chaosblade 工具設計初期就考慮了易用性和場景擴充的便捷性,友善大家上手使用以及根據各自需要擴充更多的實驗場景,遵循混沌實驗模型提供了統一的操作簡潔的執行工具。混沌實驗工具支援 Linux、Windows、Docker、Kubernetes等系統平台,覆寫 Java、Golang、NodeJS、C++ 語言應用,共涉及 200 多個實驗場景,3000 多個實驗參數(v1.0.0-GA)。目前包含的場景領域如下:
- 基礎資源:比如 CPU、記憶體、網絡、磁盤、程序、核心等
- 應用服務:比如資料庫、緩存、消息、JVM 本身、微服務等,還可以指定任意類方法注入各種複雜的實驗場景;指定任意方法或某行代碼注入延遲、變量和傳回值篡改等實驗場景
- Docker 容器:比如殺容器、容器内 CPU、記憶體、網絡、磁盤、程序等實驗場景
- Kubernetes 平台:比如節點上 CPU、記憶體、網絡、磁盤、程序實驗場景,Pod 網絡和 Pod 本身實驗場景如殺 Pod,容器的實驗場景如上述的 Docker 容器實驗場景
- 雲資源:比如阿裡雲 ECS 當機等實驗場景
2、工具使用方式
ChaosBlade 是個直接下載下傳解壓就可以使用的工具,不需要安裝,然後它支援的調用方式包含 CLI 方式,直接執行 blade 指令。
比如這裡舉的做網絡延遲的例子,你添加 -h 參數就可以看到非常完善的指令提示,比如我要一個 9520 端口調用做網絡丢包,對齊前面的實驗模型,我們就可以看到,它的演練目标是 network,它的 action 是丢包,它的 matcher 就是調用遠端的一個服務端口 9520。執行成功後會傳回實驗結果,每一個實驗場景我們都會作為一個對象,它會傳回一個實驗對象的 UID,此 UID 用于後續的實驗管理,比如銷毀、查詢實驗都是通過此 UID 來做的。要銷毀實驗,也就是恢複實驗,直接執行 blade destroy 指令就可以了。
ChaosBlade 另一種調用方式是 Web 方式,通過執行 server 指令對外暴露 HTTP 服務,那麼在上層,你如果自己建構混沌實驗平台的話,你直接可以通過 HTTP 請求去調用就可以。
3、工具架構設計
ChaosBlade 依據領域實作封裝成各自獨立的項目,每個項目根據各領域的最佳實踐來實作,不僅能滿足各領域使用習慣,而且還可以通過混沌實驗模型來建立與 chaosblade cli 項目的關系,友善使用 chaosblade 來統一調用,各領域下的實驗場景依據混沌實驗模型生成 yaml 檔案描述,暴露給上層混沌實驗平台,混沌實驗平台根據實驗場景描述檔案的變更,自動感覺實驗場景的變化,無需新增場景時再做平台開發,使混沌平台更加專注于混沌工程其他部分。目前包含的執行器項目如下:
- chaosblade:混沌實驗管理工具,包含建立實驗、銷毀實驗、查詢實驗、實驗環境準備、實驗環境撤銷等指令,是混沌實驗的執行工具,執行方式包含 CLI 和 HTTP 兩種。提供完善的指令、實驗場景、場景參數說明,操作簡潔清晰。
- chaosblade-spec-go: 混沌實驗模型 Golang 語言定義,便于使用 Golang 語言實作的場景都基于此規範便捷實作。
- chaosblade-exec-os: 基礎資源實驗場景實作,如CPU、網絡、記憶體、磁盤等。
- chaosblade-exec-docker: Docker 容器實驗場景實作,通過調用 Docker API 标準化實作。
- chaosblade-operator: Kubernetes 平台實驗場景實作,将混沌實驗通過 Kubernetes 标準的 CRD 方式定義,很友善的使用 Kubernetes 資源操作的方式來建立、更新、删除實驗場景,包括使用 kubectl、client-go 等方式執行,而且還可以使用上述的 chaosblade cli 工具執行。
- chaosblade-exec-jvm: Java 應用實驗場景實作,使用 Java Agent 技術動态挂載,無需任何接入,零成本使用,而且支援解除安裝,完全回收 Agent 建立的各種資源。
- chaosblade-exec-cplus: C++ 應用實驗場景實作,使用 GDB 技術實作方法、代碼行級别的實驗場景注入。
4、工具使用案例
通過一個 Dubbo 微服務案例,來介紹 chaosblade 工具的使用。這個微服務 Demo 分三級調用,consumer 調用 provider,provider 調用 base,同時 provider 還調用 mk-demo 資料庫,provider 和 base 服務具有兩個執行個體。
這個案例執行的實驗場景是資料庫調用延遲,我們先定義監控名額:慢 SQL 數和告警資訊,做出期望假設:慢 SQL 數增加,釘釘群收到慢 SQL 告警。接下來執行實驗。我們直接使用 chaosblade 工具執行,可以看下左下角,我們對 demo-provider 注入調用 mysql 查詢時,若資料庫是 demo 且表名是 d_discount,則對 50% 的查詢操作延遲 600 毫秒。
我們使用阿裡雲産品 ARMS 做監控告警。大家可以看到,當執行完混沌實驗後,很快釘釘群裡就收到了報警。是以我們對比下之前定義的監控名額,是符合預期的。但需要注意的是這次符合預期并不代表以後也符合,是以需要通過混沌工程持續性的驗證。出現慢 SQL,可通過 ARMS 的鍊路追蹤來排查定位,可以很清楚的看出哪條語句執行慢。
混沌工程平台:chaosblade-box
為了讓使用者将精力聚焦在通過混沌工程解決系統高可用問題上,而不是實驗工具的選擇、部署上,是以将 ChaosBlade 品牌進行更新,開源 chaosblade-box 混沌工程平台。平台托管主流的混沌實驗工具,實作工具自動化的部署,通過統一的操作頁面實作混沌工程實施。
下面通過平台的功能特點、架構設計及使用案例來介紹混沌工程平台 chaosblade-box。
1、平台功能特點
具備以下功能特點:
- 支援開源實驗工具托管:平台可托管業界主流的實驗工具,如自身的 chaosblade 和外部的 litmuschaos 等。後續也會托管 chaos mesh 實驗工具。
- 具備豐富的實驗場景:包含基礎資源(CPU、記憶體、網絡、磁盤、程序、核心、檔案等)、多語言應用服務(Java、C++、NodeJS、Golang 等)、Kubernetes 平台(覆寫 Container、Pod、Node 資源場景,包含上述實驗場景)。
- 實驗工具自動化部署:無需手動部署實驗工具,實作實驗工具在主機或叢集上自動化部署。
- 統一混沌實驗使用者界面:使用者無需關心不同工具的使用方式,在統一使用者界面進行混沌實驗。
- 多元度實驗方式:支援從主機到 Kubernetes 資源,再到應用次元進行實驗編排。
- 內建雲原生生态:采用 Helm 部署管理,內建 Prometheus 監控,支援雲原生實驗工具托管等。
2、平台架構設計
通過控制台頁面可實作 chaosblade、litmuschaos 等已托管工具自動化部署,按照社群的建立的混沌實驗模型統一實驗場景,根據主機、Kubernetes、應用來劃分目标資源,通過目标管理器來控制,在實驗建立頁面,可以實作白屏化的目标資源選擇。平台通過調用混沌實驗執行來執行不同工具的實驗場景,配合接入 prometheus 監控,可以觀察實驗 metric 名額,後續會提供豐富的實驗報告。Chaosblade-box 的部署也非常簡單,具體可以檢視:
https://github.com/chaosblade-io/chaosblade-box/releases3、使用說明
安裝部署完成後,通過配置 Kubernetes 叢集或者主機資訊,可以在機器清單頁面看到叢集或主機資料。選擇實驗管理建立實驗,演練次元支援主機、Node、Pod、Container 次元,選擇相應的次元後,會出現對應的資源清單,可以很友善的選擇。演練内容包含所托管的所有實驗場景。完成實驗建立後,自動跳轉到演練詳情頁面,點選執行跳到任務詳情頁。
演練任務詳情頁面展示實驗的基本資訊和實驗任務狀态,可以很友善的控制實驗,以及明确實驗任務狀态。
未來規劃
1、chaosblade
ChaosBlade 未來以雲原生為基礎,提供面向多叢集、多環境、多語言的混沌工程平台和混沌工程實驗工具。實驗工具繼續聚焦在實驗場景豐富度和穩定性方面,支援更多的 Kubernetes 資源場景和規範應用服務實驗場景标準,提供多語言實驗場景标準實作。
2、chaosblade-box
後續會将阿裡雲故障演練平台(可信雲混沌工程平台先進型認證)核心功能開源,與現有的混沌工程平台進行融合,實作更多能力的開放。同時簡化混沌工程工具部署實施方面,後續會托管更多的混沌實驗工具和相容主流的平台,實作場景推薦,提供業務、系統監控內建,輸出實驗報告,在易用的基礎上完成混沌工程操作閉環。
作者介紹:
肖長軍(花名:穹谷):阿裡巴巴技術專家,開源項目 ChaosBlade Founder&Maintainer,阿裡雲故障演練平台端側負責人,可信雲标準專家,混沌工程布道師,多年分布式系統架構和穩定性建設經驗。
桑傑:就職于中國農業銀行研發中心,從事于财務相關系統大資料研發工作。