跳至主内容
版本:2.6.7

定义调度规则

非官方测试版翻译

本页面由 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:051: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>

此图表取自 https://en.wikipedia.org/wiki/Cron。

Chaos Mesh 内部使用 robfig/cron/v3schedule 字段转换为 cron 表达式。

技巧

如果需要生成定时规则,可使用 crontab.guru 等在线工具。

预定义时间表

除常规语法外,还支持多种预定义时间表。您可使用以下预定义时间表替代 cron 表达式:

EntryDescriptionEquivalent To
@yearly (or @annually)Run once a year, midnight, Jan. 1st0 0 1 1 *
@monthlyRun once a month, midnight, first of month0 0 1 * *
@weeklyRun once a week, midnight between Sat/Sun0 0 * * 0
@daily (or @midnight)Run once a day, midnight0 0 * * *
@hourlyRun once an hour, beginning of hour0 * * * *

此表取自 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 或设置 concurrencyPolicyForbid 导致)。

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*Chaostype 字段指定实验类型,*Chaos 字段描述实验参数。通常 type 采用大驼峰命名(如 NetworkChaos, PodChaos, IOChaos),而 *Chaos 的键名采用小驼峰(如 networkChaos, podChaos, ioChaos)。*Chaos 键值对应实验类型的 spec 配置,具体参数请参考各类实验文档。

通过 Chaos Dashboard 创建调度规则

  1. 打开 Chaos Dashboard,点击页面中的 新建实验 按钮

    创建计划
    创建计划

  2. 选择并填写实验的具体细节。

    选择并填写内容
    选择并填写内容

  3. 填写包括计划周期和并发策略在内的信息。

    填写计划规则
    填写计划规则

  4. 提交实验信息。

暂停定时任务

CronJob 不同,暂停 Schedule 不仅会阻止其创建新实验,还会暂停已创建的实验。

如果当前不想以定时任务方式创建 Chaos 实验,需要为 Schedule 对象添加 experiment.chaos-mesh.org/pause=true 注解。可通过 kubectl 命令添加注解:

kubectl annotate -n $NAMESPACE schedule $NAME experiment.chaos-mesh.org/pause=true

命令中 $NAMESPACE 表示命名空间,$NAMESchedule 的名称。成功返回结果如下:

schedule/$NAME annotated

如需取消暂停任务,可使用以下命令移除注解:

kubectl annotate -n $NAMESPACE schedule $NAME experiment.chaos-mesh.org/pause-

命令中 $NAMESPACE 表示命名空间,$NAMESchedule 的名称。成功返回结果如下:

schedule/$NAME annotated