weaveを試してみた

42
Weaveを試してみた dockerコンテナ間でネットワークを組もう

Upload: kazuto-kusama

Post on 28-May-2015

2.765 views

Category:

Technology


14 download

DESCRIPTION

Dockerコンテナ同士を繋ぐ、Weaveを試してみた&調べてみたので共有します https://github.com/zettio/weave

TRANSCRIPT

Page 1: Weaveを試してみた

Weaveを試してみたdockerコンテナ間でネットワークを組もう

Page 2: Weaveを試してみた

@jacopen Kazuto KusamaNTT Communications

Cloudn PaaSの開発・運用をやっています

Page 3: Weaveを試してみた
Page 4: Weaveを試してみた
Page 5: Weaveを試してみた
Page 6: Weaveを試してみた
Page 7: Weaveを試してみた

コンテナ間でネットワークを繋ぎたい

Page 8: Weaveを試してみた

App DB

Page 9: Weaveを試してみた

同一ホストなら$ sudo docker run -d --name db training/postgres$ sudo docker run -d -P --name web --link db:db training/webapp python app.py

Docker linkを使うのが一般的

⇐ webコンテナは、環境変数でDBコンテナの接続先を取得できる

Page 10: Weaveを試してみた

じゃあホストが異なると・・・?

Page 11: Weaveを試してみた

解決策

Page 12: Weaveを試してみた

Weave

Zettioが開発している、Dockerコンテナに仮想ネットワークを提供するソフトウェア。Apache Licenseで開発されている。

ZettioはRabbitMQの開発者であるAlexis Richardson氏と、Matthias Radestock氏によって設立された企業。本社はロンドン。

Page 13: Weaveを試してみた

https://github.com/zettio/weave

Page 14: Weaveを試してみた

Container1

Docker Host1 Docker Host2

Container2

10.0.1.1/24 10.0.1.2/24

Page 15: Weaveを試してみた

DEMO1

Page 16: Weaveを試してみた

Weaveのセットアップsudo wget -O /usr/local/bin/weave \ https://raw.githubusercontent.com/zettio/weave/master/weavesudo chmod a+x /usr/local/bin/weave

超簡単

Page 17: Weaveを試してみた

Weaveの実行(HOST1)weave launchweave run 10.0.1.1/24 -t -i ubuntu /bin/bash

(HOST2)weave launch 10.9.8.171weave run 10.0.1.2/24 -t -i ubuntu /bin/bash

Container1

Docker Host2 10.9.8.170

10.0.1.1/24

Docker Host1 10.9.8.171

Container2

Weave Weave

10.0.1.2/24

Page 18: Weaveを試してみた

Container1

Docker Host2 10.9.8.170

10.0.1.1/24

Docker Host1 10.9.8.171

Container2

Weave Weave

10.0.1.2/24

ConoHa

Container310.0.1.3/24

Weave

Internet

Router

Page 19: Weaveを試してみた

DEMO2

Page 20: Weaveを試してみた

Weaveのしくみ

Page 21: Weaveを試してみた

Weave Router(weaver)

ホスト間でネットワークを繋ぐ仕組み。weave launch

すると、weaverのコンテナが立ち上がる。

https://github.com/zettio/weave/blob/master/docs/deployment.png

Page 22: Weaveを試してみた

Weave Router(weaver)docker psCONTAINER ID IMAGE COMMAND PORTS NAMES79f34b6616d2 ubuntu:14.04 "/bin/bash" high_lalandee2c7ac764cd7 zettio/weave:git-765bfbb49d46 "/home/weave/weaver 0.0.0.0:6783->6783/tcp, 0.0.0.0:6783->6783/udp weave

TCP, UDPの6783で通信している。この2つさえ空いていれば良い。

Page 23: Weaveを試してみた

Weave(wrapper command)

最初のセットアップでダウンロードしたもの。 中身はshell script。各種コマンドの提供の他、docker

wrapperとして機能する。

Page 24: Weaveを試してみた

