创建作业

使用 UI、CLI 或 API 创建和管理作业

您可以通过以下任何方式创建和管理 DC/OS® 群集的作业:

  • 使用 DC/OS UI 交互式
  • 使用 DC/OS CLI 交互式或编程式
  • 直接通过调用用于作业相关操作的 DC/OS 应用程序编程接口 (API)

DC/OS UI 仅提供通过 dcos job CLI 和作业 API 提供的作业相关功能子集的访问权限。对于更多高级作业配置和活动,请使用 CLI dcos job 命令或 作业 API

DC/OS 应用程序编程接口 (API) 提供可通过 DC/OS UI 和 CLI 访问的基础功能。在大多数情况下,只有将其与自定义程序或自动化脚本集成时,才能直接使用 API。

使用 DC/OS UI 管理作业

您可以通过 DC/OS UI 交互式地管理最常见的作业相关活动。例如,您可以直接从 UI 中的 作业 选项卡添加、修改、运行和移除作业。

Jobs

图 1 -“作业”选项卡和作业列表

分画面屏幕

请注意,在所有 作业 UI 配置屏幕中,您可以选择单独查看 UI,或在 UI 和 JSON 编辑器 窗口之间分割屏幕。在对 作业 配置选项的以下讨论中,我们将向您介绍分画面屏幕,以便您能看到它们如何共同工作的,但您也可以始终选择自己使用 UI。要调用 JSON 编辑器,请单击 提交 按钮旁边的 JSON 编辑器 切换开关。

对任一界面作出的编辑都会立即反映在另一个界面中。例如,如果您在左侧 UI 的任何字段中输入一个值,它将被添加到右侧窗口的 JSON 文件中。

要消除 JSON 编辑器 屏幕,请再次单击切换按钮。

分画面屏幕

图 2 - 分画面屏幕

添加作业

在 DC/OS UI 中创建作业的方法有两种。

  • 如果未配置任何作业,“作业”屏幕将包含一个指出您没有活动作业的通知,并显示 创建作业按钮。

无活动作业

图 3 -“创建作业”按钮

  • 无论您是否有活动的作业,您始终都可以单击右上角的 + 标志来创建新的作业。

加号

图 4 - 点击加号

将显示新作业的配置屏幕。请注意,此屏幕与用于编辑作业的屏幕相同。

作业配置屏幕

图 5 -“作业配置”屏幕

配置作业

您将在屏幕的左侧看到 8 个选项卡。这些可帮助您命名、配置和管理作业:

名称 说明
General 设置最基本的作业设置,如作业标识符、CPU、内存和磁盘要求。
Container Runtime 指定作业运行是否使用通用容器运行时或 Docker® 引擎。
Schedule 为您的作业设置计划。您可以使用 cron 格式。
Environment 指定要附加到每个作业实例的环境变量。
Volumes 通过设置持久卷来配置有状态的作业。
Placement 指定分域和分区中代理节点的放置以获得高可用性,或者将能力扩展到新分域。
Run Configuration 作业的高级设置。
Secrets 设置一个密钥存储库,以保护私钥、API 令牌等重要值。

有关每个配置屏幕参数和值的详细信息,请参阅 作业 文档。

General 常规

选择 常规,以编辑最基本的作业设置,如作业标识符、CPU、内存和磁盘要求。

Jobs

图 6 - 常规配置选项卡

此选项卡的参数和允许的值可在 UI 的 作业文档中找到。

容器运行时

选择 容器运行时,指定是否使用通用容器运行时或 Docker 引擎运行新作业的容器。我们支持 通用容器运行时 (UCR)Docker 引擎

UCR

通用容器运行时 使用本机 Mesos 引擎,并支持 GPU 资源。这是建议的选择。

Jobs

图 7 - 作业 > 容器运行时 选项卡

Docker 引擎

Docker 引擎是 Docker 的容器运行时。它需要镜像,且不支持 GPU 资源。

Jobs

图 8 - 作业 > 容器运行时 > Docker 引擎 选项卡

此选项卡的参数和允许的值可在 UI 的 作业文档中找到。

密钥

选择 DC/OS 密钥存储库,以保护私钥、API 令牌和数据库密码等重要值。

Secrets

图 14 - 密钥选项卡

此选项卡的参数和允许的值可在 UI 的 作业文档中找到。

网络

注意: 以下程序需要 2.0.4 或更高版本的 DC/OS。

可以使用 JSON 选项卡指定网络连接信息。请参见以下示例,了解如何为作业定义网络:

