在本系列庆祝 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 条评论