在本系列中,我介绍了多种混沌工程工具。本系列的第一篇文章解释了 什么是混沌工程;第二篇文章演示了如何获取您 系统的稳定状态,以便您可以将其与混沌状态进行比较;第三篇文章展示了如何 使用 Litmus 进行测试 Kubernetes 集群中的任意故障和实验;第四篇文章介绍了 Chaos Mesh,一个带有 Web 用户界面的开源混沌编排器。
在第五篇文章中,我想讨论任意 Pod 故障。Kube-monkey 提供了一种简单的方法来压力测试您的系统,通过在您的集群中调度随机终止 Pod。这旨在鼓励和验证故障弹性服务的开发。与之前的演练一样,我将使用 Pop!_OS 20.04、Helm 3、Minikube 1.14.2 和 Kubernetes 1.19。
配置 Minikube
如果您尚未安装,请以适合您环境的方式 安装 Minikube。 如果您有足够的资源,我建议为您的虚拟机提供比默认内存和 CPU 功率稍多的资源
$ minikube config set memory 8192
❗ These changes will take effect upon a minikube delete and then a minikube start
$ minikube config set cpus 6
❗ These changes will take effect upon a minikube delete and then a minikube start
然后启动并检查您的系统状态
$ minikube start
? minikube v1.14.2 on Debian bullseye/sid
? minikube 1.19.0 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.19.0
? To disable this notice, run: 'minikube config set WantUpdateNotification false'
✨ Using the docker driver based on user configuration
? Starting control plane node minikube in cluster minikube
? Creating docker container (CPUs=6, Memory=8192MB) ...
? Preparing Kubernetes v1.19.0 on Docker 19.03.8 ...
? Verifying Kubernetes components...
? Enabled addons: storage-provisioner, default-storageclass
? Done! kubectl is now configured to use "minikube" by default
$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
使用部署进行预配置
首先添加一些小型部署以针对其运行混沌测试。这些部署将需要一些特殊的标签,因此您需要创建一个新的 Helm chart。以下标签将帮助 kube-monkey 确定如果应用程序选择加入混沌测试,则需要终止什么,并了解混沌测试背后的详细信息
- kube-monkey/enabled:此设置使您选择加入启动混沌测试。
- kube-monkey/mtbf:这代表平均故障间隔时间(以天为单位)。例如,如果设置为 3,则 Kubernetes (K8s) 应用程序预计大约每三个工作日会有一个 Pod 被终止。
- kube-monkey/identifier:这是 K8s 应用程序的唯一标识符;在本例中,它将是“nginx”。
- kube-monkey/kill-mode:kube-monkey 的默认行为是仅终止集群中的一个 Pod,但您可以更改它以添加更多
- kill-all: 终止每个 Pod,无论 Pod 发生什么情况
- fixed: 选择您要终止的 Pod 数量
- fixed-percent: 终止固定百分比的 Pod(例如,50%)
- kube-monkey/kill-value:您可以在此处为 kill-mode 指定一个值
- fixed: 要终止的 Pod 数量
- random-max-percent: kube-monkey 可以终止的最大百分比,范围为 0–100
- fixed-percent: 要终止的 Pod 的百分比,范围为 0–100%
现在您已经了解了这些背景信息,您可以开始 创建基本的 Helm chart。
我将此 Helm chart 命名为 nginx
。 我将仅显示对以下 Helm chart 部署标签的更改。您需要更改部署 YAML 文件,在本例中为 nginx/templates
$ /chaos/kube-monkey/helm/nginx/templates$ ls -la
total 40
drwxr-xr-x 3 jess jess 4096 May 15 14:46 .
drwxr-xr-x 4 jess jess 4096 May 15 14:46 ..
-rw-r--r-- 1 jess jess 1826 May 15 14:46 deployment.yaml
-rw-r--r-- 1 jess jess 1762 May 15 14:46 _helpers.tpl
-rw-r--r-- 1 jess jess 910 May 15 14:46 hpa.yaml
-rw-r--r-- 1 jess jess 1048 May 15 14:46 ingress.yaml
-rw-r--r-- 1 jess jess 1735 May 15 14:46 NOTES.txt
-rw-r--r-- 1 jess jess 316 May 15 14:46 serviceaccount.yaml
-rw-r--r-- 1 jess jess 355 May 15 14:46 service.yaml
drwxr-xr-x 2 jess jess 4096 May 15 14:46 tests
在您的 deployment.yaml
文件中,找到此部分
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "nginx.selectorLabels" . | nindent 8 }}
并进行以下更改
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "nginx.selectorLabels" . | nindent 8 }}
kube-monkey/enabled: enabled
kube-monkey/identifier: monkey-victim
kube-monkey/mtbf: '2'
kube-monkey/kill-mode: "fixed"
kube-monkey/kill-value: '1'
返回上一级目录并找到 values
文件
$ /chaos/kube-monkey/helm/nginx/templates$ cd ../
$ /chaos/kube-monkey/helm/nginx$ ls
charts Chart.yaml templates values.yaml
您需要更改 values 文件中的一行,从
replicaCount: 1
到
replicaCount: 8
这将为您提供八个不同的 Pod 来测试混沌测试。
再返回上一级目录并安装新的 Helm chart
$ /chaos/kube-monkey/helm/nginx$ cd ../
$ /chaos/kube-monkey/helm$ helm install nginxtest nginx
NAME: nginxtest
LAST DEPLOYED: Sat May 15 14:53:47 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=nginx,app.kubernetes.io/instance=nginxtest" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
然后检查您的 Nginx Pod 中的标签
$ /chaos/kube-monkey/helm$ kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
nginxtest-8f967857-88zv7 1/1 Running 0 80s
nginxtest-8f967857-8qb95 1/1 Running 0 80s
nginxtest-8f967857-dlng7 1/1 Running 0 80s
nginxtest-8f967857-h7mmc 1/1 Running 0 80s
nginxtest-8f967857-pdzpq 1/1 Running 0 80s
nginxtest-8f967857-rdpnb 1/1 Running 0 80s
nginxtest-8f967857-rqv2w 1/1 Running 0 80s
nginxtest-8f967857-tr2cn 1/1 Running 0 80s
选择第一个 Pod 进行描述并确认标签已就位
$ /chaos/kube-monkey/helm$ kubectl describe pod nginxtest-8f967857-88zv7 -n default
Name: nginxtest-8f967857-88zv7
Namespace: default
Priority: 0
Node: minikube/192.168.49.2
Start Time: Sat, 15 May 2021 15:11:37 -0400
Labels: app.kubernetes.io/instance=nginxtest
app.kubernetes.io/name=nginx
kube-monkey/enabled=enabled
kube-monkey/identifier=monkey-victim
kube-monkey/kill-mode=fixed
kube-monkey/kill-value=1
kube-monkey/mtbf=2
pod-template-hash=8f967857
配置并安装 kube-monkey
要使用 Helm 安装 kube-monkey,您首先需要运行 git clone on
kube-monkey 存储库
$ /chaos$ git clone https://github.com/asobti/kube-monkey
Cloning into 'kube-monkey'...
remote: Enumerating objects: 14641, done.
remote: Counting objects: 100% (47/47), done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 14641 (delta 18), reused 22 (delta 8), pack-reused 14594
Receiving objects: 100% (14641/14641), 30.56 MiB | 39.31 MiB/s, done.
Resolving deltas: 100% (6502/6502), done.
更改到 kube-monkey/helm
目录
$ /chaos$ cd kube-monkey/helm/
$ /chaos/kube-monkey/helm$
然后进入 Helm chart 并找到 values.yaml
文件
$ /chaos/kube-monkey/helm$ cd kubemonkey/
$ /chaos/kube-monkey/helm/kubemonkey$ ls
Chart.yaml README.md templates values.yaml
下面,我将仅显示您需要更改的 values.yaml
文件的部分。它们通过在 config 部分中将其更改为 false
来禁用 dry-run 模式,然后将默认命名空间添加到白名单,以便它可以终止您部署的 Pod。您必须保留 blacklistedNamespaces
值,否则会严重损坏您的系统。
更改此项
config:
dryRun: true
runHour: 8
startHour: 10
endHour: 16
blacklistedNamespaces:
- kube-system
whitelistedNamespaces: []
改为此项
config:
dryRun: false
runHour: 8
startHour: 10
endHour: 16
blacklistedNamespaces:
- kube-system
whitelistedNamespaces: ["default"]
在 debug 部分,将 enabled
和 schedule_immediate_kill
设置为 true
。这将显示正在被终止的 Pod。
更改此项
debug:
enabled: false
schedule_immediate_kill: false
改为此项
debug:
enabled: true
schedule_immediate_kill: true
运行 helm install
$ /chaos/kube-monkey/helm$ helm install chaos kubemonkey
NAME: chaos
LAST DEPLOYED: Sat May 15 13:51:59 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Wait until the application is rolled out:
kubectl -n default rollout status deployment chaos-kube-monkey
2. Check the logs:
kubectl logs -f deployment.apps/chaos-kube-monkey -n default
检查 kube-monkey 日志,查看 Pod 是否正在被终止
$ /chaos/kube-monkey/helm$ kubectl logs -f deployment.apps/chaos-kube-monkey -n default
********** Today's schedule **********
k8 Api Kind Kind Name Termination Time
----------- --------- ----------------
v1.Deployment nginxtest 05/15/2021 15:15:22 -0400 EDT
********** End of schedule **********
I0515 19:15:22.343202 1 kubemonkey.go:70] Termination successfully executed for v1.Deployment nginxtest
I0515 19:15:22.343216 1 kubemonkey.go:73] Status Update: 0 scheduled terminations left.
I0515 19:15:22.343220 1 kubemonkey.go:76] Status Update: All terminations done.
I0515 19:15:22.343278 1 kubemonkey.go:19] Debug mode detected!
I0515 19:15:22.343283 1 kubemonkey.go:20] Status Update: Generating next schedule in 30 sec
您还可以使用 K9s 并观看 Pod 消亡。

(Jess Cherry, CC BY-SA 4.0)
恭喜!您现在已经运行了一个带有任意故障的混沌测试。您可以随时更改您的应用程序以在每周的特定日期和时间进行测试。
最终想法
虽然 kube-monkey 是一个很棒的混沌工程工具,但它确实需要大量的配置。因此,对于 Kubernetes 新手来说,它不是最好的入门混沌工程工具。另一个缺点是您必须编辑应用程序的 Helm chart 才能运行混沌测试。
此工具最适合在暂存环境中使用,以观察应用程序如何定期响应任意故障。这为您提供了一种长期方法,可以使用集群监控工具跟踪不稳定状态。它还记录了您可以在生产环境中用于内部应用程序恢复的笔记。
评论已关闭。