任务

关于任务

与应用(长时间运行的进程)相比,任务运行的时间有限,然后会停止。任务基于父级应用上的配置在自己的容器中运行,并且可配置为使用有限的资源(例如 CPU/内存/临时磁盘存储空间)。

任务用例

  • 迁移数据库
  • 运行批量作业(计划/未安排)
  • 发送电子邮件
  • 转换数据 (ETL)
  • 处理数据(上传/备份/下载)

任务的工作原理

任务异步执行,独立于父应用或运行于同一应用的其他任务运行。为运行任务创建的应用没有创建或分配路由,并且会跳过运行生命周期。源代码上传构建生命周期仍然会继续,并在推送应用后生成用于运行任务的容器映像(请参阅部署应用中的“应用生命周期”)。

任务的生命周期如下所示:

  1. 使用 kf push APP_NAME --task 命令推送用于运行任务的应用。
  2. 您可以使用 kf run-task APP_NAME 命令在应用上运行任务。任务会继承绑定到应用的环境变量、服务绑定、资源分配、启动命令和安全组。
  3. Kf 使用来自应用的值和 run-task 命令的参数创建 Tekton PipelineRun
  4. Tekton PipelineRun 创建一个 Kubernetes Pod,其会根据应用和任务上的配置启动容器。
  5. 任务执行停止(任务退出或手动终止),底层 Pod 已停止或终止。系统会保留已停止任务的 Pod,因此可通过 kf logs APP_NAME --task 命令访问任务日志。
  6. 如果您在任务停止之前终止该任务,则 Tekton PipelineRun 将被取消(请参阅取消 PipelineRun),底层 Pod 将随日志一起删除。如果已配置集群级层日志记录流(例如 Stackdriver、Fluentd),则系统会将已终止任务的日志传递至这些记录流。
  7. 如果应用上运行的任务数量大于 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 的这一功能。