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