Chaos-mesh

在 Kubernetes 裡放個破壞小精靈,檢視你系統的韌性以及看你能不能抓到他

安裝 chaos-mesh

  1. 增加 helm repo

helm repo add chaos-mesh https://charts.chaos-mesh.org
  1. 新增 namespaces

kubectl create ns chaos-mesh
  1. 下載 helm values.yaml 檔案

wget https://github.com/chaos-mesh/chaos-mesh/blob/master/helm/chaos-mesh/values.yaml
  1. 編輯values.yaml,根據 K8S 使用的container runtime 做設定 此範例使用的是 docker

runtime: docker
socketPath: /var/run/docker.sock
  1. 透過 helm 安裝

helm install chaos-mesh chaos-mesh/chaos-mesh -n=chaos-mesh -f values.yaml
  1. 透過 NodePort 進入 dashboard

kubectl get svc -n chaos-mesh | grep dashboard
chaos-dashboard                 NodePort    10.43.147.66    <none>        2333:31252/TCP,2334:30208/TCP
  1. 進入 dashboard 需要透過 token,可以透過 Click here 取得建立token 步驟

  2. 根據所需權限,選擇namespace或是整個 Cluster,並按照步驟建立rbac 和 token

  3. 取得token後輸入,即可登入

建立測試程式

建立名為 web-show 的測試程式,此程式可以在網頁上看到 ping kube-system pod 的結果圖表

  1. 到 chaos-mesh 的 github 取得範例

https://github.com/chaos-mesh/chaos-mesh/tree/master/examples/web-show
  1. 執行 deploy.sh

  2. 建立完成後,從 NodePort 進入web-show

建立網路延遲實驗

  1. 建立一個實驗,類型為網路攻擊的延遲,設為 10ms

  1. 目標設定為 web-show pod,持續 10s,然後建立

  1. 查看web-show 發現 ping 的封包確實有持續10s延遲

  2. 回到實驗頁面,看到實驗已執行完成

建立網路封包遺失實驗

  1. 建立一個實驗,類型為網路封包遺失,遺失率為 100%

  2. 目標設定為 web-show pod,持續 10s,然後建立

  1. 查看 web-show,確定封包有遺失

建立 Pod Failure 實驗

  1. 建立 Pod Fault 類型的 pod Failure 實驗

  2. 選定 web-show pod,持續時間為永久,送出實驗

  3. 查看 pod 狀態

  4. 查看實驗狀態

  5. 停止實驗,確認 pod 恢復正常

建立 Pod CPU Memory 壓力測試實驗

  1. 建立 Stress Test 實驗,讓 Pod CPU 和 Memory 滿載

  2. 選定 web-show pod,持續時間為永久,送出實驗

  3. 此範例程式的資源 limit 為 cpu 0.3 core memort 20Mi

  4. 查看pod監控值,CPU Memory都滿載

建立多個混沌實驗(workflow)

除了建立單一實驗外,還可以建立多個實驗,多個實驗可以同時進行,或是依序進行,接下來範例建立一個workflow,內容為執行

network delay 10ms 持續20s -> 暫停 5s -> network loss 100% 持續20s

可以透過 UI 來制定 workflow 不過以下範例是透過 yaml 來制定

1.建立workflow yaml 檔

apiVersion: chaos-mesh.org/v1alpha1
kind: Workflow
metadata:
  name: network-workflow-serial
spec:
  entry: network-entry
  templates:
    - name: network-entry
      templateType: Serial
      deadline: 240s
      children:
        - workflow-network-delay-chaos
        - suffix-suspending
        - workflow-network-loss-chaos
    - name: workflow-network-delay-chaos
      templateType: NetworkChaos
      deadline: 20s
      networkChaos:
        direction: to
        action: delay
        mode: all
        selector:
          labelSelectors:
            "app": "web-show"
        delay:
          latency: "10ms"
          correlation: "100"
          jitter: "0ms"
    - name: workflow-network-loss-chaos
      templateType: NetworkChaos
      deadline: 20s
      networkChaos:
        direction: to
        action: loss
        mode: all
        selector:
          labelSelectors:
            "app": "web-show"
        loss:
          loss: '100'
          correlation: "100"
    - name: suffix-suspending
      templateType: Suspend
      deadline: 5s
  1. 使用 kubectl apply 建立 workflow

  2. 查看 web-show 結果,確實先 delay,暫停,再 loss

  3. 查看 workflow 頁面的實驗拓墣圖

總結

透過chaos-mesh,可以直接對pod 注入網路問題,或是壓力測試等等,其實還有很多種類的錯誤可以來玩,像是時間錯誤和 http request 的問題,透過問題的注入,來檢視系統服務的韌性以及目前的告警機制和log系統是否能察覺問題發生的原因,持續更新告警機制,從而讓平台跟系統變得越來越強大

Last updated

Was this helpful?