最近更新时间:2026-05-28 16:37:25
对于运行一次性任务(如 Job、CronJob 或短作业)的 KCI Pod,当其生命周期进入终态(PodSucceeded 或 PodFailed)后,默认情况下底层的计算资源(虚拟机实例)会立即被释放销毁。为了给运维排查、日志留存或核心产物导出预留充足的时间,KCI 提供了如下两个 Annotation参数,用于精确控制在何种退出状态下,延迟销毁底层的虚拟机资源。
注解键 (Annotation Key) | 类型 | 详细描述 | 默认值 |
k8s.ksyun.com/kci-finish-waiting-policy | String | 延迟销毁的触发策略。 • Always: 无论 Pod 成功还是失败,均触发延迟销毁。 • OnFailure: 仅在 Pod 运行失败(v1.PodFailed)时触发延迟销毁。 • Never: 不延迟,Pod 运行结束立即销毁底层 VM。 | Never |
k8s.ksyun.com/kci-finish-waiting-seconds | String | 延迟销毁的等待时长,单位:秒。 必须配合同名策略参数使用,当满足策略条件时,底层 VM 将在指定秒数后执行释放。 | "0" |
当两个参数组合配置为 OnFailure 且时间为 N 秒时,KCI 底层控制面的具体行为逻辑如下:
场景一:Pod 运行成功 (status.phase == Succeeded)
底层行为:由于配置的是 OnFailure(仅失败时等待),KCI 控制面判定不满足延迟条件。
结果:底层资源将被立即删除,避免产生不必要的额外按量计费。
场景二:Pod 运行失败 (status.phase == Failed)
底层行为:Pod 进程因非 0 状态码退出、OOMKilled 或被驱逐导致进入 Failed 状态。
结果:在 N 秒的窗口期内,底层资源依然保持存在且维持当前状态。超时之后,KCI 控制面才会最终发起底层资源销毁动作,期间可以执行logs操作。
在批处理、AI 训练或 CI/CD 构建任务中,如果任务成功,我们希望资源立刻释放以节省成本;但如果任务发生异常崩溃,需要查看日志。
YAML 配置示例:
apiVersion: batch/v1
kind: Job
metadata:
name: rbkci-job
namespace: default
labels:
app: sandbox
spec:
backoffLimit: 0
template:
metadata:
annotations:
k8s.ksyun.com/kci-finish-waiting-policy: "OnFailure"
k8s.ksyun.com/kci-finish-waiting-seconds: "300"
labels:
app: sandbox
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
containers:
- name: sandbox
image: hub.kce.ksyun.com/ksyun/busybox:1.33.1
command: ["sh", "-c"]
args:
- |
echo "===> 容器启动成功,等待 10 秒后模拟异常..."
sleep 10
echo "❌ 触发模拟致命错误,退出!"
exit 1
restartPolicy: Never
tolerations:
- key: rbkci-virtual-kubelet.io/provider
value: kingsoftcloud
effect: NoSchedule在延迟等待的 N 秒期间,由于底层实例和云盘资源依然被占用,在此期间可能会持续产生少量的按量计费(取决于底层套餐策略),建议不要将 N 设得过大。
纯净模式
