【第11回 クラウドごった煮(コンテナ勉強会)】docker networking tools

29
Docker Networking tools 2015年3月28日 TIS株式会社 松井 暢之 第11回 クラウドごった煮(コンテナ勉強会)

Upload: nobuyuki-matsui

Post on 16-Jul-2015

2.485 views

Category:

Technology


5 download

TRANSCRIPT

Docker Networking tools

2015年3月28日

TIS株式会社 松井 暢之

第11回 クラウドごった煮(コンテナ勉強会)

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