跳到主要内容

模拟 Pod 故障

Pod 故障包括 Pod failure、Pod kill 和 Container kill。

  • Pod failure:向指定的 Pod 注入故障,使得该 Pod 在一段时间内不可用;
  • Pod kill:杀死指定的 Pod。为确保 Pod 能够成功重启,需要配置 ReplicaSet 或类似的机制;
  • Container kill:杀死目标 Pod 中的指定容器。

使用限制

无论 Pod 是否绑定至 Deployment、StatefulSet、DaemonSet 或其他控制器,Chaos Mesh 都可以向任一 Pod 注入 PodChaos。当向独立的 Pod 注入 PodChaos 时,可能会发生不同的情况。比如,向独立的 Pod 注入 pod-kill 故障时,无法保证应用程序在故障发生后能够恢复正常。

开始之前

  • 确保在目标 Pod 上没有运行 Chaos Mesh 的控制管理器。
  • 如果故障类型是 pod-kill,请配置 ReplicaSet 或类似机制,确保 Pod 能够自动重启。

使用 kbcli 模拟故障注入

下表介绍所有 Pod 故障类型的常见字段。

📎 Table 1. Pod 故障参数说明

参数说明默认值是否必填
pod name指定注入故障的 Pod 名称。例如,
在命令中添加 Pod 名称 mysql-cluster-mysql-0,完整命令为 kbcli fault pod kill mysql-cluster-mysql-0
默认
--namespace指定创建 Chaos 的命名空间。当前命名空间
--ns-fault指定一个命名空间,使该命名空间中的所有 Pod 都无法使用。例如,
kbcli fault pod kill --ns-fault=kb-system
默认
--node指定一个节点,使该节点上的所有 Pod 都无法使用。例如,
kbcli fault pod kill --node=minikube-m02
--label指定一个标签,使默认命名空间中具有该标签的 Pod 无法使用。例如,
kbcli fault pod kill --label=app.kubernetes.io/component=mysql
--node-label指定一个节点标签,使具有该节点标签的节点上的所有 Pod 都无法使用。例如,
kbcli fault pod kill --node-label=kubernetes.io/arch=arm64
--mode指定实验的运行方式,可选择项包括:one(表示随机选出一个符合条件的 Pod)、all(表示选出所有符合条件的 Pod)、fixed(表示选出指定数量且符合条件的 Pod)、fixed-percent(表示选出占符合条件的 Pod 中指定百分比的 Pod)、random-max-percent(表示选出占符合条件的 Pod 中不超过指定百分比的 Pod)。all
--value取决于 mode 的配置,为 mode 提供对应的参数。例如,当你将 mode 配置为 fixed-percent 时,value 用于指定 Pod 的百分比。例如,
kbcli fault pod kill --mode=fixed-percent --value=50
--duration指定实验的持续时间。10s

Pod kill

执行以下命令,将 pod-kill 注入到默认命名空间中的所有 Pod 中,使这些 Pod 被杀死。

kbcli fault pod kill

Pod failure

执行以下命令,将 pod-failure 注入到默认命名空间中的所有 Pod 中,并使这些 Pod 在 10 秒内不可用。

kbcli fault pod failure --duration=10s

Container kill

执行以下命令,将 container-kill 注入到默认命名空间中所有 Pod 的容器中,并使这些容器被杀死。注意,--container 是必需的。

kbcli fault pod kill-container --container=mysql

你还可以添加多个容器。例如,在默认命名空间中杀死 mysqlconfig-manager 容器。

kbcli fault pod kill-container --container=mysql --container=config-manager

使用 YAML 文件模拟故障注入

本节介绍如何使用 YAML 文件模拟故障注入。你可以在上述 kbcli 命令的末尾添加 --dry-run 命令来查看 YAML 文件,还可以参考 Chaos Mesh 官方文档获取更详细的信息。

Pod kill 示例

  1. 将实验配置写入到 pod-kill.yaml 文件中。

    在下例中,Chaos Mesh 向指定的 Pod 中注入了 pod-kill 故障,使该 Pod 被杀死。

    apiVersion: chaos-mesh.org/v1alpha1
    kind: PodChaos
    metadata:
    creationTimestamp: null
    generateName: pod-chaos-
    namespace: default
    spec:
    action: pod-kill
    duration: 10s
    mode: fixed-percent
    selector:
    namespaces:
    - default
    labelSelectors:
    'app.kubernetes.io/component': 'mysql'
    value: "50"
  2. 使用 kubectl 创建实验。

    kubectl apply -f ./pod-kill.yaml

Pod failure 示例

  1. 将实验配置写入到 pod-failure.yaml 文件中。

    在下例中,Chaos Mesh 向指定的 Pod 中注入了 pod-failure 故障,使该 Pod 在 30 秒内不可用。

    apiVersion: chaos-mesh.org/v1alpha1
    kind: PodChaos
    metadata:
    creationTimestamp: null
    generateName: pod-chaos-
    namespace: default
    spec:
    action: pod-failure
    duration: 30s
    mode: fixed-percent
    selector:
    namespaces:
    - default
    labelSelectors:
    'app.kubernetes.io/component': 'mysql'
    value: "50"
  2. 使用 kubectl 创建实验。

    kubectl apply -f ./pod-kill.yaml

Container kill 示例

  1. 将实验配置写入到 container-kill.yaml 文件中。

    在下例中,Chaos Mesh 向指定的 Pod 中注入了 container-kill 故障,使该 Container 被杀死。

    apiVersion: chaos-mesh.org/v1alpha1
    kind: PodChaos
    metadata:
    creationTimestamp: null
    generateName: pod-chaos-
    namespace: default
    spec:
    action: container-kill
    duration: 10s
    mode: fixed-percent
    selector:
    namespaces:
    - default
    labelSelectors:
    'app.kubernetes.io/component': 'mysql'
    value: "50"
  2. 使用 kubectl 创建实验。

    kubectl apply -f ./pod-kill.yaml

字段说明

下表介绍以上 YAML 配置文件中的字段。

参数类型说明默认值是否必填示例
actionstring指定要注入的故障类型,仅支持 pod-failurepod-killcontainer-killpod-kill
durationstring指定实验的持续时间。10s
modestring指定实验的运行方式,可选项包括:one(表示随机选出一个符合条件的 Pod)、all(表示选出所有符合条件的 Pod)、fixed(表示选出指定数量且符合条件的 Pod)、fixed-percent(表示选出占符合条件的 Pod 中指定百分比的 Pod)和 random-max-percent(表示选出占符合条件的 Pod 中不超过指定百分比的 Pod)。fixed-percent
valuestring取决于 mode 的配置,为 mode 提供对应的参数。例如,当你将 mode 配置为 fixed-percent 时,value 用于指定 Pod 的百分比。50
selectorstruct通过定义节点和标签来指定目标 Pod。
如果未指定,系统将终止默认命名空间下的所有 Pod。
containerNamesstring当你将 action 配置为 container-kill 时,此配置为必填,用于指定注入故障的目标 Container 名。mysql
gracePeriodint64当你将 action 配置为 pod-kill 时,此配置为必填,用于指定删除 Pod 之前的持续时间。00
durationstring指定实验的持续时间。30s