weaveを試してみた
DESCRIPTION
Dockerコンテナ同士を繋ぐ、Weaveを試してみた&調べてみたので共有します https://github.com/zettio/weaveTRANSCRIPT
Weaveを試してみたdockerコンテナ間でネットワークを組もう
@jacopen Kazuto KusamaNTT Communications
Cloudn PaaSの開発・運用をやっています
コンテナ間でネットワークを繋ぎたい
App DB
同一ホストなら$ 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コンテナの接続先を取得できる
じゃあホストが異なると・・・?
解決策
Weave
Zettioが開発している、Dockerコンテナに仮想ネットワークを提供するソフトウェア。Apache Licenseで開発されている。
ZettioはRabbitMQの開発者であるAlexis Richardson氏と、Matthias Radestock氏によって設立された企業。本社はロンドン。
https://github.com/zettio/weave
Container1
Docker Host1 Docker Host2
Container2
10.0.1.1/24 10.0.1.2/24
DEMO1
Weaveのセットアップsudo wget -O /usr/local/bin/weave \ https://raw.githubusercontent.com/zettio/weave/master/weavesudo chmod a+x /usr/local/bin/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
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
DEMO2
Weaveのしくみ
Weave Router(weaver)
ホスト間でネットワークを繋ぐ仕組み。weave launch
すると、weaverのコンテナが立ち上がる。
https://github.com/zettio/weave/blob/master/docs/deployment.png
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つさえ空いていれば良い。
Weave(wrapper command)
最初のセットアップでダウンロードしたもの。 中身はshell script。各種コマンドの提供の他、docker
wrapperとして機能する。
例えば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の作成
Ambassadorパターン
Ambassadorパターン
他ホストのコンテナに接続するための戦略のひとつ。 ホストをまたいで接続する専用のコンテナ(Ambassador)を立てるやり方。
Container1
Docker Host2Docker Host1
Container2
Ambassador Ambassador
Weaveは、まさにこのAmbassadorパターン。
もうちょっと試そう
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
問題無く繋がる
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には 繋がらなくなる
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しなおしても 接続が回復しない
(あれ?)
?
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は繋がらない。 その逆も然り
深追い
Dockerホスト内では何が起きているのか
Container1
Docker Host
Weave Container
Dockerホスト内では何が起きているのか
eth0 eth0
vethxx vethyy
eth0
docker0 weave
Dockerが作るdocker0やvethはそのままに、
新しくweaveというブリッジアダプタが作られる
Container1
Docker Host
Weave Container
Dockerホスト内では何が起きているのか
ethweeth0 ethweeth0
vethweplxxvethxx vethweplyyvethyy
eth0
docker0 weave
weaver runされたコンテナごとに、vethweplxxxという仮想インターフェースが作られ、weaveに接続される。
Container1
Docker Host
Weave Container
Dockerホスト内では何が起きているのか
ethweeth0 ethweeth0
vethweplxxvethxx vethweplyyvethyy
eth0
docker0 weave
weaver
weaver container内では、weaverが動いている
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
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
感想
触ってみて思ったこと
• weaverコマンドだけで済むので、気軽に試せるのがとても良い
• 自分が試した限りだと、これといったハマリポイントはなかった
• 実運用するなら、weaverのオペレーションをなんとかしないといけない。手動でweaver launchするのはあり得ないので、serfとかのservice discoveryを組み合わせる必要がありそう。
今後やりたいこと
• weaverをダウンさせたときの再接続が上手くいかなかったのが気になる。ドキュメント的にはしてくれそうなので、追加で調べたい
• weaver自体の仕組みを把握したい。golangで書かれているので読もうと思えば読める
• 仕組み的にDockerでなくても、ちょっと書き換えるだけで使えそう。LXCとか、Wardenとか
• 他の仕組み、例えばCoreOSのFlannel(Rudder)と比較したい。
質問?