Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Introduction to Nomad
@zembutsu a.k.a Masahito Zembutsu
2015 12 8 ( )
2
ノ マ ド
2
12/8(火)開催のクラウド研究会
での発表資料になります。
3
‣ Nomad はスケジューラ
• Docker、rkt、Java、Qemu、やコマンドの分散実行に対応
• HashiCorpが開発・オープンソースとして公開中
‣ スケジューリング方式
• Nomad の用語とスケジューラとは?
– 「...
基本的に新ネタ(のはず)です。
今日は「Nomad」です。これは
NORAD(ノーラッド)ですね…
毎年サンタさん追跡してるサイト
です。これではありません。
http://www.noradsanta.org/
Nomad
■□□
NomadはHashiCorp社が開発し
オープンソースとして公開されて
いるツールです。
目標
登山のように、目標を定め、
一番良い道を決めます。
そこに至る道具が、無けれ
ば自分たちで作る。
そういうスタイルです。
目標
戦略
手法
大丈夫だ
問題ない!
「そんな装備で大丈夫か?」
・Microservices
Architecture
・DevOps
・Docker
・HashiCorp
https://nomadproject.io/
そのような考えの流れでNomad
も作り出されました。Nomadは
一体何を解決するのでしょうか。
Docker API
Swarm
Manager
ディスカバリ・バックエンド
リソース・プール
スケジューラ
fleet
Nomadの活躍例は、このような
Docker環境における、コンテナ
のスケジューリングです。他の手
法はコンテナしか扱え...
Nomad
分散スケジューラ
Distributed Scheduler
デプロイを簡単に
Easily Deploy Applications
ジョブの詳細設計
Job Specification
コンテナ化
Containerized
仮想化
Virtualized
スタンドアローン
Standalone
Docker, Rkt (experimental 0.2.0+)
Qemu, KVM
Java Jar
バイナリの実行
Nomad...
Nomad
アプリのデプロイ
Application Deployment
Dockerコンテナ対応
Docker
柔軟なワークロード
Flexible Workloads
リソースを最大限に集約
Bin Packing
HCLによるジョブ定義...
# There can only be a single job definition per file.
# Create a job with ID and Name 'example'
job "example" {
# Run the ...
zem@dev:~$ nomad run example.nomad
==> Monitoring evaluation "88fc77ac-d878-b27f-925c-c0e131658ac6"
Evaluation triggered b...
19
‣ マイクロサービスのプラットフォーム
MicroservicesやSOAはアプリケーションの設計が複雑化しているが、その基盤としてNomadを使う
‣ パブリック・クラウドへのデプロイ
マルチリージョン&マルチデータセンタ機能により、複...
20
‣ スケジューラの役割
• ジョブのスケジューリング
• タスク失敗時の処理
サービス・ディスカバリ機能
ヘルスチェック機能
‣ タスクとして個々に定義
• 柔軟性
サービス・ディスカバリ機能との統合
Nomad 0.2.0+
count...
Architecture
■■□
23
Nomad用語
‣ Nomadサーバ
• 全てのジョブとクライアントを管理
– 評価(エバリュエーション)
– タスク割り当て(アロケーション)
‣ Nomadクライアント
• タスクを実行可能なサーバのこと
• クライアント上で nom...
nomad エージェント
Nomadサーバ
nomad
クライアント
nomad
クライアント
nomad
クライアント
$ nomad run xxx.nomad 「nomad」クライアントはNomad
サーバに通信し、Nomadクライ
アン...
25
Nomad用語
‣ ジョブ(job)
• 望ましい状態をジョブとして定義する
– 何を動かすか
– どこで実行すべきでないか、等
• ジョブの構成要素
– タスク・グループ
– リソース
– 制約 ( Constraint )
Nomad...
26
‣ タスク(task)
• Nomadの最小処理単位
‣ タスク・グループ(task group)
• 同時に実行するタスクのセット(ユニット)
– 例:webサーバとログ保存を同時に行う
‣ ドライバ(driver)
• タスクの実行手...
27
‣ 評価(evaluation)
• Nomadがスケジューリングを行う仕組み
• 望ましい状態(ジョブ)と現実に差違があれば、新しい評価を実施
‣ 割り当て(allocation)
• 実行されていないジョブを、nomadノードに割り当...
28
‣ Bin Packing(ビンパッキング)
• Nomadが自動的に処理(実際にはスコア付けや制約も考慮)
• リソースを効率的に使い切るため
ジョブ
タスク
タスク
Binとは「箱」です。パックは「箱
詰め」です。つまり、めいっぱい
...
サーバ
(リーダー)
サーバ
(フォロワー)
サーバ
(フォロワー)
クライアント クライアント クライアント
RPC RPC RPC
レプリケーション レプリケーション
転送 転送
役割を概念図にしたのがこちら。割り当て(allocation...
Scheduling
■■■
31
Nomad用語の確認(再)
‣ ジョブ(job)
• タスクを実行するための宣言
• ユーザが望ましい状態を示す
‣ ノード(node)
• タスクをスケジュール可能なサーバ(群)
‣ 割り当て(allocation)
• ジョブ中のタス...
32
スケジューリングとは
予定が被った…
どっち優先する
かな…
ジョブ
タスクタスク
タスクが来たな。
どれをどこで
処理しようかな。
33
望ましい状態の評価
ジョブ
クライアント
評価
タスク
スケジューリング
タスク
評価
割り当て
タスク Nomadはタスクの割り振り時や、
状況変化時、常に評価します。
34
緊急状態の評価
ジョブ
クライアント
評価
タスク
スケジューリング
タスク
評価
割り当て
タスク 障害発生時も、その時点で評価
が随時行われます。その目的は
ジョブで定義したあるべき状態を
維持するためです。
ジョブ登録
ジョブ更新
ノード障害
評価
評価
評価
評価人
EVALUATION
BROKER
サービス
スケジューラ
バッチ
スケジューラ
システム
スケジューラ
カスタム
スケジューラ
プラン
キュー
Plan Queue
割り当て
割り...
まとめ
37
‣ Nomad はスケジューラ
• Docker、Rkt、Java、Qemu、やコマンドの分散実行に対応
• HashiCorpが開発・オープンソースとして公開中
‣ スケジューリング方式
• Nomad の用語とスケジューラとは?
– ...
38
‣ Nomadの可用性や冗長化で考慮すべき点は?
• Nomad サーバのバックエンドは Consul を使っています。
• Consul と同じ技術(Raftアルゴリズム、リーダ選出)により
データの冗長性を担保しています。
• 設定方...
39
‣ Nomad プロジェクト
http://nomadproject.io
‣ 参考URL
Nomad Internals
https://nomadproject.io/docs/internals/index.html
Nomadにつ...
Upcoming SlideShare
Loading in …5
×

HashiCorpのNomadを使ったコンテナのスケジューリング手法

5,502 views

Published on

クラウド研究会 第2回「クラウドとコンテナー技術」発表資料
http://kokucheese.com/event/index/355047/
日時:2015年12月8日(火)19:00~21:00
会場:マイクロソフト@東京・品川

Published in: Software
  • Be the first to comment

HashiCorpのNomadを使ったコンテナのスケジューリング手法

  1. 1. Introduction to Nomad @zembutsu a.k.a Masahito Zembutsu 2015 12 8 ( ) 2 ノ マ ド
  2. 2. 2 12/8(火)開催のクラウド研究会 での発表資料になります。
  3. 3. 3 ‣ Nomad はスケジューラ • Docker、rkt、Java、Qemu、やコマンドの分散実行に対応 • HashiCorpが開発・オープンソースとして公開中 ‣ スケジューリング方式 • Nomad の用語とスケジューラとは? – 「ジョブ」「ノード」「評価」 「割り当て」 • スケジュールの流れは「あるべき状態」を維持するため – ワーカー起動  ジョブ登録  評価  プラン作成  割り当て 処理 今日のまとめ 現在のバージョン Nomad 0.2 の 状況を整理しました。スケジュー リングには、様々な手法があり ます。Nomad は何をしてくれる のかな?という疑問に対する答 えになればと思っています。
  4. 4. 基本的に新ネタ(のはず)です。
  5. 5. 今日は「Nomad」です。これは NORAD(ノーラッド)ですね… 毎年サンタさん追跡してるサイト です。これではありません。 http://www.noradsanta.org/
  6. 6. Nomad ■□□
  7. 7. NomadはHashiCorp社が開発し オープンソースとして公開されて いるツールです。
  8. 8. 目標 登山のように、目標を定め、 一番良い道を決めます。 そこに至る道具が、無けれ ば自分たちで作る。 そういうスタイルです。
  9. 9. 目標 戦略 手法 大丈夫だ 問題ない! 「そんな装備で大丈夫か?」 ・Microservices Architecture ・DevOps ・Docker ・HashiCorp
  10. 10. https://nomadproject.io/ そのような考えの流れでNomad も作り出されました。Nomadは 一体何を解決するのでしょうか。
  11. 11. Docker API Swarm Manager ディスカバリ・バックエンド リソース・プール スケジューラ fleet Nomadの活躍例は、このような Docker環境における、コンテナ のスケジューリングです。他の手 法はコンテナしか扱えなかったり、 動作環境が制限されたちですが、 Nomadは様々な環境のスケ ジューリングに対応しています。
  12. 12. Nomad 分散スケジューラ Distributed Scheduler デプロイを簡単に Easily Deploy Applications ジョブの詳細設計 Job Specification
  13. 13. コンテナ化 Containerized 仮想化 Virtualized スタンドアローン Standalone Docker, Rkt (experimental 0.2.0+) Qemu, KVM Java Jar バイナリの実行 Nomad対応環境 他のスケジューラと違い、仮想化 や単純なバイナリ実行にも対応 しています。将来的にはcron的 な処理も可能に。
  14. 14. Nomad アプリのデプロイ Application Deployment Dockerコンテナ対応 Docker 柔軟なワークロード Flexible Workloads リソースを最大限に集約 Bin Packing HCLによるジョブ定義 HCL Job Specifications
  15. 15. # There can only be a single job definition per file. # Create a job with ID and Name 'example' job "example" { # Run the job in the global region, which is the default. # region = "global" # Specify the datacenters within the region this job can run in. datacenters = ["dc1"] # Service type jobs optimize for long-lived services. This is # the default but we can change to batch for short-lived tasks. # type = "service" # Priority controls our access to resources and scheduling priority. # This can be 1 to 100, inclusively, and defaults to 50. # priority = 50 # Restrict our job to only linux. We can specify multiple # constraints as needed. constraint { attribute = "$attr.kernel.name" value = "linux" } # Configure the job to do rolling updates update { # Stagger updates every 10 seconds stagger = "10s" # Update a single task at a time max_parallel = 1 } # Create a 'cache' group. Each task in the group will be # scheduled onto the same machine. group "cache" { # Control the number of instances of this groups. # Defaults to 1 # count = 1 # Define a task to run task "redis" { # Use Docker to run the task. driver = "docker" # Configure Docker driver with the image config { image = "redis:latest" } # We must specify the resources required for # this task to ensure it runs on a machine with # enough capacity. resources { cpu = 500 # 500 Mhz memory = 256 # 256MB network { mbits = 10 dynamic_ports = ["6379"] } } } } } zem@dev:~$ nomad init Example job file written to example.nomad このような「.nomad」ファイルで 何を動かすか、リソースはどの 程度使うのか指定します。
  16. 16. zem@dev:~$ nomad run example.nomad ==> Monitoring evaluation "88fc77ac-d878-b27f-925c-c0e131658ac6" Evaluation triggered by job "example" Allocation "1170083d-dd2c-92ec-1e29-44f25eb3de75" created: node "2b4b3259-f143-2abf-46d4-629 05268263e", group "cache" Evaluation status changed: "pending" -> "complete" ==> Evaluation "88fc77ac-d878-b27f-925c-c0e131658ac6" finished with status "complete" 2015/10/08 23:59:57 [DEBUG] driver.docker: docker pull redis:latest succeeded 2015/10/08 23:59:57 [DEBUG] driver.docker: using image 2f2578ff984f013c9a5d6cbb6fe061ed3f73… 2015/10/08 23:59:57 [INFO] driver.docker: identified image redis:latest as 2f2578ff984f013c… 2015/10/08 23:59:57 [DEBUG] driver.docker: using 268435456 bytes memory for redis:latest 2015/10/08 23:59:57 [DEBUG] driver.docker: using 500 cpu shares for redis:latest 2015/10/08 23:59:57 [WARN] driver.docker: no mode specified for networking, defaulting to bridge 2015/10/08 23:59:57 [DEBUG] driver.docker: using bridge as network mode 2015/10/08 23:59:57 [DEBUG] driver.docker: allocated port 128.199.223.107:44054 -> 6379 (mapped) 2015/10/08 23:59:57 [INFO] driver.docker: created container ca2c4efd37e4c5dee82da48fce248e… 2015/10/08 23:59:57 [INFO] driver.docker: started container ca2c4efd37e4c5dee82da48fce248e… zem@dev:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca2c4efd37e4 redis:latest "/entrypoint.sh redis" 49 seconds ago Up 49 seconds 128.199.223.107:44054->6379/tcp desperate_mayer あとは、「nomad」コマンドを通 して、nomadサーバが各々の手 法に従って、ジョブのスケジュー リングを行います。ここでは、 Dockerコンテナのスケジューリン グを行っています。dockerコマン ドを使わずに、nomadを通して Dockerコンテナを起動しました。
  17. 17. 19 ‣ マイクロサービスのプラットフォーム MicroservicesやSOAはアプリケーションの設計が複雑化しているが、その基盤としてNomadを使う ‣ パブリック・クラウドへのデプロイ マルチリージョン&マルチデータセンタ機能により、複数のクラウド環境、物理環境を併用できる ‣ ECサイト 長期間稼働するウェブサービスやバッチ処理のバックエンドにおいて、 あらゆるワークロードをクラスタで共有するので、稼働率の向上やコスト削減につながる 使用例の一部 HashiCorp社は、このような用 途に対応していると発表してます。
  18. 18. 20 ‣ スケジューラの役割 • ジョブのスケジューリング • タスク失敗時の処理 サービス・ディスカバリ機能 ヘルスチェック機能 ‣ タスクとして個々に定義 • 柔軟性 サービス・ディスカバリ機能との統合 Nomad 0.2.0+ count = 5 task "redis" { ... service { # name = "redis" tags = ["global", "cache"] port = "db" check { name = "alive" type = "tcp" interval = "10s" timeout = "2s" } } ... } v0.2からはConsul機能がNomad に一部取り込まれました。
  19. 19. Architecture ■■□
  20. 20. 23 Nomad用語 ‣ Nomadサーバ • 全てのジョブとクライアントを管理 – 評価(エバリュエーション) – タスク割り当て(アロケーション) ‣ Nomadクライアント • タスクを実行可能なサーバのこと • クライアント上で nomad エージェントを実行し、サーバに登録 Nomadの仕組みをみていく前に、 いくつかの用語を整理しましょう。 基本的に、クライアント・サーバ 型のアーキテクチャです。
  21. 21. nomad エージェント Nomadサーバ nomad クライアント nomad クライアント nomad クライアント $ nomad run xxx.nomad 「nomad」クライアントはNomad サーバに通信し、Nomadクライ アントがエージェントして動作す る環境上に命令を出します。
  22. 22. 25 Nomad用語 ‣ ジョブ(job) • 望ましい状態をジョブとして定義する – 何を動かすか – どこで実行すべきでないか、等 • ジョブの構成要素 – タスク・グループ – リソース – 制約 ( Constraint ) Nomadは「あるべき状態」の定義(.nomad)を維持しようとする ジョブ タスク タスク 次に「ジョブ」と呼ばれる単位。 いわゆる仕事リストの位置付け。
  23. 23. 26 ‣ タスク(task) • Nomadの最小処理単位 ‣ タスク・グループ(task group) • 同時に実行するタスクのセット(ユニット) – 例:webサーバとログ保存を同時に行う ‣ ドライバ(driver) • タスクの実行手段 … Docker, Qemu, Java, コマンド実行
  24. 24. 27 ‣ 評価(evaluation) • Nomadがスケジューリングを行う仕組み • 望ましい状態(ジョブ)と現実に差違があれば、新しい評価を実施 ‣ 割り当て(allocation) • 実行されていないジョブを、nomadノードに割り当てること • 割り当てる前に評価が実施される この2つは、Nomadにおけるス ケジューリングの基本概念です。
  25. 25. 28 ‣ Bin Packing(ビンパッキング) • Nomadが自動的に処理(実際にはスコア付けや制約も考慮) • リソースを効率的に使い切るため ジョブ タスク タスク Binとは「箱」です。パックは「箱 詰め」です。つまり、めいっぱい タスクを詰め込もうとします。 実際は,もう少し複雑な処理です。
  26. 26. サーバ (リーダー) サーバ (フォロワー) サーバ (フォロワー) クライアント クライアント クライアント RPC RPC RPC レプリケーション レプリケーション 転送 転送 役割を概念図にしたのがこちら。割り当て(allocation) ジョブ タスク 評価 (evaluation) スケジューリング
  27. 27. Scheduling ■■■
  28. 28. 31 Nomad用語の確認(再) ‣ ジョブ(job) • タスクを実行するための宣言 • ユーザが望ましい状態を示す ‣ ノード(node) • タスクをスケジュール可能なサーバ(群) ‣ 割り当て(allocation) • ジョブ中のタスクが、特定のノード上で動作することを宣言 ‣ 評価(evaluation) • スケジューリングとは、適切に割り当てるためのプロセスであり、この過程で評価 外部の要因(ジョブの変化によって、常に作成される) スケジューリングとは、の前に、 もう一度用語を整理します。
  29. 29. 32 スケジューリングとは 予定が被った… どっち優先する かな… ジョブ タスクタスク タスクが来たな。 どれをどこで 処理しようかな。
  30. 30. 33 望ましい状態の評価 ジョブ クライアント 評価 タスク スケジューリング タスク 評価 割り当て タスク Nomadはタスクの割り振り時や、 状況変化時、常に評価します。
  31. 31. 34 緊急状態の評価 ジョブ クライアント 評価 タスク スケジューリング タスク 評価 割り当て タスク 障害発生時も、その時点で評価 が随時行われます。その目的は ジョブで定義したあるべき状態を 維持するためです。
  32. 32. ジョブ登録 ジョブ更新 ノード障害 評価 評価 評価 評価人 EVALUATION BROKER サービス スケジューラ バッチ スケジューラ システム スケジューラ カスタム スケジューラ プラン キュー Plan Queue 割り当て 割り当て 割り当て 1. フィルタ - health - constraint 2. ランク付け - affinity 常に評価 実際にはもう少し 複雑な処理により タスクを処理します。
  33. 33. まとめ
  34. 34. 37 ‣ Nomad はスケジューラ • Docker、Rkt、Java、Qemu、やコマンドの分散実行に対応 • HashiCorpが開発・オープンソースとして公開中 ‣ スケジューリング方式 • Nomad の用語とスケジューラとは? – 「ジョブ」「ノード」「評価」 「割り当て」 • スケジュールの流れは「あるべき状態」を維持するため – ワーカー起動  ジョブ登録  評価  プラン作成  割り当て 処理 今日のまとめ Nomadのスケジューラの概要を みてきました。単純なコンテナ だけじゃないため汎用性あり、 面白いと思っています。
  35. 35. 38 ‣ Nomadの可用性や冗長化で考慮すべき点は? • Nomad サーバのバックエンドは Consul を使っています。 • Consul と同じ技術(Raftアルゴリズム、リーダ選出)により データの冗長性を担保しています。 • 設定方法は Consul サーバと同様のオプションに なります。 質疑応答
  36. 36. 39 ‣ Nomad プロジェクト http://nomadproject.io ‣ 参考URL Nomad Internals https://nomadproject.io/docs/internals/index.html Nomadについて詳しく

×