Dockerの商用サービスでの利用事例紹介 [PDF:3.10MB]

Dockerの商用サービスでの利用事例紹介
[email protected]
株式会社インターネットイニシアティブ
1
本日の話
前置き
サービス概要 Dockerを商用サービスの基盤に使うに
あたって 実装方法 多数のコンテナの管理 コンテナのリソース制限 コンテナ間のネットワーク その他 © 2015 Internet Initiative Japan Inc.
2
サービス概要
http://www.iij.ad.jp/biz/storage/
© 2015 Internet Initiative Japan Inc.
4
IIJ GIO ストレージ&
アナリシスサービス
REST API(AWS S3互換)を持つ クラウドストレージサービス
+
Hadoop/Hiveを用いた データ解析機能(オプション)
© 2015 Internet Initiative Japan Inc.
5
サービス全体図
ユーザー
data
query
IIJ GIO ストレージ&アナリシスサービス
storage
API
analysis
API
data
data
data
container
© 2015 Internet Initiative Japan Inc.
ストレージ
ノード
計算
ノード
6
計算ノード
•  Hadoop + Hiveを使用
•  マルチテナント
© 2015 Internet Initiative Japan Inc.
7
計算ノード(図)
ユーザ毎に用意
ノード
DN
query
analysis
API
ノード
NM
NN
task
storage
API
RM
Hive
DN
NM
task
metastore
ノード
© 2015 Internet Initiative Japan Inc.
NN: Name Node
RM: Resouce Manager
DN: Data Node
NM: Node Manager
8
計算ノード部分 要件
•  ユーザ毎に実行環境が隔離されてい
ること
•  公平なリソースの共有
•  ノードはユーザにより増減可能なこ
と
© 2015 Internet Initiative Japan Inc.
9
サービス検討時の候補
•  Hypervisor型仮想マシンによる隔離
– 隔離という面では一番確実
– 起動が遅い、オーバーヘッドがある
•  コンテナによる隔離
•  アプリケーションレベルでの隔離
– Hiveだけ(UDF禁止)等、やれることを限
定すれば可能
© 2015 Internet Initiative Japan Inc.
10
Dockerとは?
•  コンテナ上で動くアプリケーション
の実行環境を構築・管理
•  オープンソース
•  コンテナとは?
– 複数のLinux標準機能の組み合わせで実
現する隔離環境
•  Namespaces, Cgroups, Capabilities など
© 2015 Internet Initiative Japan Inc.
11
仮想マシン vs コンテナ
Dockerコンテナは、隔
離された単なるプロセス
App A
App B
Bins/Libs
Bins/Libs
Guest OS
Guest OS
App A
App B
Bins/Libs
Bins/Libs
Hypervisor
Docker Engine
Host OS
Host OS
Server
Server
Hypervisor型仮想マシン
Dockerコンテナ
ゲスト毎に任意のOS使用可
高い隔離性
オーバヘッドが少ない
起動が速い
こちらを採用
© 2015 Internet Initiative Japan Inc.
12
実際の本サービスの制限
•  現時点では、ユーザが任意のDocker
イメージを動かすことは出来ない
– 任意のMapReduceプログラムを動かす
こともできない
– 使えるのはHiveQLのみ
•  Dockerの利用は将来への布石
© 2015 Internet Initiative Japan Inc.
13
Dockerを商用サービスの基盤に
使うにあたって
Dockerが向いていること
•  単体のホスト上での開発・ビルド・
テスト環境
•  環境のパッケージングと配布
© 2015 Internet Initiative Japan Inc.
15
Dockerの課題
•  複数ホスト上の多数のコンテナの管
理(オーケストレーション)
•  複数ホストをまたいだネットワーク
•  コンテナのログの管理
•  コンテナの監視、モニタリング
© 2015 Internet Initiative Japan Inc.
16
多数のコンテナの管理
オーケストレーション
Container
Container
Container
実行したいコンテナ群
コンテナ
オーケストレーション
ツール
ホスト
Docker
Docker
Docker
Container
Container
Container
Container
Container
Container
空き
Container
Container
© 2015 Internet Initiative Japan Inc.
18
オーケストレーションツール
•  例
– Docker Swarm
– Kubernetes
– Apache Mesos
– Fleet
– Nomad
– ...
© 2015 Internet Initiative Japan Inc.
19
doma(docker manager)とは?
•  独自開発
•  多数のDockerコンテナを管理する
– 複数ホストをリソースプールとする
– analysis APIからの要求によりプールか
ら必要数のコンテナを自動確保し起動
© 2015 Internet Initiative Japan Inc.
20
doma 構成図
request / response
analysis
API
HTTP
master
API
LB(nginx)
master
HTTP
使用可能ホスト
リソース空き情報 構成情報DB
IPアドレス空き情報 (MySQL MHA)
etc
slave
API
slave
HTTP
over
Unix domain
socket
Docker
Remote API
Docker daemon
Container
query
docker
ホスト群
© 2015 Internet Initiative Japan Inc.
21
master
•  多数のコンテナをクラスタ単位で管
理
– クラスタ = コンテナの集合
•  クラスタ操作
– 予約、アップデート、起動、停止、再
起動、解放(削除)
•  Ruby + Rack + EventMachine
© 2015 Internet Initiative Japan Inc.
22
クラスタ
•  互いに通信できるコンテナの集合
–  1つのクラスタは1つのユーザに属する
–  別のクラスタとは通信できない
クラスタ1
クラスタ2
クラスタ3
ホスト
Docker
Docker
Docker
Container
Container
Container
Container
Container
Container
空き
Container
Container
© 2015 Internet Initiative Japan Inc.
23
masterが管理するもの
•  ホスト
– dockerが動く物理ホスト
– CPU、メモリ割当て状況
•  IPアドレス
– コンテナは1個ずつ(プライベート)IPア
ドレスを持つ
© 2015 Internet Initiative Japan Inc.
24
コンテナの種類
•  グレード
– 性能を決める(CPUコア数、メモリ量)
•  タイプ
– dockerイメージ名に対応
– アプリケーション毎に複数用意されて
いる
© 2015 Internet Initiative Japan Inc.
25
slave
•  Docker daemonのwrapper
– masterからは、ほぼDocker daemonに
見える
– いくつかAPIを拡張
slave
API
•  Goで記述
master
slave
HTTP
over
Unix domain
socket
Docker
Remote API
Docker daemon
© 2015 Internet Initiative Japan Inc.
26
Docker Remote API
•  HTTP、REST、JSONベース
•  dockerコマンドはすべてこのAPIを経
由している
Docker
Remote API
Docker client
docker pull
docker run
docker ...
Host
Docker daemon
HTTP over
Unix domain socket
または
TCP
© 2015 Internet Initiative Japan Inc.
container
container
container
27
slave追加機能
•  コンテナ起動関連
– サイズ制限されたディスク領域提供
– ネットワーク設定
– iptablesチェイン設定
•  コンテナのメトリクス取得
•  コンテナ内にファイルを送り込む
•  コンテナ非同期削除
© 2015 Internet Initiative Japan Inc.
28
コンテナのリソース制限
リソース制限概略
•  主にcgroupを使う
•  CPU
– cpuset
•  メモリ
– memory
•  ディスク使用量
– cgroupではできない
© 2015 Internet Initiative Japan Inc.
30
CPU制限
•  (Docker Remote API経由で)cgroupの
cpuset.cpusを使う
– コンテナのプロセスが実行されるCPU
コアの番号を指定
– 例: "CpusetCpus":"0-2,7"
•  各コンテナおよびシステムプロセス
それぞれが使うCPUコアを分離
© 2015 Internet Initiative Japan Inc.
31
ディスク使用量制限
•  特定サイズのloopbackデバイス用
ファイルを作って、それをmount
– あらかじめmkfs済sparseイメージ入り
tarファイルを用意
– コンテナ起動時にそれを展開して
mount(0.1∼0.2秒くらい)
– コンテナ解放時はファイルを1個削除す
るだけ
© 2015 Internet Initiative Japan Inc.
32
コンテナ間のネットワーク
通常のDockerのネットワーク
container
network
namespace
host
network
namespace
コンテナA
コンテナB
eth0
eth0
vethA
vethB
仮想ネットワーク
インターフェース
(veth)
仮想ブリッジ
docker0
IPマスカレード
NIC
ホスト
© 2015 Internet Initiative Japan Inc.
34
通常のDockerのネットワーク
コンテナA
コンテナB
コンテナC
コンテナD
eth0
eth0
eth0
eth0
vethA
vethB
vethA
vethB
docker0
docker0
IPマスカレード
NIC
ホスト1
IPマスカレード
NIC
ホスト2
ホストをまたいだコンテナ間通信は困難
(ポートが固定されていればEXPOSEでできるが
Hadoopと相性が悪い)
© 2015 Internet Initiative Japan Inc.
35
解決策
•  例
– pipework
– weave
– flannel
– libnetwork overlay driver
– ...
こちらを採用
•  または独自に頑張る
© 2015 Internet Initiative Japan Inc.
36
本サービスのネットワーク
•  dockerのネットワーク設定は使用せ
ず
– ("NetworkDisabled": true)
•  代わりにslaveがコンテナ起動時に
ネットワーク設定をする
© 2015 Internet Initiative Japan Inc.
37
本サービスのネットワーク
本サービスの
ネットワーク
通常のdockerの
ネットワーク
コンテナA
コンテナB
eth0
eth0
vethA
vethB
container
network
namespace
コンテナA
コンテナB
eth0
eth0
vethA
vethB
docker0
host
network
IPマスカレード
IPマスカレード
namespace
NIC
ホスト
bridge0
host-veth
IPマスカレード
NIC
© 2015 Internet Initiative Japan Inc.
ホスト
ホスト
host-geth
38
論理的にはこんな感じ
コンテナA
コンテナB
eth0
eth0
ホスト1
host-geth
コンテナC
コンテナD
eth0
eth0
ホスト2
host-geth
•  コンテナはホストと同じネットワークに直接つながる
•  コンテナのIPアドレスはmasterが決定しslaveが設定する
© 2015 Internet Initiative Japan Inc.
39
ネットワークの隔離
•  クラスタ間はiptablesで隔離
– コンテナはCAP_NET_RAWを禁止
© 2015 Internet Initiative Japan Inc.
40
その他
Dockerイメージ
•  Docker HUBのイメージは使用せず
– 同じrepository名:tag名でも内容が変
わっていることがある
–  (docker 1.6〜はContent Addressable Image Identifiersにより一意に指定可)
•  独自にOSイメージ作成
– febootstrap で CentOS 6ベースで作成
•  そのOSイメージからJDK, Hive,
Hadoop入りなどをDockerfileで生成
© 2015 Internet Initiative Japan Inc.
42
ログの管理
•  コンテナ内の各種ログは、コンテナ
内の特定ディレクトリに一時保存
•  ホスト上(コンテナ外)のfluentdで外に
飛ばす
•  本サービスのストレージ部分(管理用)
に保存
(今ならDockerのlog driverを使えば良いと思う)
© 2015 Internet Initiative Japan Inc.
43
監視
•  ホストが障害を起こしたらdomaはコ
ンテナ割り当て対象から除外
– 障害コンテナを別ホストに自動移動し
たり再起動はしない
•  コンテナのアプリケーションレイヤ
の監視はanalysis APIが行っている
© 2015 Internet Initiative Japan Inc.
44
コンテナのモニタリング
•  slaveに、コンテナ単位のメトリクス
を返す機能追加
•  cgroupの統計情報と、コンテナ内の
/proc/net/dev 等からメトリクスを得
る
(今なら cAdvisor を使えば良いと思う)
© 2015 Internet Initiative Japan Inc.
45
コンテナのモニタリング
↓CPU Accounting
↓Network traffic
Memory→
46
ホストOSについて
•  CentOS 6を使用中
– だがDocker 1.8以降、CentOS 6は対象
外
– Red Hat は、DockerをRHEL 6で動かす
ことを推奨していない
•  コンテナ用OS
– CoreOS, Project Atomic, Snappy,
RancherOS
© 2015 Internet Initiative Japan Inc.
47
まとめ
•  Hadoop/Hiveをマルチテナントで動か
すためにDockerを採用
•  Dockerは多数のコンテナを扱うには
課題がある
– 解決のためいくつかのツール類を開発
– 今ならもっと楽な別のやり方があるは
ず
© 2015 Internet Initiative Japan Inc.
48
別のやり方
項目
本サービス
別のやり方(例)
コンテナオーケ
ストレーション
独自 doma(docker
manager)
Kubernetes,
Swarm, Mesosな
ど
ネットワーク
独自
libnetwork, flannel,
weave など
ロギング
外付けfluentd
docker log driver
モニタリング
独自
cAdvisor
OS
CentOS 6
CoreOS, Atomic
Hostなど
© 2015 Internet Initiative Japan Inc.
49