关于任务
与应用(长时间运行的进程)相比,任务运行的时间有限,然后会停止。任务基于父级应用上的配置在自己的容器中运行,并且可配置为使用有限的资源(例如 CPU/内存/临时磁盘存储空间)。
任务用例
- 迁移数据库
- 运行批量作业(计划/未安排)
- 发送电子邮件
- 转换数据 (ETL)
- 处理数据(上传/备份/下载)
任务的工作原理
任务异步执行,独立于父应用或运行于同一应用的其他任务运行。为运行任务创建的应用没有创建或分配路由,并且会跳过运行生命周期。源代码上传和构建生命周期仍然会继续,并在推送应用后生成用于运行任务的容器映像(请参阅部署应用中的“应用生命周期”)。
任务的生命周期如下所示:
- 使用
kf push APP_NAME --task
命令推送用于运行任务的应用。 - 您可以使用
kf run-task APP_NAME
命令在应用上运行任务。任务会继承绑定到应用的环境变量、服务绑定、资源分配、启动命令和安全组。 - Kf 使用来自应用的值和
run-task
命令的参数创建 Tekton PipelineRun。 - Tekton PipelineRun 创建一个 Kubernetes Pod,其会根据应用和任务上的配置启动容器。
- 任务执行停止(任务退出或手动终止),底层 Pod 已停止或终止。系统会保留已停止任务的 Pod,因此可通过
kf logs APP_NAME --task
命令访问任务日志。 - 如果您在任务停止之前终止该任务,则 Tekton PipelineRun 将被取消(请参阅取消 PipelineRun),底层 Pod 将随日志一起删除。如果已配置集群级层日志记录流(例如 Stackdriver、Fluentd),则系统会将已终止任务的日志传递至这些记录流。
- 如果应用上运行的任务数量大于 500 个,则系统会自动删除最旧的任务。
任务保留政策
任务是作为 Kubernetes 集群中的自定义资源创建的,因此,切勿耗尽底层 etcd
数据库的空间。默认情况下,Kf 仅为每个应用保留最新的 500 个任务。当任务数达到 500 时,最早的任务(连同底层 Pod 和日志)将自动删除。
任务日志记录和执行历史记录
通过使用 kf logs APP_NAME --task
命令,任务输出到 STDOUT 或 STDERR 的所有数据或消息均可用。集群级层日志记录机制(例如 Stackdriver、Fluentd)将任务日志发送到配置的日志记录目标位置。
安排任务
如上所述,可以使用 kf run-task APP_NAME
命令异步运行任务。或者,如需安排任务执行,您可以先使用 kf create-job
命令创建一个作业,然后使用 kf schedule-job JOB_NAME
命令对该作业进行安排。您可以安排该作业按指定的 unix-cron 时间表自动运行任务。
如何安排任务
创建并安排作业以运行任务。作业描述要执行的任务,并自动管理任务创建。
即使先前执行的任务仍在运行,系统也会按计划创建后续任务。如果有任何任务因任何原因被遗漏,则在系统恢复时仅会执行最后遗漏的任务。
删除作业会删除所有关联的任务。如果有任何关联的任务仍在进行中,则系统会将其强制删除,而不会等待其运行完成。
计划作业创建的任务仍受任务保留政策的约束。
与 PCF Scheduler 的差异
PCF Scheduler 允许单个作业运行多个时间表,而 Kf 仅支持每个作业运行一个时间表。您可以通过创建多个作业(每个作业一个时间表)来实现 PCF Scheduler 的这一功能。