在 Kubernetes 上使用 kube-monkey 测试任意 Pod 故障

Kube-monkey 提供了一种简单的方法来压力测试您的系统,通过在您的集群中调度随机终止 Pod。
45 位读者喜欢这篇文章。
Parts, modules, containers for software

Opensource.com

在本系列中,我介绍了多种混沌工程工具。本系列的第一篇文章解释了 什么是混沌工程;第二篇文章演示了如何获取您 系统的稳定状态,以便您可以将其与混沌状态进行比较;第三篇文章展示了如何 使用 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 部分,将 enabledschedule_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 消亡。

恭喜!您现在已经运行了一个带有任意故障的混沌测试。您可以随时更改您的应用程序以在每周的特定日期和时间进行测试。

最终想法

虽然 kube-monkey 是一个很棒的混沌工程工具,但它确实需要大量的配置。因此,对于 Kubernetes 新手来说,它不是最好的入门混沌工程工具。另一个缺点是您必须编辑应用程序的 Helm chart 才能运行混沌测试。

此工具最适合在暂存环境中使用,以观察应用程序如何定期响应任意故障。这为您提供了一种长期方法,可以使用集群监控工具跟踪不稳定状态。它还记录了您可以在生产环境中用于内部应用程序恢复的笔记。

接下来阅读什么
User profile image.
科技游民,从事我能找到的任何工作。IT 领域孤岛预防的倡导者,与所有团队共享信息的重要性。相信教育所有人以及开源开发。热爱所有科技事物。关于 K8s、混沌以及我可以找到的任何新事物和闪亮的事物!Mastodon ID

评论已关闭。

Creative Commons 许可协议本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.