定义调度规则
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
调度概览
本文档介绍如何使用 Chaos Mesh 创建定时任务,该任务能够在固定时间(或固定时间间隔)自动创建混沌实验。
在 Kubernetes 中,Chaos Mesh 使用 Schedule 来描述定时任务。
Schedule 对象的名称不应超过 57 个字符,因为创建的混沌实验会在名称末尾添加 6 个额外随机字符。与 Workflow 一起使用的 Schedule 对象名称不应超过 51 个字符,因为 Workflow 会在名称末尾添加 6 个额外随机字符。
使用 YAML 文件和 kubectl 创建调度规则
例如,要在每小时的第 5 分钟施加持续 12 秒的 100 毫秒延迟,请按如下方式配置 YAML 文件:
apiVersion: chaos-mesh.org/v1alpha1
kind: Schedule
metadata:
name: schedule-delay-example
spec:
schedule: '5 * * * *'
historyLimit: 2
concurrencyPolicy: 'Allow'
type: 'NetworkChaos'
networkChaos:
action: delay
mode: one
selector:
namespaces:
- default
labelSelectors:
'app': 'web-show'
delay:
latency: '10ms'
correlation: '100'
jitter: '0ms'
duration: '12s'
将此 YAML 文件保存为 schedule-networkchaos.yaml,然后运行 kubectl apply -f ./schedule-networkchaos.yaml。
基于此配置,Chaos Mesh 会在每小时的第 5 分钟(例如 0:05、1:05……)创建以下 NetworkChaos 对象:
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: schedule-delay-example-xxxxx
spec:
action: delay
mode: one
selector:
namespaces:
- default
labelSelectors:
'app': 'web-show'
delay:
latency: '10ms'
correlation: '100'
jitter: '0ms'
duration: '12s'
Schedule 中的字段说明如下,其与 Kubernetes CronJob 的字段基本相似。更多信息请参考 Kubernetes CronJob 文档。
schedule 字段的时区取决于 chaos-controller-manager 的时区。
schedule 字段
schedule 字段用于指定实验的运行时间。换言之,定时任务的别名就是 cron 任务:
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday; 7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>
Chaos Mesh 内部使用 robfig/cron/v3 将 schedule 字段转换为 cron 表达式。
如果需要生成定时规则,可使用 crontab.guru 等在线工具。
预定义时间表
除常规语法外,还支持多种预定义时间表。您可使用以下预定义时间表替代 cron 表达式:
| Entry | Description | Equivalent To |
|---|---|---|
| @yearly (or @annually) | Run once a year, midnight, Jan. 1st | 0 0 1 1 * |
| @monthly | Run once a month, midnight, first of month | 0 0 1 * * |
| @weekly | Run once a week, midnight between Sat/Sun | 0 0 * * 0 |
| @daily (or @midnight) | Run once a day, midnight | 0 0 * * * |
| @hourly | Run once an hour, beginning of hour | 0 * * * * |
此表取自 https://pkg.go.dev/github.com/robfig/cron/v3#hdr-Predefined_schedules。
时间间隔
您还可以安排任务以固定时间间隔执行,从任务添加时或 cron 运行时开始计时。通过以下格式的 cron 规范实现:
@every <duration>
例如,@every 1h30m10s 表示计划在 1 小时 30 分 10 秒后激活,之后按相同间隔周期性执行。
Intervals 的内容取自 https://pkg.go.dev/github.com/robfig/cron/v3#hdr-Intervals. 更多信息请参阅官方文档。
historyLimit 字段
实验结束后,其对应历史记录不会被删除,便于在出现错误时检索和观察结果。historyLimit 设置的数值为保留任务数量,该数量包含进行中的任务。Chaos Mesh 不会删除运行中的任务。
当任务数量超过 historyLimit 时,Chaos Mesh 会按创建顺序删除最早的任务。若这些任务仍在运行,则会被跳过且不会被删除。
concurrencyPolicy 字段
该字段可选值为 "Forbid"、"Allow" 和 ""。
此字段用于控制是否允许该 Schedule 对象创建多个并行实验。例如使用 schedule: * * * * * 配置时,系统每分钟都会创建新实验。若实验的 duration 配置为 70 秒,则会出现多个实验同时运行的情况。
默认情况下 concurrencyPolicy 字段设为 Forbid,表示禁止并行创建实验。若将 concurrencyPolicy 设为 Allow,则允许同时创建多个实验。
以下仍以延迟实验为例进行说明:
spec:
schedule: '* * * * *'
type: 'NetworkChaos'
networkChaos:
action: delay
mode: one
selector:
namespaces:
- default
labelSelectors:
'app': 'web-show'
delay:
latency: '10ms'
duration: '70s'
在此配置下,若设置 concurrencyPolicy: "Allow",则每分钟的前 10 秒会产生 20 毫秒延迟,剩余 50 秒保持 10 毫秒延迟。若设置 concurrencyPolicy: "Forbid",则始终维持 10 毫秒延迟。
注意:并非所有实验类型都支持在同一个 Pod 上并行执行多个实验。具体支持情况请查阅对应实验类型的文档。
startingDeadlineSeconds 字段
startingDeadlineSeconds 的默认值为 nil。
当 startingDeadlineSeconds 设为 nil 时,Chaos Mesh 会检查从上次调度时刻至今是否存在遗漏实验(可能因关闭 Chaos Mesh、长时间暂停 Schedule 或设置 concurrencyPolicy 为 Forbid 导致)。
当 startingDeadlineSeconds 设为大于 0 的数值时,Chaos Mesh 将检查当前时间前推 startingDeadlineSeconds 秒内是否有遗漏的实验。若 startingDeadlineSeconds 的值过小可能导致实验遗漏,例如:
spec:
schedule: '* * * * *'
type: 'NetworkChaos'
networkChaos:
action: delay
mode: one
selector:
namespaces:
- default
labelSelectors:
'app': 'web-show'
startingDeadlineSeconds: 5
delay:
latency: '10ms'
duration: '70s'
上例中,由于 concurrencyPolicy 设为 Forbid,每分钟开始时禁止创建新任务。在该分钟第 10 秒,当上次创建的混沌实验运行结束后,受限于 startingDeadlineSeconds 设置和 concurrencyPolicy 约束,系统不会补发遗漏事件,新实验将延迟至下一分钟开始时创建。
若未设置 startingDeadlineSeconds(或设为 nil),则系统会始终维持 10 毫秒延迟。这是因为每当运行中的任务结束后,Chaos Mesh 会检测到因 concurrencyPolicy 被设置为 Forbid 导致的遗漏任务,并立即创建新任务。
更多示例及详细说明请参阅 Kubernetes CronJob 文档。
定义实验内容
定义实验具体内容时,需在 Schedule 中配置两个字段:type 和 *Chaos。type 字段指定实验类型,*Chaos 字段描述实验参数。通常 type 采用大驼峰命名(如 NetworkChaos, PodChaos, IOChaos),而 *Chaos 的键名采用小驼峰(如 networkChaos, podChaos, ioChaos)。*Chaos 键值对应实验类型的 spec 配置,具体参数请参考各类实验文档。
通过 Chaos Dashboard 创建调度规则
-
打开 Chaos Dashboard,点击页面中的 新建实验 按钮

创建计划 -
选择并填写实验的具体细节。

选择并填写内容 -
填写包括计划周期和并发策略在内的信息。

填写计划规则 -
提交实验信息。
暂停定时任务
与 CronJob 不同,暂停 Schedule 不仅会阻止其创建新实验,还会暂停已创建的实验。
如果当前不想以定时任务方式创建 Chaos 实验,需要为 Schedule 对象添加 experiment.chaos-mesh.org/pause=true 注解。可通过 kubectl 命令添加注解:
kubectl annotate -n $NAMESPACE schedule $NAME experiment.chaos-mesh.org/pause=true
命令中 $NAMESPACE 表示命名空间,$NAME 为 Schedule 的名称。成功返回结果如下:
schedule/$NAME annotated
如需取消暂停任务,可使用以下命令移除注解:
kubectl annotate -n $NAMESPACE schedule $NAME experiment.chaos-mesh.org/pause-
命令中 $NAMESPACE 表示命名空间,$NAME 为 Schedule 的名称。成功返回结果如下:
schedule/$NAME annotated