在这个庆祝 Kubernetes 诞生 11 周年的系列文章中,我介绍了一些很棒的混沌工程工具。在第一篇文章中,我解释了什么是混沌工程,在第二篇文章中,我演示了如何获取系统的稳定状态,以便可以将其与混沌状态进行比较。在接下来的四篇文章中,我介绍了一些混沌工程工具:Litmus,用于在 Kubernetes 集群中测试任意故障和实验;Chaos Mesh,一个具有 Web 用户界面的开源混沌编排器;Kube-monkey,通过在集群中安排随机终止 Pod 来对系统进行压力测试;以及Kube DOOM,用于在玩乐的同时杀死 Pod。
现在,我将把所有内容整合在一起,作为这份生日礼物的结尾。我将使用 Grafana 和 Prometheus 监控本地集群的稳定状态,使用 Chaos Mesh 和一个小型部署以及两个实验来查看稳定状态和非稳定状态之间的差异,以及 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 预安装 Pod
在继续之前,您需要将一些 Pod 部署到集群中。 为此,我生成了一个简单的 Helm chart,并将我的 values 文件中的副本数从 1 更改为 8。
如果您需要生成 Helm chart,您可以阅读我关于创建 Helm chart的文章以获取指导。 我创建了一个名为 `nginx` 的 Helm chart,并创建了一个命名空间以使用以下命令将我的 chart 安装到其中。
创建一个命名空间
$ kubectl create ns nginx
使用名称将 chart 安装到您的新命名空间中
$ helm install chaos-pods nginx -n nginx
NAME: chaos-pods
LAST DEPLOYED: Sun May 23 10:15:52 2021
NAMESPACE: nginx
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace nginx -l "app.kubernetes.io/name=nginx,app.kubernetes.io/instance=chaos-pods" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace nginx $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace nginx port-forward $POD_NAME 8080:$CONTAINER_PORT
监控和浸泡
接下来,按照步骤安装和设置 Prometheus 和 Grafana,如本系列的第二篇文章中所述。 但是,您需要在安装中进行以下更改
$ kubectl create ns monitoring
$ helm install prometheus prometheus-community/prometheus -n monitoring
$ helm install grafana bitnami/grafana -n monitoring
现在所有内容都安装在单独的命名空间中,设置您的仪表板并让 Grafana 浸泡几个小时以获得良好的稳定状态。 如果您在工作场所的暂存或开发集群中,最好让一切静置一周左右。
对于本演练,我将使用 K8 集群详细信息仪表板(仪表板 10856),该仪表板提供各种下拉列表,其中包含有关您的集群的详细信息。

(Jess Cherry, CC BY-SA 4.0)
测试 #1:使用 Grafana 和 Chaos Mesh 杀死容器
使用我之前的文章中的步骤安装和配置 Chaos Mesh。 设置完成后,您可以添加一些新的实验来使用 Grafana 进行测试和观察。
首先,设置一个杀死容器的实验。 首先,查看您的稳定状态。

(Jess Cherry, CC BY-SA 4.0)
接下来,创建一个指向您的 Nginx 容器的 kill-container 实验。 我创建了一个 `experiments` 目录,然后创建了 `container-kill.yaml` 文件
$ mkdir experiments
$ cd experiments/
$ touch container-kill.yaml
该文件将如下所示
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: container-kill-example
namespace: nginx
spec:
action: container-kill
mode: one
containerName: 'nginx'
selector:
labelSelectors:
'app.kubernetes.io/instance': 'nginx'
scheduler:
cron: '@every 60s'
一旦启动,此实验将每分钟杀死一个 `nginx` 容器。
应用您的文件
$ kubectl apply -f container-kill.yaml
podchaos.chaos-mesh.org/container-kill-example created
现在实验已到位,请在 Chaos Mesh 中观看它的运行。

(Jess Cherry, CC BY-SA 4.0)
您还可以查看 Grafana,并看到 Pod 和容器的状态发生了显着变化。

(Jess Cherry, CC BY-SA 4.0)
如果您更改了杀死时间并重新应用该实验,您将在 Grafana 中看到更多内容。 例如,将 `@every 60s` 更改为 `@every 30s` 并重新应用该文件
$ kubectl apply -f container-kill.yaml
podchaos.chaos-mesh.org/container-kill-example configured
$
您可以在 Grafana 中看到中断,其中两个容器处于等待状态。

(Jess Cherry, CC BY-SA 4.0)
现在您已经了解了容器的反应方式,请进入 Chaos Mesh 用户界面并暂停实验。
测试 #2:使用 Grafana 和 Chaos Mesh 进行网络测试
下一个测试将使用网络延迟来查看 Pod 之间出现问题时会发生什么。 首先,从 Grafana 获取您的稳定状态。

(Jess Cherry, CC BY-SA 4.0)
为您的实验创建一个 `networkdelay.yaml` 文件
$ touch networkdelay.yaml
然后添加一些网络延迟详细信息。 此示例在 `nginx` 命名空间中针对您的命名空间实例运行延迟。 发送数据包的延迟将为 90 毫秒,抖动将为 90 毫秒,抖动相关性将为 25%
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: network-delay-example
namespace: nginx
spec:
action: delay
mode: one
selector:
labelSelectors:
'app.kubernetes.io/instance': 'nginx'
delay:
latency: "90ms"
correlation: "25"
jitter: "90ms"
duration: "45s"
scheduler:
cron: "@every 1s"
保存并应用该文件
$ kubectl apply -f networkdelay.yaml
networkchaos.chaos-mesh.org/network-delay-example created
它应该在 Chaos Mesh 中显示为实验。

(Jess Cherry, CC BY-SA 4.0)
现在它正在使用您的配置进行广泛运行,您应该在 Grafana 中看到一个有趣的、显着的变化。

(Jess Cherry, CC BY-SA 4.0)
在图中,您可以看到 Pod 正在经历延迟。
恭喜! 您有了一种更详细的方法来跟踪和测试网络问题。
混沌工程的最终思考
我为庆祝 Kubernetes 的生日而提供的礼物是分享一些混沌工程工具。 混沌工程还有很多发展要做,但参与的人越多,测试和工具就会越好。 混沌工程可以很有趣且易于设置,这意味着每个人 - 从您的开发团队到您的管理人员 - 都可以做到。 这将使您的基础设施及其托管的应用程序更加可靠。
Kubernetes 生日快乐! 我希望这个系列是作为 11 年来一直是一个很酷的项目的良好礼物。
3 条评论