Provide dependencies to between Nomad tasks with lifecycle stanza

Nomad のタスク間に依存関係を持たせるには何らかの工夫が必要でした。

が、 v0.11 beta で依存関係を持たせることのできる機能が追加されました! 🎉

Key highlights of this release:

・Container Storage Interface (CSI): Deploy stateful applications on Nomad using storage volumes from any third-party provider of choice. Read more here.
・Autoscaling: Dynamically scale application instances based on real-time load or business SLAs without manual intervention. Read more here.
・Task Dependencies: Define and run interdependent workloads in sequence.
・Remote Exec (UI): Directly execute commands in a running allocation through the Nomad UI. Read more here.
・Audit Logging (Enterprise): Provide administrators with a complete set of records for all user-issued actions in Nomad. Read more here.

タスク間に依存関係を持たせる

新しく追加された lifecycle スタンザによって可能になります。lifecycle スタンザは task スタンザ内で定義できます。

lifecycle スタンザでは現在以下のパラメーターがあります。

  • hook: グループのライフサイクル内でタスクを実行するタイミングを指定します。現在指定できるタイプは prestart のみ。prestart フックが有効なタスクは lifecycle スタンザの無いタスクよりも前に実行されます。ので、バッチジョブなど何らかの前処理が必要なタスクで役に立ちます。
  • sidecar: タスクがタスクグループ内で短命または長命かどうかを制御します。通常タスクは処理が正常に完了した場合再実行されません。しかし、sidecar を有効にした場合は処理が正常に完了した場合でもタスクグループが割り当てられていて実行されている限り再起動され続けます。使い所としてはサービスジョブと組み合わせてログの送信を行うタスクをサイドカーとして実行するとか。

以下はバッチジョブの例です。ファイルをダウンロード後にそのファイルに対して file コマンドを実行します。

job "lifecycle" {
  datacenters = ["vagrant"]
  type = "batch"

  group "example" {

    task "init" {
      lifecycle {
        hook    = "prestart"
      }
      driver = "exec"
      config {
        command = "curl"
        args    = [
          "https://releases.hashicorp.com/nomad/0.11.0-beta2/nomad_0.11.0-beta2_linux_amd64.zip",
          "-o", "${NOMAD_ALLOC_DIR}/nomad_0.11.0-beta2_linux_amd64.zip"
        ]
      }
    }

    task "main" {
      driver = "exec"
      config {
        command = "file"
        args    = ["${NOMAD_ALLOC_DIR}/nomad_0.11.0-beta2_linux_amd64.zip"]
      }
    }
  }
}

以下の通り、ファイルをダウンロードする init タスクが終わってから main タスクが実行されるため、ファイルが見つからないエラーとならずにコマンドが成功しています。

$ nomad alloc logs -verbose 6e34a0a3 main
/alloc/nomad_0.11.0-beta2_linux_amd64.zip: Zip archive data, at least v2.0 to extract

lifecycle スタンザを設定しない場合、init タスクと main タスクが同時に実行されるため、以下の通り No such file or directory となってしまいます。

$ nomad alloc logs -verbose 52641f1e main
/alloc/nomad_0.11.0-beta2_linux_amd64.zip: cannot open (No such file or directory)

感想

lifecycle スタンザは Nomad ユーザーの待ち望んでいた機能では無いでしょうか!
今証明書の取得や更新を Nomad のバッチジョブで行う方法を模索しているところなので、とてもありがたい。

他に Nomad でステートフルなアプリケーションをデプロイ可能になる csi_plugin スタンザもかなり気になっており、試しているのですが、メモリ 1 GB の環境ではリソース不足になってしまうことがわかったのでサーバーのスケールアップをすべきか悩んでいます… (料金が倍になるので辛い)。