Contenu connexe
Similaire à Dockerの利用事例 (20)
Dockerの利用事例
- 4. © 2015 Internet Initiative Japan Inc.
4
IIJ GIOストレージ&アナリシスサービス
• http://www.iij.ad.jp/biz/storage/
• REST API(AWS S3互換)を持つクラ
ウドストレージサービス
• Hadoop/Hiveを用いたデータ解析機能
(オプション)
+
- 5. © 2015 Internet Initiative Japan Inc.
5
サービス全体図
storage
API
ストレージ
ノード
analysis
API
ユーザー
data
query
IIJ GIO ストレージ&アナリシスサービス
計算
ノード
container
data
data
data
- 7. © 2015 Internet Initiative Japan Inc.
7
計算ノード(図)
analysis
API
query
Hive
NN
RM
DN
NM
metastore
task
storage
API
DN
NM
task
ユーザ毎に用意
NN: Name Node
RM: Resouce Manager
DN: Data Node
NM: Node Manager
ノード
ノード
ノード
- 9. © 2015 Internet Initiative Japan Inc.
9
サービス検討時の候補
• Hypervisor型仮想マシンによる隔離
– 隔離という面では一番確実
– 起動が遅い、オーバーヘッドがある
• コンテナによる隔離
• アプリケーションレベルでの隔離
– Hiveだけ(UDF禁止)等、やれることを限
定すれば可能
- 10. © 2015 Internet Initiative Japan Inc.
10
仮想マシン vs コンテナ
Server
Host OS
Hypervisor
Guest OS
Bins/Libs
App A
Guest OS
Bins/Libs
App B
Server
Host OS
Docker Engine
Bins/Libs
App A
Bins/Libs
App B
Hypervisor型仮想マシン Dockerコンテナ
Dockerコンテナは、隔離
された単なるプロセス
ゲスト毎に任意のOS使用可
高い隔離性
オーバヘッドが少ない
起動が速い
こちらを採用
- 11. © 2015 Internet Initiative Japan Inc.
11
実際のサービスの制限
• 現時点では、ユーザが任意の
MapReduceプログラムを動かすこと
はできない
– 使えるのはHiveQLのみ
• Dockerによる隔離は将来への布石
- 16. © 2015 Internet Initiative Japan Inc.
16
doma(docker manager)とは?
• 独自開発
• 多数のDockerコンテナを管理する
– 複数ホストをリソースプールとする
– analysis APIからの要求によりプールか
ら必要数のコンテナを自動確保し起動
• 類似品
– Mesos, Kubernetes, fleet, Swarm, ...
- 17. © 2015 Internet Initiative Japan Inc.
17
doma 構成図
Docker daemon
Container
slave
構成情報DB
(MySQL MHA)
master
request / response
Docker
Remote API
master
API
docker
ホスト群
使用可能ホスト
リソース空き情報
IPアドレス空き情報
etc
LB(nginx)
HTTP
slave
API
HTTP
HTTP
over
Unix domain
socket
analysis
API
- 18. © 2015 Internet Initiative Japan Inc.
18
master
• 多数のコンテナをクラスタ単位で管
理
– クラスタ = コンテナの集合
• クラスタ操作
– 予約、アップデート、起動、停止、再
起動、解放(削除)
• Ruby + Rack + EventMachine
- 19. © 2015 Internet Initiative Japan Inc.
19
クラスタ
• 互いに通信できるコンテナの集合
– 1つのクラスタは1つのユーザに属する
– 別のクラスタとは通信できない
Docker Daemon Docker Daemon Docker Daemon
空き
Container
Container
Container
Container
Container
Container
Container
Container
クラスタ1
クラスタ2
クラスタ3
Host
- 21. © 2015 Internet Initiative Japan Inc.
21
masterが管理するもの
• ホスト
– dockerが動く物理ホスト
– CPU、メモリ割当て状況
• IPアドレス
– コンテナは1個ずつ(プライベート)IPア
ドレスを持つ
- 22. © 2015 Internet Initiative Japan Inc.
22
slave
• Docker daemonのwrapper (reverse
proxy)
– masterからは、ほぼDocker daemonに
見える
– いくつかAPIを拡張
• Goで記述
Docker daemon
slave
Docker
Remote API
HTTP
HTTP
over
Unix domain
socket
master
- 23. © 2015 Internet Initiative Japan Inc.
23
Docker Remote API
• HTTP、REST、JSONベース
• dockerコマンドはすべてこのAPIを経
由している
Host
Docker daemon
docker pull
docker run
docker ...
container
container
container
Docker client
HTTP over
Unix domain socket
または
TCP
Docker
Remote API
- 24. © 2015 Internet Initiative Japan Inc.
24
slave追加機能
• コンテナ起動関連
– サイズ制限されたディスク領域提供
– ネットワーク設定
– iptablesチェイン設定
• コンテナのメトリクス取得
• コンテナ内にファイルを送り込む
• コンテナ非同期削除
- 27. © 2015 Internet Initiative Japan Inc.
27
CPU制限
• (Docker Remote API経由で)cgroupの
cpuset.cpusを使う
– コンテナのプロセスが実行されるCPU
コアの番号を指定
– 例: "CpusetCpus":"0-2,7"
• 各コンテナおよびシステムプロセス
それぞれが使うCPUコアを分離
- 28. © 2015 Internet Initiative Japan Inc.
28
ディスク使用量制限
• 特定サイズのloopbackデバイス用
ファイルを作って、それをmount
– あらかじめmkfs済sparseイメージ入り
tarファイルを用意
– コンテナ起動時にそれを展開して
mount(0.1∼0.2秒くらい)
– コンテナ解放時はファイルを1個削除す
るだけ
- 30. © 2015 Internet Initiative Japan Inc.
30
通常のDockerのネットワーク
docker0
NIC
IPマスカレード
仮想ネットワーク
インターフェース
(veth)
container
network
namespace
eth0
vethA
コンテナA
eth0
vethB
コンテナB
host
network
namespace
ホスト
仮想ブリッジ
- 31. © 2015 Internet Initiative Japan Inc.
31
通常のDockerのネットワーク
docker0
NIC
IPマスカレード
eth0
vethA
コンテナA
eth0
vethB
コンテナB
ホスト1
docker0
NIC
IPマスカレード
eth0
vethC
コンテナC
eth0
vethD
コンテナD
ホスト2
ホストをまたいだコンテナ間通信は困難
(ポートが固定されていればEXPOSEでできるが
Hadoopと相性が悪い)
- 33. © 2015 Internet Initiative Japan Inc.
33
本サービスのネットワーク
• dockerのネットワーク設定は使用せ
ず("NetworkDisabled": true)
• 代わりにslaveがコンテナ起動時に
ネットワーク設定をする
- 34. © 2015 Internet Initiative Japan Inc.
34
NIC
本サービスのネットワーク
docker0
NIC
IPマスカレード
eth0
vethA
bridge0
host-geth
host-veth
ホスト
通常のdockerの
ネットワーク
container
network
namespace
コンテナA
eth0
vethB
コンテナB
eth0
vethA
コンテナA
eth0
vethB
コンテナB
本サービスの
ネットワーク
host
network
namespace
ホスト
- 35. © 2015 Internet Initiative Japan Inc.
35
論理的にはこんな感じ
eth0
コンテナA
eth0
コンテナB
host-geth
ホスト1
eth0
コンテナC
eth0
コンテナD
host-geth
ホスト2
(コンテナのIPアドレスはmasterが決定しslaveが設定する)
- 38. © 2015 Internet Initiative Japan Inc.
38
Dockerイメージ
• Docker HUBのイメージは使用せず
– 同じrepository名:tag名でも内容が変
わっていることがある
• 独自にOSイメージ作成
– febootstrap で CentOS 6ベースで作成
• そのOSイメージからJDK, Hive,
Hadoop入りなどをDockerfileで生成
- 39. © 2015 Internet Initiative Japan Inc.
39
ログの管理
• コンテナ内の各種ログは、コンテナ
内の特定ディレクトリに一時保存
• ホスト上(コンテナ外)のfluentdで外に
飛ばす
• 本サービスのストレージ部分(管理用)
に保存
- 40. © 2015 Internet Initiative Japan Inc.
40
監視
• ホストが障害を起こしたらdomaはコ
ンテナ割り当て対象から除外
– 障害コンテナを別ホストに自動移動し
たり再起動はしない
• コンテナのアプリケーションレイヤ
の監視はanalysis APIが行っている
- 41. © 2015 Internet Initiative Japan Inc.
41
コンテナのモニタリング
• slaveに、コンテナ単位のメトリクス
を返す機能追加
• cgroupの統計情報と、コンテナ内の /
proc/net/dev等からメトリクスを得る
(今なら cAdvisor を使えば良いと思う)
- 42. © 2015 Internet Initiative Japan Inc.
42
slaveはメトリクスをJSON形式で返す
"memory": {
"failcnt": 0,
"stats": {
"unevictable": 0,
"total_unevictable": 0,
"total_swap": 0,
"total_rss": 380928,
"total_pgpgout": 681084,
"total_pgpgin": 697086,
"total_mapped_file": 1433600,
"total_inactive_file": 38936576,
"mapped_file": 1433600,
"inactive_file": 38936576,
"inactive_anon": 0,
"hierarchical_memsw_limit":
9223372036854776000,
"hierarchical_memory_limit":
9223372036854776000,
"cache": 102838272,
"active_file": 63901696,
"active_anon": 380928,
"pgpgin": 697086,
"pgpgout": 681084,
"rss": 380928,
"swap": 0,
"total_active_anon": 380928,
"total_active_file": 63901696,
"total_cache": 102838272,
"total_inactive_anon": 0
},
"max_usage": 139268096,
"usage": 104189952
},
"interfaces": {
"outpackets.0": 3021223,
"inbytes.0": 8228044607,
"indrop.0": 0,
"inerrs.0": 0,
"inpackets.0": 6429687,
"name.0": "eth0",
"outbytes.0": 199687042,
"outdrop.0": 0,
"outerrs.0": 0
},
"cpuacct": {
"throlling_data": {},
"cpu_usage": {
"usage_in_usermode": 2.668e+10,
"usage_in_kernelmode": 8.181e+10,
"percpu_usage": [
22599918565,
987624379,
65146098,
36705600,
18221767943,
5890326,
22768005795,
4033968,
218211598,
4302652,
5437296326,
23781278563,
18992360915,
18712487134,
55742891,
18522722054
]
}
}
- 44. © 2015 Internet Initiative Japan Inc.
44
まとめ
• Hadoop/Hiveをマルチテナントで動か
すためにDockerを採用
• Dockerは多数のコンテナを扱うには
課題がある
– 解決のためいくつかのツール類を開発
– 今ならもっと楽な方法があるはず