Hashicorp新プロダクトnomadのexample.nomadを読み解いてみた

nomad

はじめまして。CTO室のT.N.です

HashiConf2015で発表されたHashiCorpの新プロダクトOttoNomad
OttoについてはVagrantの後継ツール(というわけではないんですが)という触れ込みもあり日本語の話題も増えています
しかしNomadについてはなかなか情報もないので、まず一番最初に触れるであろうexample.nomadをドキュメントベースで読み解いたので、記載したいと思います

Nomadとは?

Nomad is a tool for managing a cluster of machines and running applications on them.

Introduction – Nomad by HashiCorp
https://nomadproject.io/intro/index.html

HashiCorpのサイトには上記のようにかかれています

つまり

  1. 複数マシンに対してMW/SW/アプリケーションをデプロイ
  2. 1でデプロイしたアプリケーションの実行をスケジューリングする

ということができると考えられます

他のソフトウェアの比較でYARN, Terraform, Mesosなどがあがっていますが、これらのソフトウェアと似た機能を保有していると考えるのが一番近いかと思います

どうやってつかうの?

これについてはまずGetting Startedを見るのをオススメします

今回はこの3ページ目のnomad initで作成されるexample.nomadが何を記述しているかを簡単に解説します

example.nomadの解説

Getting Startedに従い、nomad initコマンドを実施すると、以下のファイルが作成されます(コメント除去済み)
今回はこのうち主要と思われる項目を解説していきます

constraint

  • attribute: 制約を加えたい項目名を記述
  • value:項目に設定する値を記述

ここでは「OSがLinuxである場合のみ実行する」という制約が加えられます
ですのでWindowsで実行したい場合には”windows”, Macで実行したい場合は”darwin”と変更しなければいけません

attributeの候補値はドキュメントにあります
↓は頻繁に使えそうなAttributeですね

Attribute 用途
hostname 特定ホストを指定して実行する
platform.aws.ami-id AWSのAMI-IDを指定して実行する

update

  • stagger: Rolling Updateする際に、それぞれのUpdateの間隔となる時間
  • max_parallel:一度にRolling Updateできる数
    ※両方を0にするとUpdateが無効化されます

そもそもupdateとは?という疑問がありますが、これについてはGetting Started内で以下のような記述があります

Our example job is configured to do a rolling update via the stagger attribute, doing a single update every 10 seconds.

Jobs – Nomad by HashiCorp
https://www.nomadproject.io/intro/getting-started/jobs.html

つまり、nomadファイルを修正し、再度Runした場合には、この定義に従い既存のJobがUpdateされることだと考えられます

driver

driverではTask内で実行する作業を指定します

driver 内容
docker docker Containerを作成。コンテナ内でのコマンド実行やPort割当も同時に実行できる
java jarファイルを取得し、実行する
Fork/Exec コマンドの実行
Qemu qemuイメージを使いVirtual Machine環境を作成する
Custom ※現時点ではPluggableな拡張はできないが将来的に使用可能になる予定

参考: https://nomadproject.io/docs/drivers/index.html

ここではdriverがdocker、imageがredis:latestとなっていることから、redisのdockerイメージを立ち上げるという事がわかります

resrouces

resourceについてはドキュメントに以下のようにあります

Note: Typically any agent running in client mode must be run with root level privilege. Nomad makes use of operating system primitives for resource isolation which require elevated permissions. The agent will function as non-root, but certain task drivers will not be available.

Running Nomad – Nomad by HashiCorp
https://nomadproject.io/intro/getting-started/running.html

要約すると「Nomadは必要とするリソースを分離・独立させるのでroot権限で実行すること」といった感じでしょうか
つまりこのresourcesでは、「必要とするリソース」を定義しているということになりそうです

redis dockerを実行するためにCPU 500M/memory 256MB…確保し、独立させるということが定義されていると考えられます

以上でexample.nomadの概要を一通り説明しました
とはいえまだ私もドキュメントベースの理解が主のため、これを元に具体的なアプリケーションを動かす定義を作成し、機会があればご紹介したいと思います