Version: 2.1.4

创建 Chaos Mesh Workflow

Chaos Mesh Workflow 简介

在 Chaos Mesh 中模拟真实的系统故障时,通常伴随着持续验证。你可能希望在 Chaos Mesh 平台上构建一系列故障,而不是执行单个独立的混沌故障注入操作。

为满足该需求,Chaos Mesh 提供了 Chaos Mesh Workflow,一个内置的工作流引擎。使用该引擎,你可以串行或并行地执行多种不同的 Chaos 实验, 用于模拟生产级别的错误。

目前, Chaos Mesh Workflow 支持以下功能:

  • 串行编排
  • 并行编排
  • 自定义任务
  • 条件分支

使用场景举例:

  • 使用并行编排同时注入多个 NetworkChaos 模拟复杂的网络环境
  • 在串行编排中进行健康检查,使用条件分支决定是否执行剩下的步骤

Chaos Mesh Workflow 在设计时一定程度上参考了 Argo Workflow。如果您熟悉 Argo Workflow 您也能很快地上手 Chaos Mesh Workflow。

Github 仓库中含有其他 Workflow 的示例.

通过 Chaos Dashboard 创建 Workflow

第 1 步:打开 Chaos Dashboard

点击新的工作流

New Workflow

第 2 步:设置工作流基本信息

Workflow Info

第 3 步:配置工作流节点

  1. 根据需求选择选择任务类型

    在本示例中选择的任务类型为”单一“。

    注意

    Chaos Dashboard 会自动创建一个命名为 “entry” 的串行节点,作其用为该工作流的入口。

    Choose Task Type

  2. 填写实验信息

    配置方法与创建普通的混沌实验相同。比如,你可以设置一个 POD KILL 类型的 PodChaos 故障,并将其命名为 “kill-nginx”。

    Create podkill in Workflow

第 4 步:提交工作流

你可以先在预览查看工作流定义。确认无误后,点击提交工作流按钮创建工作流。

Submit Workflow

使用 YAML 文件与 kubectl 创建 Workflow

Workflow 类似于各种类型的 Chaos 对象,同样作为 CRD 存在于 kubernetes 集群中。你可以使用 kubectl create -f <workflow.yaml> 创建 Chaos Mesh Workflow。以下为创建的具体示例。使用本地 YAML 文件创建 Workflow:

  1. kubectl create -f <workflow.yaml>

使用网络上的 YAML 文件创建 Workflow:

  1. kubectl create -f https://raw.githubusercontent.com/chaos-mesh/chaos-mesh/master/examples/workflow/serial.yaml

一个简单的 Workflow YAML 文件定义如下所示,这个 Workflow 将会同时注入 StressChaosNetworkChaosPodChaos

  1. apiVersion: chaos-mesh.org/v1alpha1
  2. kind: Workflow
  3. metadata:
  4. name: try-workflow-parallel
  5. spec:
  6. entry: the-entry
  7. templates:
  8. - name: the-entry
  9. templateType: Parallel
  10. deadline: 240s
  11. children:
  12. - workflow-stress-chaos
  13. - workflow-network-chaos
  14. - workflow-pod-chaos-schedule
  15. - name: workflow-network-chaos
  16. templateType: NetworkChaos
  17. deadline: 20s
  18. networkChaos:
  19. direction: to
  20. action: delay
  21. mode: all
  22. selector:
  23. labelSelectors:
  24. 'app': 'hello-kubernetes'
  25. delay:
  26. latency: '90ms'
  27. correlation: '25'
  28. jitter: '90ms'
  29. - name: workflow-pod-chaos-schedule
  30. templateType: Schedule
  31. deadline: 40s
  32. schedule:
  33. schedule: '@every 2s'
  34. type: 'PodChaos'
  35. podChaos:
  36. action: pod-kill
  37. mode: one
  38. selector:
  39. labelSelectors:
  40. 'app': 'hello-kubernetes'
  41. - name: workflow-stress-chaos
  42. templateType: StressChaos
  43. deadline: 20s
  44. stressChaos:
  45. mode: one
  46. selector:
  47. labelSelectors:
  48. 'app': 'hello-kubernetes'
  49. stressors:
  50. cpu:
  51. workers: 1
  52. load: 20
  53. options: ['--cpu 1', '--timeout 600']

其中 templates 定义了实验中的各个步骤,entry 定义了 Workflow 执行时的入口。

templates 中的每个元素都代表了一个 Workflow 的步骤,例如:

  1. name: the-entry
  2. templateType: Parallel
  3. deadline: 240s
  4. children:
  5. - workflow-stress-chaos
  6. - workflow-network-chaos
  7. - workflow-pod-chaos

templateType: Parallel 代表节点的类型为并行;deadline: 240s 代表这个节点下的所有并行实验预期在 240 秒内执行完成,否则将超时;children 代表将要并行执行的其他 template 名称。