```json
{
  "id": "networking-job",
  "description": "A job that outputs network info and sleeps",
  "run": {
    "cmd": "ip a; sleep 60",
    "docker": {
      "image": "alpine"
    },
    "networks": [{"mode": "container", "name": "dcos"}],
    "cpus": 0.01,
    "mem": 32,
    "disk": 0
  }
}
```

网络字段的工作方式与 Marathon 中的字段相同,并支持以下参数。

  • 模式 - 网络模式。有效值为 containercontainer/bridgehost。默认值为 host. 将 container/bridge 用于作业几乎没有价值,但仍受支持。
  • 名称 - 要加入的容器网络的名称。通过 hostcontainer/bridge 模式指定该字段是错误的。
  • 标签 - 要传递到网络连接插件的键值字符串自变量。通过 host 模式指定该字段是错误的。

作业不支持端口映射。

提交

  1. 单击 提交 以创建作业。

  2. 通过单击 作业,验证您是否已添加新作业。

    作业列表

    图 15. 作业列表

向作业组添加作业

您可以将作业添加到现有的作业组,或在创建作业时创建新的作业组。在作业 ID 中使用句点可将作业嵌套在一个组中。例如,如果您使用作业 ID marketing.myjob 来添加作业,可在 myjob 作业组中创建新的 marketing 在 DC/OS Enterprise 中,您可以使用作业组实现细粒度用户访问。

如需更多关于通过作业组控制作业访问权限的信息,请参阅 授予对作业的访问权限.

查看、修改或删除特定作业

您可以查看和修改与作业相关的信息,包括通过 DC/OS UI 交互式运行历史和配置设置的详细信息。从 作业 选项卡,单击作业名称。然后您可以使用右上角的菜单编辑、运行、禁用或删除选定的作业。

查看和修改作业详细信息

图 16. 查看和修改作业详细信息

当作业正在运行时,您可以单击作业实例深入查看 详细信息文件日志 数据。

您可以看到 编辑作业 屏幕包含与 新作业 屏幕相同的配置选项卡:

Jobs

图 17 - 编辑作业屏幕上的一般配置选项卡

使用 DC/OS CLI 管理作业

您可以使用 dcos job 命令从 DC/OS CLI 中创建和管理作业。若要查看带有使用信息的可用命令的完整列表,请运行 dcos job --help 或查阅 CLI 文档

为新作业创建 JSON 文件

  1. 在文本编辑器中打开一个新文件,以 JSON 格式创建一个作业文件。

  2. 在新文件中,指定定义作业所需的基本参数,包括以下内容:

    • 用于管理该作业的作业 id
    • 要运行的特定命令
    • CPU、内存和磁盘要求
    • 作业计划

    例如,新作业的 JSON 文件可能与此类似:

    {
        "id": "myjob",
        "description": "A job that sleeps regularly",
        "run": {
            "cmd": "sleep 20000",
            "cpus": 0.01,
            "mem": 32,
            "disk": 0
        },
        "schedules": [
            {
                "id": "sleep-schedule",
                "enabled": true,
                "cron": "20 0 * * *",
                "concurrencyPolicy": "ALLOW"
            }
        ]
    }
    
  3. 使用易于识别的文件名保存新作业的 JSON 文件。例如,您可以将作业信息保存为 mysleepjob.json.

  4. 通过运行类似于以下内容的命令来添加作业:

    dcos job add <myjob>.json
    

    例如:

    dcos job add mysleepjob.json
    
  5. 通过运行类似于以下内容的命令来验证是否已添加新作业:

    dcos job list
    

    命令显示类似于以下内容的作业列表:

        ID       STATUS    LAST RUN  
    mysleepjob  Scheduled  N/A       
    mypingjob   Running    N/A       
    

为已计划作业的并发策略

如果使用计划来启动某个作业,则可以定义该作业的并发策略。并发策略确定当已经有作业实例在运行时是否触发新的作业运行实例。

例如,假设您有一个计划于每天凌晨 3:00 启动的作业,并且您已将该作业的并发策略设置为 FORBID。如果该作业的实例已经在凌晨 3:00 点运行,无论是因为之前触发的作业运行仍处于活动状态,还是已经在计划外手动触发,计划启动时间将不会触发新作业运行。如果在下一个计划启动时间没有作业在运行,新的作业实例将按计划启动并运行。

如果希望允许在运行同一作业的其他实例时触发计划的作业,您可以将 concurrencyPolicy 设置为 ALLOW。

