故意终止 Kubernetes 容器会发生什么?

在本系列关于混沌工程的最后一篇文章中,进行一些实验,了解更改如何影响基础设施的状态。
82 位读者喜欢这篇文章。
x sign

Thomas Hawk via Flickr。CC BY-NC 2.0

在本系列庆祝 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),它提供了各种下拉菜单,其中包含有关您的集群的详细信息。

测试 #1:使用 Grafana 和 Chaos Mesh 杀死容器

使用我之前文章中的步骤安装和配置 Chaos Mesh。设置完成后,您可以添加一些新实验以使用 Grafana 进行测试和观察。

首先,设置一个实验来杀死容器。首先,查看您的稳定状态。

接下来,创建一个指向您的 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 中观看它的运行情况。

您还可以查看 Grafana,并看到 Pod 和容器状态的显着变化。

如果您更改杀死时间并重新应用实验,您将在 Grafana 中看到更多变化。例如,将 @every 60s 更改为 @every 30s 并重新应用该文件

$ kubectl apply -f container-kill.yaml
podchaos.chaos-mesh.org/container-kill-example configured
$ 

您可以在 Grafana 中看到中断,其中两个容器处于等待状态。

现在您已经了解了容器的反应方式,请进入 Chaos Mesh 用户界面并暂停实验。

测试 #2:使用 Grafana 和 Chaos Mesh 进行网络测试

下一个测试将处理网络延迟,以查看 Pod 之间出现问题时会发生什么。首先,从 Grafana 获取您的稳定状态。

为您的实验创建一个 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 中显示为实验。

现在它正在使用您的配置进行广泛运行,您应该在 Grafana 中看到有趣且明显的变化。

在图中,您可以看到 Pod 正在经历延迟。

恭喜!您现在有了一种更详细的方法来跟踪和测试网络问题。

混沌工程的最终思考

我为庆祝 Kubernetes 生日而准备的礼物是分享一些混沌工程工具。混沌工程还有很多发展空间,但参与的人越多,测试和工具就会越好。混沌工程可能很有趣且易于设置,这意味着每个人——从您的开发团队到您的管理部门——都可以做到。这将使您的基础设施及其托管的应用程序更加可靠。

Kubernetes,生日快乐!我希望这个系列文章对于这个很酷的项目 11 周年来说是一份不错的礼物。

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

3 条评论

很棒的文章...Kubernetes 是 11 年...还是 7 年?

真的,11 岁了。炒作曲线需要一段时间才能成熟。这真是太棒了!

© . All rights reserved.