本文將介紹如何在 GitHub Actions 的 workflow 中使用 Chaos Mesh,從而將混沌工程集成到系統開發的 CI 中。node
閱讀本文前,須要對 Chaos Mesh 和 GitHub Actions 有必定的瞭解:git
那麼咱們爲何要將 Chaos Mesh 和 GitHub Actions 結合起來呢?緣由很簡單,在此以前並無比較好的在 e2e 或者 CI 中使用 Chaos Mesh 的方案,用戶每每在系統開發到某一階段(版本)時才使用 Chaos Mesh 進行一次集中的混沌測試,在漫長的系統開發過程當中引入的問題每每不能及時發現。所以咱們開發了 chaos-mesh-action 這個項目,讓 Chaos Mesh 運行在 GitHub Actions 的 workflow 中,讓 Chaos Mesh 能夠更方便地集成到系統的平常開發、測試中,爲 GitHub 上每一次代碼的提交保駕護航。github
下面以一個簡單的示例來介紹 chaos-mesh-action 在 GitHub Actions 中的使用。ubuntu
首先咱們須要設計整個 workflow,須要考慮的問題:api
本文設計一個簡單的測試場景:在 Kubernetes 集羣中建立兩個 Pod,在其中一個 Pod 中 Ping 另一個 Pod,使用 Chaos Mesh 注入網絡延遲的 chaos,測試 Ping 是否受影響。網絡
在你須要測試的 GitHub 的倉庫中點擊 「Actions」,而後點擊按鈕 「New workflow」 便可建立 workflow,以下圖所示:app
設置該 workflow 的名稱、觸發規則等,例如:分佈式
name: Chaos on: push: branches: - master pull_request: branches: - master
workflow 的名稱爲 「Chaos」,在有代碼 push 到 master 分支或者提交 pull request 到 master 分支時觸發。ide
在 workflow 中安裝 CI 相關的環境,例如:測試
jobs: build: runs-on: ubuntu-latest steps: - name: Creating kind cluster uses: helm/kind-action@v1.0.0-rc.1 - name: Print cluster information run: | kubectl config view kubectl cluster-info kubectl get nodes kubectl get pods -n kube-system helm version kubectl version - uses: actions/checkout@v2
該配置指定該 workflow 運行在 Ubuntu 系統中,使用 Action helm/kind-action 建立 Kind 集羣,而後輸出集羣的相關信息;再 checkout 該 GitHub 倉庫,這樣 workflow 就可使用倉庫中的代碼。
使用 Chaos Mesh 中提供的一個簡單的示例應用:
- name: Deploy an application run: | kubectl apply -f https://raw.githubusercontent.com/chaos-mesh/apps/master/ping/busybox-statefulset.yaml
該應用會建立兩個 Pod。
咱們知道 Chaos Mesh 支持的功能較多,若是在 chaos-mesh-action 中支持全部的配置項會比較複雜,且用戶使用起來也比較困難,所以 chaos-mesh-action 支持直接設置 chaos 配置文件的 base64 值來簡化配置。
首先須要在本地環境中準備好 chaos 的配置文件,例如:
apiVersion: chaos-mesh.org/v1alpha1 kind: NetworkChaos metadata: name: network-delay namespace: busybox spec: action: delay # the specific chaos action to inject mode: all selector: pods: busybox: - busybox-0 delay: latency: "10ms" duration: "5s" scheduler: cron: "@every 10s" direction: to target: selector: pods: busybox: - busybox-1 mode: all
該配置將注入 NetworkChaos 類型的 chaos,增長 pod 間的網絡延遲,每10s 注入一次,每次持續 5s。更多的 chaos 類型及配置說明參考 user_guides/run_chaos_experiment。
而後經過以下命令獲取 chaos 配置文件的 base64 值:
$ base64 chaos.yaml YXBpVmVyc2lvbjogY2hhb3MtbWVzaC5vcmcvdjFhbHBoYTEKa2luZDogTmV0d29ya0NoYW9zCm1ldGFkYXRhOgogIG5hbWU6IG5ldHdvcmstZGVsYXkKICBuYW1lc3BhY2U6IGJ1c3lib3gKc3BlYzoKICBhY3Rpb246IGRlbGF5ICMgdGhlIHNwZWNpZmljIGNoYW9zIGFjdGlvbiB0byBpbmplY3QKICBtb2RlOiBhbGwKICBzZWxlY3RvcjoKICAgIHBvZHM6CiAgICAgIGJ1c3lib3g6CiAgICAgICAgLSBidXN5Ym94LTAKICBkZWxheToKICAgIGxhdGVuY3k6ICIxMG1zIgogIGR1cmF0aW9uOiAiNXMiCiAgc2NoZWR1bGVyOgogICAgY3JvbjogIkBldmVyeSAxMHMiCiAgZGlyZWN0aW9uOiB0bwogIHRhcmdldDoKICAgIHNlbGVjdG9yOgogICAgICBwb2RzOgogICAgICAgIGJ1c3lib3g6CiAgICAgICAgICAtIGJ1c3lib3gtMQogICAgbW9kZTogYWxsCg==
再使用 chaos-mesh-action 注入該 chaos,配置以下:
- name: Run chaos mesh action uses: chaos-mesh/chaos-mesh-action@xiang/refine_script env: CFG_BASE64: YXBpVmVyc2lvbjogY2hhb3MtbWVzaC5vcmcvdjFhbHBoYTEKa2luZDogTmV0d29ya0NoYW9zCm1ldGFkYXRhOgogIG5hbWU6IG5ldHdvcmstZGVsYXkKICBuYW1lc3BhY2U6IGJ1c3lib3gKc3BlYzoKICBhY3Rpb246IGRlbGF5ICMgdGhlIHNwZWNpZmljIGNoYW9zIGFjdGlvbiB0byBpbmplY3QKICBtb2RlOiBhbGwKICBzZWxlY3RvcjoKICAgIHBvZHM6CiAgICAgIGJ1c3lib3g6CiAgICAgICAgLSBidXN5Ym94LTAKICBkZWxheToKICAgIGxhdGVuY3k6ICIxMG1zIgogIGR1cmF0aW9uOiAiNXMiCiAgc2NoZWR1bGVyOgogICAgY3JvbjogIkBldmVyeSAxMHMiCiAgZGlyZWN0aW9uOiB0bwogIHRhcmdldDoKICAgIHNlbGVjdG9yOgogICAgICBwb2RzOgogICAgICAgIGJ1c3lib3g6CiAgICAgICAgICAtIGJ1c3lib3gtMQogICAgbW9kZTogYWxsCg==
chaos-mesh-action 中會自動完成 Chaos Mesh 的安裝和 chaos 的注入,簡化了用戶的使用。
如上所示的步驟已經安裝了環境,部署了應用,並注入了 chaos,接下來就要驗證系統的正確性了。本文示例的驗證比較簡單,僅僅是在一個 Pod 中 Ping 另一個 Pod,觀察網絡延遲的變化,配置以下:
- name: Verify run: | echo "do some verify" kubectl exec busybox-0 -it -n busybox -- ping -c 30 busybox-1.busybox.busybox.svc
這樣就完成了 workflow 的配置,以上這些配置的完整內容參見示例配置文件。
經過提交 pr 到 master 分支來觸發該 workflow,而後觀察 workflow 的運行結果。其中驗證部分的輸出以下:
do some verify Unable to use a TTY - input is not a terminal or the right kind of file PING busybox-1.busybox.busybox.svc (10.244.0.6): 56 data bytes 64 bytes from 10.244.0.6: seq=0 ttl=63 time=0.069 ms 64 bytes from 10.244.0.6: seq=1 ttl=63 time=10.136 ms 64 bytes from 10.244.0.6: seq=2 ttl=63 time=10.192 ms 64 bytes from 10.244.0.6: seq=3 ttl=63 time=10.129 ms 64 bytes from 10.244.0.6: seq=4 ttl=63 time=10.120 ms 64 bytes from 10.244.0.6: seq=5 ttl=63 time=0.070 ms 64 bytes from 10.244.0.6: seq=6 ttl=63 time=0.073 ms 64 bytes from 10.244.0.6: seq=7 ttl=63 time=0.111 ms 64 bytes from 10.244.0.6: seq=8 ttl=63 time=0.070 ms 64 bytes from 10.244.0.6: seq=9 ttl=63 time=0.077 ms ……
能夠看出,延遲大約會持續 5 次在 10ms 以上,以後又恢復到 0.1 ms 左右,符合 chaos 配置的預期。
目前咱們已經把 chaos-mesh-action 應用在了 tidb-operator 項目中,能夠查看 tidb-operator/actions/workflow/chaos,該 workflow 注入了 pod-failure 類型的 chaos,來驗證 operator 指定實例的重啓功能,在 operator 的 pods 被 chaos 隨機刪除的狀況下是否能夠正常工做。咱們計劃將更多的測試遷移到 GitHub Actions 中,並使用 chaos-mesh-action 進行混沌測試,確保咱們系統的穩定性。
你們在使用 chaos-mesh-action 或者 Chaos Mesh 的過程當中若是遇到問題,歡迎經過 issue 反饋給咱們。另外咱們即將在 9 月中旬發佈 Chaos Mesh 1.0 版本,你們敬請期待!