注意:concurrencyPolicy 设置为“FORBID”不会阻止您手动启动新的工作实例 - 例如,通过 API - 即使一个实例已经在运行。它仅阻止计划启动新的作业实例。

MaxLaunchDelay

maxLaunchDelay 是已弃用配置选项,不再使用。

重新启动策略

默认情况下,metronome 仅尝试一次启动一个作业实例 — 默认重新启动策略为“从不”。其替代方法是将重新启动策略设置为 ON_FAILURE,这将配置 metronome 以重新启动任务,直到其成功完成或 activeDeadlineSeconds 已达到。

如果未定义 activeDeadlineSeconds,metronome 尝试无限期重新启动任务,如果任务从不成功完成,这可能导致问题 — 建议始终设置 activeDeadlineSeconds.

{
  ...
  "run" : {
    "cpus" : 0.01,
    "mem" : 32,
    "disk" : 0,
    "cmd" : "sleep 60",
    "restart" : {
      "policy" : "ON_FAILURE",
      "activeDeadlineSeconds" : 30
    }
  },
  ...
}

TaskKillGracePeriod

taskKillGracePeriodSeconds 可用于定义在停止时发送给任务的 SIGTERM 和 SIGKILL 之间的时间。请参阅有关 taskKillGracePeriodSeconds Marathon 文档,了解更多信息

{
  ...
  "run" : {
    "cpus" : 0.01,
    "mem" : 32,
    "disk" : 0,
    "cmd" : "sleep 60",
    "taskKillGracePeriodSeconds" : 30
  },
  ...
}

创建计划专用 JSON 文件

如果您在该作业的 JSON 文件中指定了作业计划,则只能为要运行的作业分配一个计划。

但是,如果希望对多项作业使用相同的计划,则可以专门为计划创建单独的 JSON 文件。然后可以使用 dcos job schedule add <job-id> <schedule-file> 命令将作业与计划关联。

  1. 必要时,在文本编辑器中打开一个新文件,以 JSON 格式 创建新作业 文件。

    您必须使用您为该作业定义的作业 id 将计划 JSON 文件与作业关联。如果希望使用计划专用 JSON 文件来控制作业运行时间,为防止计划冲突或意外的作业运行,不应为作业定义计划参数。

  2. 在文本编辑器中打开一个新文件,以 JSON 格式创建希望使用的计划。

    例如,新计划的 JSON 文件可能与此类似:

    {
        "concurrencyPolicy": "ALLOW",
        "cron": "20 0 * * *",
        "enabled": true,
        "id": "nightly",
        "nextRunAt": "2016-07-26T00:20:00.000+0000",
        "startingDeadlineSeconds": 900,
        "timezone": "UTC"
    }
    
  3. 使用易于识别的文件名保存新计划的 JSON 文件。例如,您可以将计划信息保存为 my-cron-def.json.

  4. 通过运行类似于以下内容的命令将作业与计划关联:

    dcos job schedule add <job-id> <schedule-file>
    

    例如:

    dcos job schedule add mytestjob my-cron-def.json
    

    如果尝试将计划定义添加到已定义了计划的作业中,命令显示类似于以下内容的错误:

    Error: 409 - requirement failed: A schedule with id nightly already exists
    
  5. 通过运行类似于以下内容的命令来验证是否已添加新作业计划:

    dcos job schedule show mytestjob
    

    此命令显示指定作业的计划信息,类似于以下内容:

    ID        CRON     ENABLED            NEXT RUN            CONCURRENCY POLICY  
    nightly  20 0 * * *  True     2019-04-11T00:20:00.000+0000  ALLOW
    

从命令行启动作业

您可以触发要运行的作业:

  • 按需手动
  • 根据您定义的计划自动进行
  • 在有或无计划的情况下通过自动化按编程方式进行

您可以使用这些方法中的任何一种来启动被称为作业运行的作业实例。例如,您可以使用 DC/OS CLI 来启动作业,无论您是否定义了计划。从命令行手动启动作业类似于使用 DC/OS UI 通过单击 立即运行 来启动作业。

若要在任何计划的作业活动之外按需启动作业运行,请运行类似以下内容的命令:

dcos job run <job-id>

例如,如果作业 ID 为 mytestjob,则运行:

dcos job run mytestjob

每次执行命令时,从命令行或通过 DC/OS UI 手动启动作业会触发新作业运行。按需手动触发的作业会忽略并发策略设置。

但是,如果计划用于启动作业,则作业的并发策略会确定是否触发新的作业运行实例。能够控制作业是否同时运行是手动或使用计划触发作业运行之间的主要差异之一。

