跳到主要内容

模拟 HTTP 故障

HTTPChaos 实验用于模拟在 HTTP 请求和响应过程中发生故障的场景。目前,HTTPChaos 支持以下几种故障类型:

  • Abort:中断请求和响应;
  • Delay:为请求或响应过程注入延迟;
  • Replace:替换 HTTP 请求或响应报文中的部分内容;
  • Patch:在 HTTP 请求或响应报文中添加额外内容。

HTTPChaos 支持多种故障类型的组合。在创建 HTTPChaos 实验时,如果同时配置了多种 HTTP 故障类型,实验运行时注入故障的优先级(顺序)固定为 abort -> delay -> replace -> patch。其中 abort 故障会导致短路,直接中断此次连接。

开始之前

在注入 HTTPChaos 相关故障之前,请注意以下事项:

  • 确保目标 Pod 上没有运行 Chaos Mesh 的 Control Manager。
  • 默认情况下,相关命令将同时作用于 Pod 中的客户端和服务器。如果你不需要这种设置,请参考官方文档
  • 确保目标服务已禁用 HTTPS 访问,因为 HTTPChaos 暂不支持注入 HTTPS 连接。
  • 为使 HTTPChaos 故障注入生效,尽量避免复用客户端的 TCP socket,在注入故障前建立的 TCP socket 上进行 HTTP 请求不受 HTTPChaos 影响。
  • 请在生产环境谨慎使用非幂等语义请求(例如大多数 POST 请求)。若使用了这类请求,故障注入后可能无法通过重复请求使目标服务恢复正常状态。

使用 kbcli 模拟故障注入

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

📎 Table 1. kbcli HTTP 故障参数说明

参数说明默认值是否必填
--target指定故障注入的目标过程为 RequestResponse,需要同时配置与 target 相关的字段。Request
--port指定目标服务监听的 TCP 端口。80
--path指定目标请求的 URL 路径,支持通配符*
--method指定目标请求的 HTTP method。GET
--code指定目标响应的状态码,仅当 target=response 时生效。0

Abort

执行以下命令,向指定的 Pod 中注入 abort 故障 1 分钟。

kbcli fault network http abort --duration=1m

Delay

执行以下命令,向指定的 Pod 中注入 delay 故障 15 秒。

kbcli fault network http delay --delay=15s

Replace

执行以下命令,替换 HTTP 请求或响应报文中的部分内容,持续 1 分钟。

kbcli fault network http replace --replace-method=PUT --duration=1m

Patch

执行以下命令,在 HTTP 请求或响应报文中添加额外的内容。

kbcli fault network http patch --body='{"key":""}' --type=JSON --duration=30s

使用 YAML 文件模拟故障注入

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

HTTP abort 示例

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

    在下例中,Chaos Mesh 将向指定的 Pod 中注入 abort 故障 1 分钟。

    apiVersion: chaos-mesh.org/v1alpha1
    kind: HTTPChaos
    metadata:
    creationTimestamp: null
    generateName: http-chaos-
    namespace: default
    spec:
    abort: true
    duration: 1m
    method: GET
    mode: all
    path: '*'
    port: 80
    selector:
    namespaces:
    - default
    target: Request
  2. 使用 kubectl 创建实验。

    kubectl apply -f ./http-abort.yaml

HTTP delay 示例

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

    在下例中,Chaos Mesh 将向指定的 Pod 中注入 delay 故障 15 秒。

    apiVersion: chaos-mesh.org/v1alpha1
    kind: HTTPChaos
    metadata:
    creationTimestamp: null
    generateName: http-chaos-
    namespace: default
    spec:
    delay: 15s
    duration: 10s
    method: GET
    mode: all
    path: '*'
    port: 80
    selector:
    namespaces:
    - default
    target: Request
  2. 使用 kubectl 创建实验。

    kubectl apply -f ./http-delay.yaml

HTTP replace 示例

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

    在下例中,Chaos Mesh 将替换 HTTP 请求或响应报文中的部分内容,持续 1 分钟。

    apiVersion: chaos-mesh.org/v1alpha1
    kind: HTTPChaos
    metadata:
    creationTimestamp: null
    generateName: http-chaos-
    namespace: default
    spec:
    duration: 1m
    method: GET
    mode: all
    path: '*'
    port: 80
    replace:
    method: PUT
    selector:
    namespaces:
    - default
    target: Request
  2. 使用 kubectl 创建实验。

    kubectl apply -f ./http-replace.yaml

HTTP patch 示例

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

    在下例中,Chaos Mesh 将在 HTTP 请求或响应报文中添加额外的内容。

    apiVersion: chaos-mesh.org/v1alpha1
    kind: HTTPChaos
    metadata:
    creationTimestamp: null
    generateName: http-chaos-
    namespace: default
    spec:
    duration: 30s
    method: GET
    mode: all
    patch:
    body:
    type: JSON
    value: '{"key":""}'
    path: '*'
    port: 80
    selector:
    namespaces:
    - default
    target: Request
  2. 使用 kubectl 创建实验。

    kubectl apply -f ./http-patch.yaml