はじめまして。CTO室のT.N.です
HashiConf2015で発表されたHashiCorpの新プロダクトOttoとNomad
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のサイトには上記のようにかかれています
つまり
- 複数マシンに対してMW/SW/アプリケーションをデプロイ
- 1でデプロイしたアプリケーションの実行をスケジューリングする
ということができると考えられます
他のソフトウェアの比較でYARN, Terraform, Mesosなどがあがっていますが、これらのソフトウェアと似た機能を保有していると考えるのが一番近いかと思います
どうやってつかうの?
これについてはまずGetting Startedを見るのをオススメします
今回はこの3ページ目のnomad initで作成されるexample.nomadが何を記述しているかを簡単に解説します
example.nomadの解説
Getting Startedに従い、nomad initコマンドを実施すると、以下のファイルが作成されます(コメント除去済み)
今回はこのうち主要と思われる項目を解説していきます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
job "example" { datacenters = ["dc1"] constraint { attribute = "$attr.kernel.name" value = "linux" } update { stagger = "10s" max_parallel = 1 } group "cache" { task "redis" { driver = "docker" config { image = "redis:latest" } resources { cpu = 500 # 500 Mhz memory = 256 # 256MB network { mbits = 10 dynamic_ports = ["6379"] } } } } } |
constraint
1 2 3 4 |
constraint { attribute = "$attr.kernel.name" value = "linux" } |
- attribute: 制約を加えたい項目名を記述
- value:項目に設定する値を記述
ここでは「OSがLinuxである場合のみ実行する」という制約が加えられます
ですのでWindowsで実行したい場合には”windows”, Macで実行したい場合は”darwin”と変更しなければいけません
attributeの候補値はドキュメントにあります
↓は頻繁に使えそうなAttributeですね
Attribute | 用途 |
---|---|
hostname | 特定ホストを指定して実行する |
platform.aws.ami-id | AWSのAMI-IDを指定して実行する |
update
1 2 3 4 |
update { stagger = "10s" max_parallel = 1 } |
- 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
1 2 3 4 5 |
driver = "docker" config { image = "redis:latest" } |
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
1 2 3 4 5 6 7 |
resources { cpu = 500 # 500 Mhz memory = 256 # 256MB network { mbits = 10 dynamic_ports = ["6379"] } |
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の概要を一通り説明しました
とはいえまだ私もドキュメントベースの理解が主のため、これを元に具体的なアプリケーションを動かす定義を作成し、機会があればご紹介したいと思います