给任务加一个总时长上限
activeDeadlineSeconds 从 Pod 启动开始计时,超过上限后任务被终止并标记为失败(原因通常是超期),且不再重试。它限制的是整体运行时间,把重试消耗的时间也算在内,因此要按最坏情况估算。这个字段是为限期任务设计的:长期运行的服务不要使用它,否则会被定时终止,行为与预期完全不符。
基本信息
| 适用对象 | Job 与 Pod |
|---|---|
| 关键字段 | spec.activeDeadlineSeconds |
| 计时起点 | 从 Pod 启动开始 |
| 超时结果 | 任务被终止并标记失败,不再重试 |
| 与重试的关系 | backoffLimit 与截止时间谁先满足就按谁处理 |
典型使用场景
- 批处理防挂死:任务因下游无响应长期卡住时自动终止
- 数据同步窗口:限定任务必须在窗口内结束,超时即失败重排
- 资源净化:防止失败任务长期占用节点与配额
- 压测与演练:限定时间盒,避免测试任务无限运行
- 与配额作用域配合:限期类任务的判定依据之一
配置示例
配置示例
apiVersion: batch/v1
kind: Job
metadata:
name: batch-x
namespace: prod
spec:
activeDeadlineSeconds: 1800 # 总时长上限,30 分钟
backoffLimit: 2
template:
spec:
restartPolicy: Never
containers:
- name: task
image: registry.example.com/task:3.1查看超时状态
查看超时状态
kubectl get job batch-x -o jsonpath='{.status.conditions[*].reason}'
kubectl describe job batch-x | grep -i -A2 deadline
kubectl get pods -l job-name=batch-x -o wide
kubectl get events -n prod --field-selector reason=DeadlineExceeded | tail相关字段与作用
| 字段 | 作用 | 注意 |
|---|---|---|
| activeDeadlineSeconds | 总运行时长上限 | 包含所有重试消耗的时间 |
| backoffLimit | 失败重试次数上限 | 与截止时间取先到者 |
| restartPolicy | 容器重启策略 | 需要与 Job 语义匹配 |
| ttlSecondsAfterFinished | 完成后对象保留时长 | 先查完日志再让它自动清理 |
截止时间包含所有重试:设置过紧会让本来能成功的重试来不及完成,表现为重试次数没用完任务就失败了。
这个字段也是配额作用域的分类依据:设置了它的 Pod 会被归入限期类,可与长驻服务的配额分别管理。
取值要结合任务的正常耗时分布来定:先统计历史运行时间的分布,再在上限位置留出合理余量,比凭感觉给一个整数更可靠。