前言
在上篇文章中,我們介紹了混沌工程以及 ChaosBlade。從本篇開始,從 ChaosBlade 的安裝部署,到實驗的創建銷燬,在實踐的角度,一步步的完成各種混沌實驗,深入認識和使用混沌工程。
ChaosBlade-Operator
ChaosBlade-Operator 是 ChaosBlade 的 Kubernetes 平臺實驗場景實現。將混沌實驗通過 Kubernetes 標準的 CRD 方式定義,用戶可以像定義 Deployment 或 StatefulSet 那樣定義 ChaosBlade 實驗,只要對 kubectl
和 Kubernetes 對象有所瞭解,就可以輕鬆的創建、更新和刪除實驗場景;同時也可以通過 chaosblade cli 工具來操作實驗場景。
安裝
ChaosBlade-Operator 需要使用 Helm 安裝,進入 release 頁面 下載安裝包(ChaosBlade 還提供了阿里雲 OSS 的下載地址,提升國內下載速度)。
使用 Helm 3 安裝:
# 下載安裝包
$ wget -qO chaosblade-operator-0.6.0.tgz https://chaosblade.oss-cn-hangzhou.aliyuncs.com/agent/github/0.6.0/chaosblade-operator-0.6.0-v3.tgz
# 為 chaosblade 創建一個 namespace
$ kubectl create namespace chaosblade
# 安裝 ChaosBlade-Operator
$ helm install chaos chaosblade-operator-0.6.0.tgz --set webhook.enable=true --namespace=chaosblade
# 查看安裝結果
$ kubectl get pod -n chaosblade | grep chaosblade
chaosblade-operator-6b6b484599-gdgq8 1/1 Running 0 4d23h
chaosblade-tool-7wtph 1/1 Running 0 4d20h
chaosblade-tool-r4zdk 1/1 Running 0 4d23h
ChaosBlade-Operator 啟動後將會在每個節點部署一個 chaosblade-tool
Pod 和一個 chaosblade-operator
Pod,如果都運行正常,則安裝成功。上面設置 --set webhook.enable=true
是為了 Pod 文件系統 I/O 故障實驗,如果不需要進行該實驗,則無需添加該設置。
快速開始
下面就以 Pod 網絡延遲實驗為例,展示如何使用 ChaosBlade-Operator。
實驗準備
實驗前需要先準備實驗對象,這裡使用 guestbook 應用。
安裝
同樣使用 Helm 3
# add repo
helm repo add apphub-incubator https://apphub.aliyuncs.com/incubator/
# 安裝
helm install guestbook apphub-incubator/guestbook --set service.type=NodePort --namespace=chaosblade
默認的 Service 類型為 LoadBalancer
,這裡為了方便訪問設置為了 NodePort
。
開始實驗
實驗目標:對 chaosblade 命名空間中,對 redis-master-68857cd57c-dzbs9
Pod 的本地 6379 端口添加 3000 毫秒訪問延遲,延遲時間上下浮動 1000 毫秒。
實驗 yaml 配置
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: delay-pod-network-by-names
spec:
experiments:
- scope: pod
target: network
action: delay
desc: "delay pod network by names"
matchers:
- name: names
value:
- "redis-master-68857cd57c-dzbs9"
- name: namespace
value:
- "chaosblade"
- name: local-port
value: ["6379"]
- name: interface
value: ["eth0"]
- name: time
value: ["3000"]
- name: offset
value: ["1000"]
將其保存為 delay_pod_network_by_names.yaml
並執行命令,開始實驗:
$ kubectl apply -f delay_pod_network_by_names.yaml
查看實驗狀態
執行 kubectl get blade delay-pod-network-by-names -o json
命令,查看實驗狀態:
{
"apiVersion": "chaosblade.io/v1alpha1",
"kind": "ChaosBlade",
"metadata": {
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"chaosblade.io/v1alpha1\",\"kind\":\"ChaosBlade\",\"metadata\":{\"annotations\":{},\"name\":\"delay-pod-network-by-names\"},\"spec\":{\"experiments\":[{\"action\":\"delay\",\"desc\":\"delay pod network by names\",\"matchers\":[{\"name\":\"names\",\"value\":[\"redis-master-68857cd57c-dzbs9\"]},{\"name\":\"namespace\",\"value\":[\"chaosblade\"]},{\"name\":\"local-port\",\"value\":[\"6379\"]},{\"name\":\"interface\",\"value\":[\"eth0\"]},{\"name\":\"time\",\"value\":[\"3000\"]},{\"name\":\"offset\",\"value\":[\"1000\"]}],\"scope\":\"pod\",\"target\":\"network\"}]}}\n"
},
"creationTimestamp": "2020-06-02T05:57:50Z",
"finalizers": [
"finalizer.chaosblade.io"
],
"generation": 1,
"name": "delay-pod-network-by-names",
"resourceVersion": "7710394",
"selfLink": "/apis/chaosblade.io/v1alpha1/chaosblades/delay-pod-network-by-names",
"uid": "1235ff55-8256-4caa-a371-e1abf6c9e7b7"
},
"spec": {
"experiments": [
{
"action": "delay",
"desc": "delay pod network by names",
"matchers": [
{
"name": "names",
"value": [
"redis-master-68857cd57c-dzbs9"
]
},
{
"name": "namespace",
"value": [
"chaosblade"
]
},
{
"name": "local-port",
"value": [
"6379"
]
},
{
"name": "interface",
"value": [
"eth0"
]
},
{
"name": "time",
"value": [
"3000"
]
},
{
"name": "offset",
"value": [
"1000"
]
}
],
"scope": "pod",
"target": "network"
}
]
},
"status": {
"expStatuses": [
{
"action": "delay",
"resStatuses": [
{
"id": "a86f8cf8b68ace98",
"kind": "pod",
"name": "redis-master",
"nodeName": "keking",
"state": "Success",
"success": true,
"uid": "619a19ceb213f9b6152159bd868e88de2ddbf9a8aac606dc274b34bec6510c60"
}
],
"scope": "pod",
"state": "Success",
"success": true,
"target": "network"
}
],
"phase": "Running"
}
}
可以看到實驗成功創建了。
觀測結果
# 獲取實驗 pod ip
$ kubectl get pod -l app=redis,role=master -o jsonpath={.items..status.podIP}
10.42.69.44
# 進入觀測 pod
$ kubectl exec -it redis-slave-6dd975d4c8-2zrkb bash
# 在 pod 中安裝 telnet
$ apt-get update && apt-get install -y telnet
# 測試時間
$ time echo "" | telnet 10.42.69.44 6379
Trying 10.42.69.44...
Connected to 10.42.69.44.
Escape character is '^]'.
Connection closed by foreign host.
real 0m3.790s
user 0m0.007s
sys 0m0.001s
可以看到結果符合預期。
停止實驗
執行命令:kubectl delete -f delay_pod_network_by_names.yaml
或者直接刪除 blade 資源:kubectl delete blade delay-pod-network-by-names
結語
本篇我們講解了如何部署 ChaosBlade-Operator 並進行了簡單的實驗,可以看到在雲原生場景下,ChaosBlade 依舊有著簡單的操作方式,多種實驗場景,並對混沌實驗模型進行了標準化實現。很友好的將混沌實驗模型與 Kubernetes 聲明式設計結合在一起,依靠混沌實驗模型便捷開發場景的同時,又可以很好的結合 Kubernetes 設計理念。