从命令行移除作业

只要作业没有任何活动的作业实例在运行,您就可以使用命令行程序 dcos job remove <job-id>移除作业。如果作业有任何当前正在运行的实例,则必须停止所有当前活动的作业。停止所有正在运行的作业实例后,可以使用 dcos job remove <job-id> 命令移除该作业。

若要移除作业:

  1. 通过运行类似以下内容的命令检查活动作业的状态:

    dcos job list
    
  2. 通过运行以下命令,停止要删除作业的所有正在运行的作业实例并移除该作业:

    dcos job remove <job-id> --stop-current-job-runs
    
  3. 通过运行以下命令,验证是否已移除指定的作业:

    dcos job list
    

从命令行修改作业

若要修改作业,请更新 JSON 作业文件,然后运行命令:

dcos job update <job-file>.json

修改作业的计划

您可以通过两种方式更新作业计划,具体取决于您的作业是否具有 <job-file>.json 中指定的计划,或者作业的计划是否保存在单独的文件中。

使用计划修改作业

修改 schedules<job-file>.json. 参数。然后运行命令:

dcos job update <job-file>.json

使用单独的计划文件修改作业

修改 <schedule-file>.json. 然后运行以下命令之一:

dcos job schedule add <job-id> <schedule-file>.json
dcos job schedule remove <job-id> <schedule-id>
dcos job schedule update <job-id> <schedule-file>.json

查看作业详细信息

列出所有作业:

dcos job list

列出作业之前所有的运行:

dcos job history <job-id>

若要查看有关作业的详细信息,请运行命令:

dcos job show <job-id>

若要查看有关作业计划的详细信息,请运行命令:

dcos job schedule show <job-id>

查看作业日志

若要查看作业的日志,请运行命令:

dcos task log --completed <job-id>

若要仅获取特定作业的日志,请使用 中的作业运行 IDdcos job history <job-id>

dcos task log --completed <job-run-id>

使用 DC/OS API 管理作业

您可以通过对作业 API 端点的调用来创建和管理作业。本部分重点介绍通过作业相关的 API 调用来执行的最常见任务。关于作业 API 的更多完整信息,请参阅 作业 API 参考 信息。

准备使用 API 调用

本部分中的代码示例说明如何包括作业 API 调用来使用客户端 URL (cURL) 程序执行与作业相关的任务。有关使用 curl 命令的详细信息,请参阅 curl 手册页.

此外,使用 DC/OS CLI 或 UI 和 API 之间的一个重要区别是如何配置作业计划。DC/OS CLI 和 UI 支持组合 JSON 格式,允许您在作业描述符中指定一个计划。若要使用 Jobs API 计划一个作业,您必须使用两个单独的调用:

  • 使用一个调用来添加 未计划 作业。
  • 使用另一个调用将特定 计划文件 (schedule-file.json) 与作业关联。

使用 API 调用添加作业

以下命令将添加名为 的作业。myjob.json.

curl -X POST -H "Content-Type: application/json" -H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/service/metronome/v1/jobs -d@/Users/<your-username>/<myjob>.json

使用 API 调用移除作业

无论作业是否运行,以下命令将删除作业:

curl -X DELETE -H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/service/metronome/v1/jobs/<myjob>?stopCurrentJobRuns=true

若要只在作业未运行时删除作业,请将 stopCurrentJobRuns 设置为 False.

使用 API 调用修改或查看作业

以下命令显示所有作业:

curl -H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/service/metronome/v1/jobs

以下命令列出作业运行:

curl -H "Authorization: token=$(dcos config show core.dcos_acs_token)" "$(dcos config show core.dcos_url)/service/metronome/v1/jobs/<myjob>/runs/"

使用以下命令停止运行:

curl -X POST -H "Authorization: token=$(dcos config show core.dcos_acs_token)" "$(dcos config show core.dcos_url)/service/metronome/v1/jobs/<myjob>/runs/20160725212507ghwfZ/actions/stop"

为作业添加计划

以下命令为作业添加计划:

curl -X POST -H "Content-Type: application/json" -H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/service/metronome/v1/jobs/<job-id>/schedules -d@<schedule-file>.json

使用 API 调用启动作业

您可以使用 DC/OS API 以编程方式启动作业。类似于使用 UI 或 CLI 来启动作业,您必须在调用中指定作业标识符。

若要触发作业运行启动,可以使用类似于以下内容的 REST API 调用:

curl -X POST -H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/service/metronome/v1/jobs/{jobId}/runs