簡介: ChaosBlade 是阿里巴巴 2019 年開源的混沌工程項目,已加入到 CNCF Sandbox 中。起初包含面向多環境、多語言的混沌工程實驗工具 chaosblade,到現在發展到面向多集群、多環境、多語言的混沌工程平台 chaosblade-box,平台支持實驗工具托管和工具自動化部署,通過統一用戶實驗界面,將用戶的精力聚焦在通過混沌工程解決雲原生過程中高可用問題上。本文從混沌實驗模型抽象、混沌實驗工具開源和混沌工程平台升級項目三階段出發,詳細介紹 ChaosBlade。
作者 | 肖長軍(穹谷) 桑傑
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/releases
3、使用說明
安裝部署完成后,通過配置 Kubernetes 集群或者主機信息,可以在機器列表頁面看到集群或主機數據。選擇實驗管理創建實驗,演練維度支持主機、Node、Pod、Container 維度,選擇相應的維度后,會出現對應的資源列表,可以很方便的選擇。演練內容包含所托管的所有實驗場景。完成實驗創建后,自動跳轉到演練詳情頁面,點擊執行跳到任務詳情頁。
演練任務詳情頁面展示實驗的基本信息和實驗任務狀態,可以很方便的控制實驗,以及明確實驗任務狀態。
未來規划
1、chaosblade
ChaosBlade 未來以雲原生為基礎,提供面向多集群、多環境、多語言的混沌工程平台和混沌工程實驗工具。實驗工具繼續聚焦在實驗場景豐富度和穩定性方面,支持更多的 Kubernetes 資源場景和規范應用服務實驗場景標准,提供多語言實驗場景標准實現。
2、chaosblade-box
后續會將阿里雲故障演練平台(可信雲混沌工程平台先進型認證)核心功能開源,與現有的混沌工程平台進行融合,實現更多能力的開放。同時簡化混沌工程工具部署實施方面,后續會托管更多的混沌實驗工具和兼容主流的平台,實現場景推薦,提供業務、系統監控集成,輸出實驗報告,在易用的基礎上完成混沌工程操作閉環。
作者介紹:
肖長軍(花名:穹谷):阿里巴巴技術專家,開源項目 ChaosBlade Founder&Maintainer,阿里雲故障演練平台端側負責人,可信雲標准專家,混沌工程布道師,多年分布式系統架構和穩定性建設經驗。
桑傑:就職於中國農業銀行研發中心,從事於財務相關系統大數據研發工作。
原文鏈接
本文為阿里雲原創內容,未經允許不得轉載。











