模拟 Pod 故障
本文档介绍如何使用 Chaos Mesh 为 Kubernetes Pod 注入故障,模拟 Pod 或容器故障,并提供 Chaos Dashboard 和 YAML 文件两种方式用于创建 PodChaos 实验。
PodChaos 是 Chaos Mesh 中的一种故障类型,通过创建 PodChaos 类型的混沌实验,你可以模拟指定 Pod 或者容器发生故障的情景。目前,PodChaos 支持模拟以下故障类型:
- Pod Failure:向指定的 Pod 中注入故障,使得该 Pod 在一段时间内处于不可用的状态。
- Pod Kill:杀死指定的 Pod 。为了保证 Pod 能够成功重启,需要配置 ReplicaSet 或者类似的机制。
- Container Kill:杀死位于目标 Pod 中的指定容器。
使用限制
目前 Chaos Mesh 仅支持向特定类型的 Pod 中注入故障,例如 Deployment、Statefulset、Daemonset。Chaos Mesh 不支持向独立的 Pod 中注入故障,独立的 Pod 指未绑定到 ReplicaSet 或 Deployment 的 Pod。
创建 PodChaos 实验前,请确保以下事项:
- 目标 Pod 上没有运行 Chaos Mesh 的 Control Manager。
- 如果故障类型为 Pod Kill,配置了 ReplicaSet 或者类似保证 Pod 能够自动重启的机制。
使用 Chaos Dashboard 方式创建实验
注意
在使用 Chaos Dashboard 创建实验前:
确保已经安装了 Chaos Dashboard。
如果已安装 Chaos Dashboard,你可以通过运行 命令的方式访问 Dashboard:
然后可以在浏览器中输入 访问 Chaos Dashboard。
在选择目标处选择 POD 故障,并选择具体行为,例如 POD FAILURE。
填写实验信息,指定实验范围以及实验计划运行时间。
将实验配置写入到文件中
pod-failure.yaml
,内容示例如下:apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: pod-failure-example
namespace: chaos-testing
spec:
action: pod-failure
mode: one
duration: '30s'
selector:
labelSelectors:
'app.kubernetes.io/component': 'tikv'
依据此配置示例,Chaos Mesh 将向指定的 Pod 中注入
pod-failure
故障,将使该 Pod 在 30 秒内处于不可用的状态。使用
kubectl
创建实验,命令如下:
将实验配置写入到文件中
pod-kill.yaml
,内容示例如下:apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: pod-kill-example
namespace: chaos-testing
spec:
mode: one
selector:
- tidb-cluster-demo
labelSelectors:
'app.kubernetes.io/component': 'tikv'
使用
kubectl
创建实验,命令如下:
将实验配置写入到文件中
container-kill.yaml
,内容示例如下:apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: container-kill-example
namespace: chaos-testing
spec:
action: container-kill
mode: one
containerNames: ['prometheus']
selector:
labelSelectors:
'app.kubernetes.io/component': 'monitor'
依据此配置示例,Chaos Mesh 将向指定的 Container 中注入
container-kill
故障,将使该 Container 被杀死一次。使用
kubectl
创建实验,命令如下:
下表介绍以上 YAML 配置文件中的字段。
“Pod Failure” 混沌实验的一些注意事项
简言之,这里有几个关于使用 “Pod Failure” 混沌实验的建议:
- 为容器配置
livenessProbe
和readinessProbe
。
Pod Failure 混沌实验将会改变目标 Pod 中每个容器的 image
为 “pause image”,这是一个特殊的镜像,不会执行任何操作。我们使用 gcr.io/google-containers/pause:latest
作为默认的 “pause image”,你可以在 helm values controllerManager.podChaos.podFailure.pauseImage
中更改它。
下载 “pause image” 将会消耗时间,并且这个时间将会被计入实验的持续时间中。所以你可能会发现,”实际受影响的时间” 可能会比配置的时间短。这是推荐设置可用的 “pause image” 的另一个原因。