例えばweave runコマンドrun) [ $# -gt 0 ] || usage validate_cidr $1 CIDR=$1 shift 1 create_bridge CONTAINER=$(docker run -d "$@" | tail -n 1) with_container_netns $CONTAINER attach $CIDR echo $CONTAINER ;;

⇐ cidrが正しいか確認

⇐ bridgeの作成⇐ docker runの実行

↑ dockerコンテナと同じNetwork Namespaceに

 仮想interfaceの作成

Page 25: Weaveを試してみた

Ambassadorパターン

Page 26: Weaveを試してみた

Ambassadorパターン

他ホストのコンテナに接続するための戦略のひとつ。 ホストをまたいで接続する専用のコンテナ(Ambassador)を立てるやり方。

Container1

Docker Host2Docker Host1

Container2

Ambassador Ambassador

Weaveは、まさにこのAmbassadorパターン。

Page 27: Weaveを試してみた

もうちょっと試そう

Page 28: Weaveを試してみた

Container1

Docker Host2 10.9.8.170

10.0.1.1/24

Docker Host1 10.9.8.171

Container2

Weave Weave

10.0.1.2/24

ConoHa

Container310.0.1.3/24

Weave

問題無く繋がる

Page 29: Weaveを試してみた

Container1

Docker Host2 10.9.8.170

10.0.1.1/24

Docker Host1 10.9.8.171

Container2

Weave Weave

10.0.1.2/24

ConoHa

Container310.0.1.3/24

Weave×

weaver落とすと

10.0.1.3には 繋がらなくなる

Page 30: Weaveを試してみた

Container1

Docker Host2 10.9.8.170

10.0.1.1/24

Docker Host1 10.9.8.171

Container2

Weave Weave

10.0.1.2/24

ConoHa

Container310.0.1.3/24

Weave

Weave launchしなおしても 接続が回復しない

(あれ?)

Page 31: Weaveを試してみた

Container1

Docker Host2 10.9.8.170

10.0.1.1/24

Docker Host1 10.9.8.171

Container2

Weave Weave

10.0.1.2/24

Container3

10.0.2.1/24

Container4

10.0.2.2/24

異なるサブネットのコンテナ

想定した通り、10.0.1.1から10.0.2.2は繋がらない。 その逆も然り

Page 32: Weaveを試してみた

深追い

Page 33: Weaveを試してみた

Dockerホスト内では何が起きているのか

Page 34: Weaveを試してみた

Container1

Docker Host

Weave Container

Dockerホスト内では何が起きているのか

eth0 eth0

vethxx vethyy

eth0

docker0 weave

Dockerが作るdocker0やvethはそのままに、

新しくweaveというブリッジアダプタが作られる

Page 35: Weaveを試してみた

Container1

Docker Host

Weave Container

Dockerホスト内では何が起きているのか

ethweeth0 ethweeth0

vethweplxxvethxx vethweplyyvethyy

eth0

docker0 weave

weaver runされたコンテナごとに、vethweplxxxという仮想インターフェースが作られ、weaveに接続される。

Page 36: Weaveを試してみた

Container1

Docker Host

Weave Container

Dockerホスト内では何が起きているのか

ethweeth0 ethweeth0

vethweplxxvethxx vethweplyyvethyy

eth0

docker0 weave

weaver

weaver container内では、weaverが動いている

Page 37: Weaveを試してみた

Container1

Docker Host

Weave Container

Dockerホスト内では何が起きているのか

ethweeth0 ethweeth0

vethweplxxvethxx vethweplyyvethyy

eth0

docker0 weave

weaver

weave lauchする際に指定した他のweaverに接続

Weave Container

Docker Host

Weave Container

ethweeth0 ethweeth0

vethweplxxvethxx vethweplyyvethyy

eth0

docker0 weave

weaver

Page 38: Weaveを試してみた

Container1

Docker Host

Weave Container

Dockerホスト内では何が起きているのか

ethweeth0 ethweeth0

vethweplxxvethxx vethweplyyvethyy

eth0

docker0 weave

weaver

結果、1つのL2ネットワークとして全てのコンテナが接続される! (肝心の部分ですが、時間切れのため、このあたりは推測です・・・)

Weave Container

Docker Host

Weave Container

ethweeth0 ethweeth0

vethweplxxvethxx vethweplyyvethyy

eth0

docker0 weave

weaver

Page 39: Weaveを試してみた

感想

Page 40: Weaveを試してみた

触ってみて思ったこと

• weaverコマンドだけで済むので、気軽に試せるのがとても良い

• 自分が試した限りだと、これといったハマリポイントはなかった

• 実運用するなら、weaverのオペレーションをなんとかしないといけない。手動でweaver launchするのはあり得ないので、serfとかのservice discoveryを組み合わせる必要がありそう。

Page 41: Weaveを試してみた

今後やりたいこと

• weaverをダウンさせたときの再接続が上手くいかなかったのが気になる。ドキュメント的にはしてくれそうなので、追加で調べたい

• weaver自体の仕組みを把握したい。golangで書かれているので読もうと思えば読める

• 仕組み的にDockerでなくても、ちょっと書き換えるだけで使えそう。LXCとか、Wardenとか

• 他の仕組み、例えばCoreOSのFlannel(Rudder)と比較したい。

Page 42: Weaveを試してみた

質問?