View
2.486
Download
5
Category
Preview:
Citation preview
2
松井暢之(まつい のぶゆき)
TIS株式会社 戦略技術センター
~2003
2003~2008
2009
2010~2012
2013~
現場PJでアーキテクト兼モデラー兼プログラマ兼…を歴任
基盤技術センター(現戦略技術センター)で不芳PJの火消しに奔走
全社生産性向上の企画策定に従事
オープンでエッジな技術を活用した事業企画に従事
Cloud Orchestrator “CloudConductor®” の企画開発とOSS化開始
http://cloudconductor.org
nbyk.matsui nmatsui
nbyk.matsui@n_matsui
Agenda
1. Dockerのネットワークは困りもの
2. 様々なDockerネットワーキングツール
3. coreos/flannel と zettio/weave をもう少し
4. OpenVNetを用いてDockerネットワーキングツールを作ろう
3
eth0
docker0
(現時点の)Dockerネットワーク
1. Dockerを起動
i. docker0という仮想ブリッジを作成
ii. docker0から外部に接続できるように、iptablesにルールを追加
2. Dockerコンテナ立ち上げ
i. vethペアをコンテナのNW namespaceとdocker0に接続
ii. 指定されていれば、ポート変換ルールをiptablesに追加
4
veth
コンテナ1
veth
veth
コンテナ2
veth
veth ペア
iptablesでIPマスカレード(とポート変換)
(現時点の)Dockerネットワークの面倒なところ
コンテナに与えられるIPアドレスを制御できない
docker0に与えるIPアドレスは指定できるが、コンテナのIPアドレスはdocker0が所属するアドレス空間から昇順で自動採番
コンテナを再作成した際に、以前のIPアドレスを再利用することはできない
ホストOSの外部からコンテナにアクセスするのが面倒
コンテナに与えられたIPアドレスは、ホストOSの外部からはアクセスできない
コンテナ内のデーモンにアクセスするためには、ホストOSへポートフォワードしておく必要がある
5
(現時点の)Dockerネットワークはマルチホストでは不十分
Dockerが提供するネットワークは、単一ホストに閉じた状況で利用するものと考えるべき
複数ホストで稼働するDockerコンテナを接続するためにAmbassadorPatternという方法が提案されているが、コンテナ間の接続はできてもホストOS外部からの接続は楽にならない
http://docs.docker.com/articles/ambassador_pattern_linking/
6
eth0
docker0
veth
コンテナ1
veth
veth
Ambassador
veth
eth0
docker0
veth
Ambassador
veth
veth
コンテナ2
veth
docker linkdocker link
unicast
Agenda
1. Dockerのネットワークは困りもの
2. 様々なDockerネットワーキングツール
3. coreos/flannel と zettio/weave をもう少し
4. OpenVNetを用いてDockerネットワーキングツールを作ろう
7
Dockerのネットワークをもっと楽にするために
Dockerネットワーキングツールに求められるコト
① L2もしくはL3で接続された複数ホストを接続できる
② 任意のアドレス空間を指定した仮想ネットワークを作成できる
③ 仮想NW内の任意のアドレスでコンテナを立ち上げられる
④ コンテナに与えられた仮想IPアドレスで、コンテナ間だけではなくコンテナ外部からの接続もできる
⑤ DNSやDHCP、あるいはセキュリティグループ等の高度なネットワーク機能を実現できる
等々
8
様々なDockerネットワーキングツール
coreos/flannel https://github.com/coreos/flannel
Kubernetesと共に利用される(ことが多い)
etcdに依存しており、インストールと設定は少し面倒
dockerコマンドはそのまま利用可能
zettio/weave https://github.com/zettio/weave
Dockerネットワーキング専用のツール
インストールが簡単
dockerコマンドをラップするweaveコマンドを用いることでコンテナに仮想ネットワークを滑り込ませる
9
様々なDockerネットワーキングツール
socketplane https://github.com/socketplane/socketplane
Docker社に買収された(ので、そのうちdockerに取りこまれるかも?)
Open vSwitchとconsulを活用しており、インストールも簡単
consulのmulticastDNSを用いて、L2内ならばクラスタを自動構築
multicastが通らない場合自力でクラスタにjoinすることも可能
なのだが、試したところ仮想ネットワークが上手く動作しない…
Docker swarm https://github.com/docker/swarm
Docker社謹製のDockerホストのクラスタリングツール
Manager Nodeにdockerコマンドで指示をだせば、イイカンジにクラスタ内でコンテナを分散してくれる
10
様々なDockerネットワーキングツール
jpetazzo/pipework https://github.com/jpetazzo/pipework
仮想ブリッジを作成し、任意のIPアドレスをコンテナに割当(単一ホストでの利用を想定)
etcdを用いて複数ホストでpipeworkを協調動作させるツール(helander/docknet)もあったが、メンテナンスされていない
rancherio/rancher https://github.com/rancherio/rancher
ネットワーキングだけでなく、ストレージなども含めDocker全体を管理するプラットフォームを目指している(らしい)
RancherOSというDockerコンテナ用のDistributionも出している
等々
11
Agenda
1. Dockerのネットワークは困りもの
2. 様々なDockerネットワーキングツール
3. coreos/flannel と zettio/weave をもう少し
4. OpenVNetを用いてDockerネットワーキングツールを作ろう
12
coreos/flannel
仮想ネットワークとして192.168.0.0/16を指定した場合の例
CentOS 7 / docker 1.3.2 / etcd 2.0.4 / flannel 0.3.0
13
eth0
docker0
veth
コンテナ11
veth
veth
eth0
docker0
veth veth
コンテナ22
veth
コンテナ12
veth
コンテナ21
veth
flannel0 flannel0
flanneld flanneldコンテナからのパケットをカプセル化
10.0.0.0/24 10.1.0.0/24
.10 .10
192.168.95.0/16 192.168.82.0/16
192.168.95.1/24 192.168.82.1/24
.95.2 .95.3 .82.2 .82.3
仮想ネットワーク
192.168.0.0/16
etcd etcd仮想ネットワークの設定情報を共有
UDP unicast
coreos/flannel
1. 各ホストにetcdとflannelをインストールする
2. dockerコンテナを起動するホスト全てでetcdを起動する
3. 仮想ネットワークの設定をetcdに投入する
4. flannelのデーモンを起動すると仮想ブリッジのflannel0が作成され、静的routeが設定される
5. flannelが生成した仮想ネットワーク定義(/run/flannel/subnet.env)
を読み込んでdockerを再起動し、docker0のIPアドレスを再設定
6. dockerコマンドを用いてdockerコンテナを起動する
14
# /usr/local/bin/etcd -name flannel1 -initial-advertise-peer-urls http://10.0.0.10:2380 \
-listen-peer-urls http://10.0.0.10:2380 -initial-cluster-token flannel-cluster01 \
-initial-cluster flannel1=http://10.0.0.10:2380,flannel2=http://10.1.0.10:2380 \
-initial-cluster-state new > /tmp/etcd.log 2>&1 &
# /usr/local/bin/etcdctl set /coreos.com/network/config '{"Network":"192.168.0.0/16"}'
# /usr/local/bin/flanneld -iface=eth0 > /tmp/flanneld.log 2>&1 &
coreos/flannel
15
ポイント coreos/flannelでは
① L2 and/or L3で接続された複数ホストの接続
○ L2で接続されたホスト間、L3で接続されたホスト間を接続し、通信可能(flanneldが外部NWにトンネル作成)
② 任意のアドレス空間を指定して仮想ネットワークの作成
○ etcdに仮想ネットワーク全体のアドレス空間を設定できる
③ 任意のアドレスを指定してコンテナを起動
× 各ホストには指定したアドレス空間内のサブネットが作成されるが、アドレス帯を指定することはできない
④ コンテナ間だけでなくコンテナ外部からも接続可能
○ 各ホストに静的routeが追加され、他のホスト上で動作しているコンテナへも接続できる
⑤ DNSやDHCP、セキュリティグループ等の高度なネットワーク機能の実現
× 高度なネットワーク機能は無い
zettio/weave
仮想ネットワークとして192.168.99.0/24を指定した場合の例
CentOS 7 / docker 1.3.2 / weave 0.9.0
16
10.0.0.0/24 10.1.0.0/24
.10 .10
仮想ネットワーク
eth0
docker0
コンテナ12
vethveth
コンテナ11
vethveth
Weaveコンテナ
vethvethveth
vethveth
weaver
weave
vethvethveth
.2192.168.99.0/24 .1
.0.9.0.8
eth0
docker0
コンテナ21
veth veth
コンテナ22
veth veth
Weaveコンテナ
veth veth veth
veth veth
weaver
weave
veth veth veth
.4.3
.0.9.0.8
172.17.42.1/16 172.17.42.1/16
コンテナからのパケットをカプセル化
UDP unicast
zettio/weave
1. 各ホストにweaveをインストールする
2. 最初のホストでweaveを起動する
3. 残りのホストでは、最初のホストを指定してweaveを起動する(weaveクラスタが生成されれば、最初のノードが落ちてもweaveは動作し続ける)
4. weave runコマンドを用いてdockerコンテナを起動する
5. weave exposeコマンドを用いてコンテナへの静的routeを設定する
17
# wget -O /usr/local/bin/weave https://github.com/zettio/weave/releases/download/latest_release/weave
# chmod a+x /usr/local/bin/weave
# weave launch
# weave launch 10.0.0.10
# weave run 192.168.99.1/24 --expose 80 –p 80 -d -i –t testimage:apache
# weave expose 192.168.99.1/24
zettio/weave
18
ポイント coreos/flannelでは
① L2 and/or L3で接続された複数ホストの接続
○ L2で接続されたホスト間、L3で接続されたホスト間を接続し、通信可能(weaverが外部NWにトンネル作成)
② 任意のアドレス空間を指定して仮想ネットワークの作成
○ コンテナ起動時に指定したCIDRで仮想ネットワークが生成される
③ 任意のアドレスを指定してコンテナを起動
○ コンテナ起動時にCIDRを指定する
④ コンテナ間だけでなくコンテナ外部からも接続可能
○ 各ホストでweave exposeすれば静的routeが追加される
⑤ DNSやDHCP、セキュリティグループ等の高度なネットワーク機能の実現
△ weaveクラスタ内での内部DNS機能が提供されている
Agenda
1. Dockerのネットワークは困りもの
2. 様々なDockerネットワーキングツール
3. coreos/flannel と zettio/weave をもう少し
4. OpenVNetを用いてDockerネットワーキングツールを作ろう
19
Dockerネットワーキングツールを作ろう
DockerコンテナのネットワークはNetwork Namespaceで分離されているだけ
ホストOSからコンテナへvethの片割れを簡単に追加できる
ホストOSからコンテナの静的routeも制御できる
仮想ネットワークオーバーレイツールとNetwork Namespaceを組み合わせて、Dockerネットワーキングツールを作ってみよう
OSSの仮想ネットワークオーバーレイツール
ミドクラ: MidoNet https://github.com/midonet/midonet
あくしゅ: OpenVNet https://github.com/axsh/openvnet
OpenContrail http://www.opencontrail.org/
等20
OpenVNetとは
あくしゅ社が開発しているOSSの仮想ネットワークツール
L2/L3のネットワーク上に任意の仮想L2/L3ネットワークをオンデマンドにオーバーレイ
既存の物理ネットワークを仮想ネットワークへ延伸
DHCPやセキュリティグループ等の高度なNFVも提供
21
今回の検証では2.3.0を使っています
OpenVNetとは
あくしゅ社が開発しているOSSの仮想ネットワークツール
22
vna (Virtual Network Agent)
– Open vSwitchの設定を変更
– OpenFlow 1.3 コントローラ(Trema-edge)を内蔵
vnmgr (Virtual Network Manager)
– 全体のネットワーク構成を把握しvnaへ指令
– フロー制御ルールの永続化サービスを提供
vnapi (Virtual Network API)
– Web APIのエンドポイントを提供
– 外部からvnmgrへ指示を引き渡す連携窓口
vnctl (Virtual Network Controller)
– コマンドラインインターフェイスを提供
– vnapiと対話
エージェント
その他コンポーネント
デモの環境
SoftLayerのあるDCに2台の仮想サーバ + 別のDCに1台の仮想サーバ
最小構成(1Core 1GB RAM)のPublic Cloud Instance
OSはCentOS 6.6
OpenVNetが公式サポートするOSがRHEL 6.4のため
VLAN Spanningを設定し、別DCのVLANとの通信を許可
23
Public Primary Subnet
Private Primary Subnet
DC A DC B
OpenVNetによるDockerネットワーキング
Dockerコンテナ間にOpenVNetで仮想ネットワークをオーバーレイ
24
eth0
br0
eth1
vna
OVSeth0
br0
eth1
vna
OVSeth0
br0
eth1
vna
OVS
vnmgr
vnapi
vnctl
A.B.C.D/29.X .Y
E.F.G.H/29.Z
10.b.c.d/26 10.f.g.h/26
.x .y .z
mysql
redis
manager agent01 agent02
veth11b
コンテナ11
veth11c
veth12b
コンテナ12
veth12c
veth13b
コンテナ13
veth13c
veth21b
コンテナ21
veth21c
veth22b
コンテナ22
veth22c
veth23b
コンテナ23
veth23c
veth31b
コンテナ31
veth31c
veth32b
コンテナ32
veth32c
veth33b
コンテナ33
veth33c
GREトンネル
GREトンネル
フローテーブル フローテーブル フローテーブル
DC A DC B
OpenVNetによるDockerネットワーキング
仮想ネットワークの論理的な状態
25
コンテナ11
veth11c
コンテナ12
veth12c
コンテナ13
veth13c
コンテナ21
veth21c
コンテナ22
veth22c
コンテナ23
veth23c
コンテナ31
veth31c
コンテナ32
veth32c
コンテナ33
veth33c
10.b.c.d/26
10.f.g.h/26
仮想ルータ
.x .y
OpenVNetの現在の仕様上、物理・仮想間のルーティングは自ホスト上のコンテナのみ許可
DC A
.z
manager agent01 agent02
DC B
192.168.99.0/24
.α .β
.1
.11
.12
.13
.21
.22
.23
.31
.32
.33
Security Group 1
・ICMPを許可・SSHを許可・SG内は全て許可・それ以外は拒否
Security Group 2
・ICMPを許可・SG1からのSSHは許可・SG内は全て許可・それ以外は拒否Security Group 3
・ICMPを許可・SG内は全て許可・それ以外は拒否
オーバーレイされた仮想ネットワーク
デモ
1. managerから自身上にあるコンテナへの疎通確認
OpenVNetの現在の仕様上、他サーバ上のコンテナへの経路は仮想ルータでDROPされてしまいます
2. 仮想ネットワーク上の疎通とセキュリティグループの確認
1. managerからコンテナ11へはSSHできるが、コンテナ12やコンテナ13へはSSHできない
2. コンテナ11からコンテナ21やコンテナ31へはSSHできる
3. コンテナ11からコンテナ12へはSSHできるが、コンテナ13へはSSHできない
4. 全てのコンテナにpingは通る
26
Docker + OpenVNet
27
ポイント Docker + OpenVNetでは
① L2 and/or L3で接続された複数ホストの接続
○ L2で接続されたホスト間、L3で接続されたホスト間を接続し、通信可能(vnetはL3間だけGREトンネル生成)
② 任意のアドレス空間を指定して仮想ネットワークの作成
○ vnetの設定で、仮想ネットワークのアドレス空間を設定できる
③ 任意のアドレスを指定してコンテナを起動
○ 固定IPを指定してコンテナを起動できる(vnetにDHCPを行わせることも可能)
④ コンテナ間だけでなくコンテナ外部からも接続可能
△ 現在のvnetの仕様上、自ホスト上のコンテナのみ接続可能(他ホスト上のコンテナには接続できない)
⑤ DNSやDHCP、セキュリティグループ等の高度なネットワーク機能の実現
○ 仮想ネットワーク間のルーティングやDHCP、セキュリティグループが利用可能
vnet: OpenVNetの略
最後に
今回のデモ環境を構築するansible playbookを公開しています
tech-sketch/walfischhttps://github.com/tech-sketch/walfisch
よろしければ一度試してみてください
Dockerのネットワーキングは面白い技術です。皆さんも遊んでみましょう!
28
Recommended