再例如:

  1. name: workflow-pod-chaos
  2. templateType: PodChaos
  3. deadline: 40s
  4. podChaos:
  5. action: pod-kill
  6. mode: one
  7. selector:
  8. labelSelectors:
  9. 'app': 'hello-kubernetes'

templateType: PodChaos 代表节点的类型为 PodChaos 实验;deadline: 40s 代表当前 Chaos 实验将持续 40 秒;podChaos 字段是 PodChaos 实验的定义。

通过 YAML 文件与 kubectl 创建 Workflow 较为灵活,你可以对串行活并行编排进行嵌套,声明复杂的编排,甚至可以与条件分支组合达到循环的效果。

字段说明

Workflow 字段说明

参数类型说明默认值是否必填示例
entrystring声明 Workflow 的入口,值为 templates 中某一 template 的名称。
templates[]Template声明 Workflow 中可执行的各个步骤的行为,详见 Template 字段说明

Template 字段说明

参数类型说明默认值是否必填示例
namestringtemplate 的名称,需要符合 DNS-1123 命名规范。any-name
typestringtemplate 的类型。可选值有: Task、Serial、Parallel、Suspend、Schedule、AWSChaos、DNSChaos、GCPChaos、HTTPChaos、IOChaos、JVMChaos、KernelChaos、NetworkChaos、PodChaos、StressChaos、TimeChaosPodChaos
deadlinestringtemplate 持续的时间。‘5m30s’
children[]string声明该 template 下的子任务,当 type 为 Serial 或 Parallel 时需要配置该字段。[“any-chaos-1”, “another-serial-2”, “any-shcedule”]
taskTask配置自定义任务,当 type 为 Task 时需要配置该字段。详见 Task 字段说明
conditionalBranches[]ConditionalBranch配置自定任务后的条件分支,当 type 为 Task 时可选配置该字段。详见 ConditionalBranch 字段说明
awsChaosobject配置 AWSChaos,当 type 为 AWSChaos 时需要配置该字段。详见 模拟 AWS 故障
dnsChaosobject配置 DNSChaos,当 type 为 DNSChaos 时需要配置该字段。详见 模拟 DNS 故障
gcpChaosobject配置 GCPChaos,当 type 为 GCPChaos,当 时需要配置该字段。详见 模拟 GCP 故障
httpChaosobject配置 HTTPChaos,当 type 为 HTTPChaos 时需要配置该字段。详见 模拟 HTTP 故障
ioChaosobject配置 IOChaos,当 type 为 IOChaos 时需要配置该字段。详见 模拟文件 I/O 故障
jvmChaosobject配置 JVMChaos,当 type 为 JVMChaos 时需要配置该字段。详见 模拟 JVM 应用故障
kernelChaosobject配置 KernelChaos,当 type 为 KernelChaos 时需要配置该字段。详见 模拟内核故障
networkChaosobject配置 NetworkChaos,当 type 为 NetworkChaos 时需要配置该字段。详见 模拟 AWS 故障
podChaosobject配置 PodChaosd ,当 type 为 PodChaosd 时需要配置该字段。详见 模拟网络故障
stressChaoobject配置 StressChaos,当 type 为 StressChaos 时需要配置该字段。详见 模拟压力场景
timeChaosobject配置 TimeChaos,当 type 为 TimeChaos 时需要配置该字段。详见 模拟时间故障
scheduleobject配置 Schedule ,当 type 为 Schedule 时需要配置该字段。详见 定义调度规则
注意

当在 Workflow 中建立有持续时间的 Chaos 时,需要将持续时间填写到外层的 deadline 字段中,而不是使用 Chaos 中的 duration 字段。

Task 字段说明

参数类型说明默认值是否必填示例
containerobject定义自定义任务容器,可参考 Container 字段说明
volumesarray若需要在自定义任务容器中挂载卷,则需要在该字段声明卷。关于完整定义可参考 corev1.Volume

ConditionalBranch 字段说明

参数类型说明默认值是否必填示例
targetstring当前条件分支想要执行的 template 名称another-chaos
expressionstring类型为布尔的表达式,在自定义任务完成后,当表达式值为真时,当前条件分支将会被执行。未设置该值时,条件分支将会在自定义任务完成后直接执行。exitCode == 0

目前在 expression 中提供了两个上下文变量:

  • exitCode 表示自定义任务的退出码。
  • stdout 表示自定义任务的标准输出。

更多的上下文变量将在后续补充。

可参考该文档编写 expression 表达式。

Container 字段说明

这里只列举了常用字段,关于完整定义可参考 corev1.Container

参数类型说明默认值是否必填示例
namestring容器名称task
imagestring镜像名称busybox:latest
command[]string容器执行的命令[“wget”, “-q”, “http://httpbin.org/status/201“]