
項目背景
阿裡巴巴内部從最早引入混沌工程解決微服務的依賴問題,到業務服務、雲服務穩态驗證,進一步更新到公共雲、專有雲的業務連續性保障,以及在驗證雲原生系統的穩定性等方面積累了比較豐富的場景和實踐經驗。并且當時混沌工程相關的開源工具存在場景能力分散、上手難度大、缺少實驗模型标準,場景難以擴充和沉澱等問題。這些問題就會導緻很難實作平台化,你很難通過一個平台去囊括這些工具。是以我們開源了 ChaosBlade 這個混沌工程實驗執行工具,目的是服務于混沌工程社群,共同推進混沌工程領域的發展。
項目介紹
ChaosBlade 項目托管在 Github 平台,放在
chaosblade-io組織下,友善項目管理和社群發展。設計 ChaosBlade 初期就考慮了易用性和場景擴充的便捷性,友善大家上手使用以及根據各自需要擴充更多的實驗場景,遵循混沌實驗模型提供了統一的操作簡潔的執行工具,并且根據領域劃分将場景實作封裝成一個一個單獨的項目,友善實作領域内場景擴充。目前包含的場景領域如下:
- 基礎資源:比如 CPU、記憶體、網絡、磁盤、程序等實驗場景
- Java 應用:比如資料庫、緩存、消息、JVM 本身、微服務等,還可以指定任意類方法注入各種複雜的實驗場景
- C++ 應用:比如指定任意方法或某行代碼注入延遲、變量和傳回值篡改等實驗場景
- Docker 容器:比如殺容器、容器内 CPU、記憶體、網絡、磁盤、程序等實驗場景
- Kubernetes 平台:比如節點上 CPU、記憶體、網絡、磁盤、程序實驗場景,Pod 網絡和 Pod 本身實驗場景如殺 Pod,容器的實驗場景如上述的 Docker 容器實驗場景
- 雲資源:比如阿裡雲 ECS 當機等實驗場景
以上場景領域都單獨封裝成一個項目來實作,目前包含的項目如下:
- chaosblade :混沌實驗管理工具,包含建立實驗、銷毀實驗、查詢實驗、實驗環境準備、實驗環境撤銷等指令,是混沌實驗的執行工具,執行方式包含 CLI 和 HTTP 兩種。提供完善的指令、實驗場景、場景參數說明,操作簡潔清晰。
- chaosblade-spec-go : 混沌實驗模型 Golang 語言定義,便于使用 Golang 語言實作的場景都基于此規範便捷實作。
- chaosblade-exec-os : 基礎資源實驗場景實作。
- 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 技術實作方法、代碼行級别的實驗場景注入。
以上項目都遵循混沌實驗模型定義實驗場景,這樣不僅實作實驗場景水準領域擴充,而且每個場景領域單獨一個項目,使用該領域下标準方式去設計實作場景,是以很友善的實作領域内場景垂直擴充。
除了實驗場景相關項目,還有相關的文檔項目:
- chaosblade-help-doc : ChaosBlade 工具和場景使用文檔
- chaosblade-dev-doc : ChaosBlade 項目開發文檔
- awesome-chaosblade : ChaosBlade 相關的外部文檔
實驗模型
前面提到 ChaosBlade 項目是遵循混沌實驗模型設計,不僅簡化了實驗場景定義,而且可以很友善的擴充場景,并且通過 chaosblade cli 工具可以統一調用,便于建構上層的混沌實驗平台。下面通過實驗模型的推導、介紹、意義和具體的應用來詳細介紹此模型。
實驗模型的推導
目前的混沌實驗主要包含故障模拟,我們一般對故障的描述如下:
- 10.0.0.1 機器上挂載的 A 磁盤滿造成了服務不可用
- 所有節點上的 B dubbo 服務因為執行緩慢造成上遊 A dubbo 服務調用延遲,進而造成使用者通路緩慢
- Kubernetes A 叢集中 B 節點上 CPU 所有核使用率滿載,造成 A 叢集中的 Pod 排程異常
- Kubernetes C 叢集中 D Pod 網絡異常,造成 D 相關的 Service 通路異常
通過上述,我們可以使用以下句式來描述故障:因為某某機器(或叢集中的資源,如 Node,Pod)上的哪個元件發生了什麼故障,進而造成了相關影響。我們也可以通過下圖來看故障描述拆分:
可以通過這四部分來描述現有的故障場景,所有我們抽象出了一個故障場景模型,也稱為混沌實驗模型
實驗模型的介紹
此實驗模型較長的描述如下:
- 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 資源異常或者其上的基礎資源異常等。
使用此模型可以很清晰表達出以下實施混沌實驗需要明确的問題:
- 混沌實驗的實施範圍是什麼
- 實施混沌實驗的對象是什麼
- 實驗對象觸發實驗的條件有哪些
- 具體實施什麼實驗場景
實驗模型的意義
此模型具有以下特點:
- 簡潔:層次清晰,通俗易懂
- 通用:覆寫目前所有的故障場景,包含基礎資源、應用服務、容器服務、雲資源等
- 易實作:很友善的定義清晰的接口規範,實驗場景擴充實作簡單
- 語言、領域無關:可以擴充多語言、多領域的模型實作
此模型具有以下的意義:
- 更精準的描述混沌實驗場景
- 更好的了解混沌實驗注入
- 友善沉澱現有的實驗場景
- 依據模型發掘更多的場景
- 混沌實驗工具更加規範、簡潔
實驗模型的應用
ChaosBlade 下的項目遵循此混沌實驗模型設計,需要注意的是此模型定義了混沌實驗場景如何設計,但是實驗場景的具體實作每個領域各不相同,是以将 ChaosBlade 依據領域實作封裝成各自獨立的項目,每個項目根據各領域的最佳實踐來實作,不僅能滿足各領域使用習慣,而且還可以通過混沌實驗模型來建立與 chaosblade cli 項目的關系,友善使用 chaosblade 來統一調用,各領域下的實驗場景依據混沌實驗模型生成 yaml 檔案描述,暴露給上層混沌實驗平台,混沌實驗平台根據實驗場景描述檔案的變更,自動感覺實驗場景的變化,無需新增場景時再做平台開發,使混沌平台更加專注于混沌工程其他部分。以下分為基于混沌實驗模型的 chaosblade cli 設計、基于混沌實驗模型的 chaosblade operator 設計和基于混沌實驗模型建構混沌實驗平台三部分詳細介紹混沌實驗模型的應用。
基于混沌實驗模型的 chaosblade cli 設計
項目本身使用 Golang 建構,解壓即用,工具采用 CLI 方式執行,使用簡單,具備完善的指令提示。根據
項目對混沌實驗模型的定義,解析遵循混沌實驗模型實作的實驗場景 yaml 描述,将實驗場景轉換為 cobra 架構所支援的指令參數,實作變量參數化、參數規範化,而且将整個實驗對象化,每個實驗對象都會有個 UID,友善管理。
通過一個具體的實驗場景來說明 chaosblade cli 的使用。
我們執行的實驗是對其中一個 provider 服務執行個體注入調用 mk-demo 資料庫延遲的故障,可以看到上圖左下角,這個就是對 demo 資料庫注入延遲的指令,可以看出指令非常簡潔清晰,比如很明确的表達出我們的實驗目标是 mysql,我們的實驗場景是做延遲,後面這些都是這些資料庫的比對器,比如表,查詢類型,還有控制實驗的影響條數等等,使用 ChaosBlade 可以很有效的控制實驗的爆炸半徑。執行這條指令就可以對這台機器的 provider 服務注入故障,大家可以看到我注入故障之後,這裡這個圖就是我立刻收到了釘釘的報警,那麼這個 case 是符合預期的 case,但是即使符合預期的case,也是有價值的,需要相關的開發和運維人員是要去排查延遲的問題根因并恢複,有助于提高故障應急效率。
chaosblade 的中文使用文檔:
https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn基于混沌實驗模型的 chaosblade operator 設計
項目是針對 Kubernetes 平台所實作的混沌實驗注入工具,遵循上述混沌實驗模型規範化實驗場景,把實驗定義為 Kubernetes CRD 資源,将實驗模型中的四部分映射為 Kubernetes 資源屬性,很友好的将混沌實驗模型與 Kubernetes 聲明式設計結合在一起,依靠混沌實驗模型便捷開發場景的同時,又可以很好的結合 Kubernetes 設計理念,通過 kubectl 或者編寫代碼直接調用 Kubernetes API 來建立、更新、删除混沌實驗,而且資源狀态可以非常清晰的表示實驗的執行狀态,标準化實作 Kubernetes 故障注入。除了使用上述方式執行實驗外,還可以使用 chaosblade cli 方式非常友善的執行 kubernetes 實驗場景,查詢實驗狀态等。
遵循混沌實驗模型實作的 chaosblade operator 除上述優勢之外,還可以實作基礎資源、應用服務、Docker 容器等場景複用,大大友善了 Kubernetes 場景的擴充,是以在符合 Kubernetes 标準化實作場景方式之上,結合混沌實驗模型可以更有效、更清晰、更友善的實作、使用混沌實驗場景。
下面通過一個具體的案例來說明 chaosblade-operator 的使用:對 cn-hangzhou.192.168.0.205 節點本地端口 40690 通路模拟 60% 的網絡丢包。
使用 yaml 配置方式,使用 kubectl 來執行實驗
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: loss-node-network-by-names
spec:
experiments:
- scope: node
target: network
action: loss
desc: "node network loss"
matchers:
- name: names
value: ["cn-hangzhou.192.168.0.205"]
- name: percent
value: ["60"]
- name: interface
value: ["eth0"]
- name: local-port
value: ["40690"]
執行實驗:
kubectl apply -f loss-node-network-by-names.yaml
查詢實驗狀态,傳回資訊如下(省略了 spec 等内容):
~ » kubectl get blade loss-node-network-by-names -o json
{
"apiVersion": "chaosblade.io/v1alpha1",
"kind": "ChaosBlade",
"metadata": {
"creationTimestamp": "2019-11-04T09:56:36Z",
"finalizers": [
"finalizer.chaosblade.io"
],
"generation": 1,
"name": "loss-node-network-by-names",
"resourceVersion": "9262302",
"selfLink": "/apis/chaosblade.io/v1alpha1/chaosblades/loss-node-network-by-names",
"uid": "63a926dd-fee9-11e9-b3be-00163e136d88"
},
"status": {
"expStatuses": [
{
"action": "loss",
"resStatuses": [
{
"id": "057acaa47ae69363",
"kind": "node",
"name": "cn-hangzhou.192.168.0.205",
"nodeName": "cn-hangzhou.192.168.0.205",
"state": "Success",
"success": true,
"uid": "e179b30d-df77-11e9-b3be-00163e136d88"
}
],
"scope": "node",
"state": "Success",
"success": true,
"target": "network"
}
],
"phase": "Running"
}
}
通過以上内容可以很清晰的看出混沌實驗的運作狀态,執行以下指令停止實驗:
kubectl delete -f loss-node-network-by-names.yaml
或者直接删除此 blade 資源
kubectl delete blade loss-node-network-by-names
還可以編輯 yaml 檔案,更新實驗内容執行,chaosblade operator 會完成實驗的更新操作。
使用 chaosblade cli 的 blade 指令執行
blade create k8s node-network loss --percent 60 --interface eth0 --local-port 40690 --kubeconfig config --names cn-hangzhou.192.168.0.205
如果執行失敗,會傳回詳細的錯誤資訊;如果執行成功,會傳回實驗的 UID:
{"code":200,"success":true,"result":"e647064f5f20953c"}
可通過以下指令查詢實驗狀态:
blade query k8s create e647064f5f20953c --kubeconfig config
{
"code": 200,
"success": true,
"result": {
"uid": "e647064f5f20953c",
"success": true,
"error": "",
"statuses": [
{
"id": "fa471a6285ec45f5",
"uid": "e179b30d-df77-11e9-b3be-00163e136d88",
"name": "cn-hangzhou.192.168.0.205",
"state": "Success",
"kind": "node",
"success": true,
"nodeName": "cn-hangzhou.192.168.0.205"
}
]
}
}
銷毀實驗:
blade destroy e647064f5f20953c
除了上述兩種方式調用外,還可以使用 kubernetes client-go 方式執行,具體可參考:
https://github.com/chaosblade-io/chaosblade/blob/master/exec/kubernetes/executor.go代碼實作。
通過上述介紹,可以看出在設計 ChaosBlade 項目初期就考慮了雲原生實驗場景,将混沌實驗模型與 Kubernetes 設計理念友好的結合在一起,不僅可以遵循 Kubernetes 标準化實作,還可以複用其他領域場景和 chaosblade cli 調用方式,所謂的曆史包袱根本不存在 :-)。
基于混沌實驗模型建構混沌實驗平台
前面也提到了遵循混沌實驗模型實作的實驗場景,可通過 yaml 檔案來描述,上層實驗平台可以自動感覺實驗場景的變更,無需平台再做開發,達到實驗平台與實驗場景解耦的目的,使大家可以更加專注于混沌實驗平台本身的開發上。下面拿 AHAS Chaos 平台舉例來說明如何基于混沌實驗模型和 ChaosBlade 建構混沌實驗平台。
可以看到:
- chaosblade 會合并所有領域場景的 yaml 檔案,提供給 ChaosBlade SDK
- ChaosBlade SDK 感覺 yaml 檔案變化,重新解析場景描述檔案,透傳給上層平台,包含場景和場景參數的變更
- ChaosBlade SDK 透傳使用者在平台上所配置的參數,調用 chaosblade 工具執行
- chaosblade 工具會根據調用參數,和解析各領域 yaml 場景描述檔案來調用不同的執行器
總結
混沌實驗模型的應用可歸納為以下幾點:
- 混沌實驗模型使實驗場景變量參數化,參數規範化
- 可遵循模型實作實驗場景領域化的水準擴充
- 可将混沌實驗模型和領域内标準化實作相結合,便捷實作領域内場景垂直擴充
- 上層的領域場景可以複用遵循混沌實驗模型定義的場景
- 通過混沌實驗模型聲明的場景描述可以很好的接入到 chaosblade cli 中
- 遵循實驗模型可以很友善的建構上層混沌實驗平台
項目意義
混沌工程領域已提出多年,混沌工程社群的每一個人都貢獻着自己的力量來完善整個混沌工程領域體系,尤其是混沌工程理論的提出推動了整個混沌工程領域快速發展。我們在阿裡巴巴内部實踐混沌工程很多年,深知落地混沌工程之路充滿各種挑戰,也知道注入混沌實驗隻是混沌工程中的一環,混沌工程背後的思考、落地方案和實踐經驗也是很重要的一部分。我們隻是想把我們認為好用的内部工具奉獻給社群,随後将剛才提到的實踐經驗也通過各種管道分享給大家,大家可以将此工具與實踐經驗相結合,作為企業落地混沌工程的一個入手點,共同推進混沌工程領域的進步,僅此而已。
上述詳細介紹了 ChaosBlade 工具的設計和背後的思考,以及将混沌實驗模型與各領域标準實作相結合的優勢,歡迎對高可用架構感興趣的各位加入到 ChaosBlade 社群中來,加入到混沌工程社群中來。總而言之,ChaosBlade 相信:開源世界中,任何幫助都是貢獻。
未來規劃
ChaosBlade 社群在增強原有領域的同時,比如增強雲原生領域場景,還會增加更多領域的場景,例如:
- Golang 應用混沌實驗場景
- NodeJS 應用混沌實驗場景
除實驗場景外,還會以下規劃:
- 提供一個混沌實驗平台供大家使用
- 完善 ChaosBlade 各項目的開發文檔
- 完善 chaosblade 工具的英文文檔
歡迎大家加入,一起共建,不限于:
- bug report
- feature request
- performance issue
- help wanted
- doc incomplete
- test missing
- feature design
- any question on project
ChaosBlade 項目才剛剛開始,歡迎開源愛好者在使用 ChaosBlade 過程中産生的任何想法和問題,都可以通過 issue 或者 pull request 的方式回報到 Github 上。
了解更多
ChaosBlade 的負責人阿裡巴巴技術專家肖長軍(穹谷)與阿裡巴巴混沌工程平台、阿裡雲應用高可用服務-故障演練産品負責人李晶磊(孫巨)即将在QCon全球軟體開發大會(北京站)2020展開為期一天的深度教育訓練,給大家詳細介紹混沌工程本身和相關平台工具以及混沌工程在阿裡巴巴内部的發展,并通過具體案例分享實施混沌工程的價值,不容錯過。QCon目前正在8折報名中,識别二維碼或點選
閱讀原文了解内容大綱。
作者資訊:肖長軍,阿裡巴巴技術專家,花名穹谷,多年應用性能監控研發和分布式系統高可用架構經驗,現專注于混沌工程領域,具備多年混沌工程研發和實踐經驗。開源項目 ChaosBlade 的負責人,阿裡雲應用高可用服務(AHAS)産品研發,混沌工程布道師。