已完成资源的 TTL 控制器
FEATURE STATE: Kubernetes v1.12
alpha
该功能目前处于 alpha 状态,意味着:
- 版本名称包含 alpha(例如 v1alpha1)。
- 可能存在问题,启用该功能可能会暴露 bug。默认情况下被禁用。
- 对该功能的支持可能在任何时候被取消,而不另行通知。
- API 可能会在以后的软件版本中以不兼容的方式被更改,而不另行通知。
- 建议仅在短期测试集群中使用该功能,这是因为使用该功能会增加出现 bug 的风险,而且缺乏长期支持。
TTL 控制器提供了一种 TTL 机制来限制已完成执行的资源对象的生命周期。TTL 控制器目前只处理 Job,可能以后会扩展以处理将完成执行的其他资源,例如 Pod 和自定义资源。
Alpha 免责声明:此功能目前是 alpha 版,并且可以通过 kube-apiserver 和 kube-controller-manager 特性开关 TTLAfterFinished
启用。
TTL 控制器
TTL 控制器现在只支持 Job。集群操作员可以通过指定 Job 的 .spec.ttlSecondsAfterFinished
字段来自动清理已结束的作业(Complete
或 Failed
),如下所示的示例。 TTL 控制器假设资源能在执行完成后的 TTL 秒内被清理,也就是当 TTL 过期后。当 TTL 控制器清理资源时,它将做级联删除操作,如删除资源对象的同时也删除其依赖对象。注意,当资源被删除时,由该资源的生命周期保证其终结器(finalizers)等被执行。
可以随时设置 TTL 秒。以下是设置 Job 的 .spec.ttlSecondsAfterFinished
字段的一些示例:
- 在资源清单(manifest)中指定此字段,以便 Job 在完成后的某个时间被自动清除。
- 将此字段设置为存在的、已完成的资源,以采用此新功能。
- 在创建资源时使用 mutating admission webhook 动态设置该字段。集群管理员可以使用它对完成的资源强制执行 TTL 策略。
- 使用 mutating admission webhook 在资源完成后动态设置该字段,并根据资源状态、标签等选择不同的 TTL 值。
警告
更新 TTL 秒
请注意,在创建资源或已经执行结束后,仍可以修改其 TTL 周期,例如 Job 的 .spec.ttlSecondsAfterFinished
字段。但是,一旦 Job 变为可被删除状态(当其 TTL 已过期时),即使您通过 API 扩展其 TTL 时长得到了成功的响应,系统也不保证 Job 将被保留。
时间偏差
由于 TTL 控制器使用存储在 Kubernetes 资源中的时间戳来确定 TTL 是否已过期,因此该功能对集群中的时间偏差很敏感,这可能导致 TTL 控制器在错误的时间清理资源对象。
在 Kubernetes 中,需要在所有节点上运行 NTP(参见 #6159)以避免时间偏差。时钟并不总是如此正确,但差异应该很小。设置非零 TTL 时请注意避免这种风险。