LoginSignup
3
6

More than 3 years have passed since last update.

Docker と OVS でセグメント間通信(ただし、サーバ内で)

Last updated at Posted at 2019-09-23

やりたいこと

タイトルなし.png

基本は上記図の通り

  • サーバ(Linux) 内に Docker でコンテナを作成
  • コンテナの通信はサーバの外に出る必要はない(むしろ出したくない)
  • コンテナ間でセグメントをまたいで通信(図ではセグメント二つだけだけど実際はもっと)

背景

  • 開発環境にプロダクションと同じ環境を構築したい願いを叶えるため
  • 開発環境で自由にできるのはこのサーバの中だけ。周りには影響を与えたくないので、サーバ内だけで通信を完結させたい

できあがった構成

Slide2.png

簡単な説明

まんまだけど、、、
* 1 階層: セグメント間のルーティングをさせるために OVS(Open vSwitch) をてっぺんに
* 2 階層: bridge(ovs-docker) を作成。L3 的役割(実際のルーティングは OVS に任せる)
* 3 階層: ここにコンテナと直接つながる bridge を作成。ここの bridge は VLAN を設定してやる(Fake bridge)。bridge の IP が各セグメントの Gateway の IP となる。
* 4 階層: コンテナは、VLAN タグを設定した bridge につなぐ。ここでは一つだけだけど、実際は、一つのコンテナから複数のセグメントに足を出す

色々調べてみて、VyOS や quagga 使ったりして実現する構成は見かけたけど、いかんせん NW 周りの知識が乏しいので、できるだけ簡単に実現できるよう目指した結果これに。

構築手順

一番最後に元ネタをつけておきます。
Linux、Docker、OVS のインストール手順は割愛。
OS は CentOS7.3。

bridge 作成

# ovs-vsctl add-br ovs-docker
# ovs-vsctl add-br b-v100 ovs-docker 100
# ovs-vsctl add-br b-v200 ovs-docker 200

2,3 つ目のコマンドが Fake bridge 作成コマンド。最後のパラメータが VLAN ID になるので、各自の環境に合わせて変える

bridge に IP を設定

ip addr add 192.168.100.1/24 dev b-v100
ip addr add 192.168.200.1/24 dev b-v200
ip link set b-v100 up
ip link set b-v200 up

Fake bridge に IP を設定して、bridge の Link を up

コンテナ作成 & ネットワーク周りの設定

docker run -d --name ContainerA --privileged --net=none baseimage /sbin/init
docker run -d --name ContainerB --privileged --net=none baseimage /sbin/init

ルーティング設定するので、--privileged オプション付き
ネットワークはとりあえず何もなしにするため --net=none を指定してコンテナを作成

ovs-docker add-port b-v100 eth0 ContainerA --ipaddress=192.168.100.2/24
ovs-docker add-port b-v200 eth0 ContainerB --ipaddress=192.168.200.2/24

docker exec ContainerA ip route add default via 192.168.100.1
docker exec ContainerB ip route add default via 192.168.200.1

各コンテナの eth0 に IP を割り振り。eth0 は任意の文字列を指定可能なので、お好きなように

IP 設定後、コンテナにデフォルト Gateway を設定。Gateway の IP は Fake bridge(b-v100 or b-v200) に割り振った IP

これで無事、セグメントを跨いだ環境の出来上がり。

この構成の欠点

  • ネットワーク周りを OVS にしたことで、docker network コマンドでの管理ができない(できれば、管理は Docker で一元管理できるといいんだけど、、)
  • あたり前だが、セグメントが増えるごとに bridge を作成する必要がある。Docker の場合 docker network ~~ で Gateway IP の設定までやってくれたけど、これはいちいち手でやらんといけない(面倒)
  • OVS が増える。。開発環境だからいいんだけど、あまり余計なプロセスは増やしたくないので、できれば OVS も排除したい(MACVLAN 使えばいい??)

元ネタ

https://blog.scottlowe.org/2012/10/31/layer-3-routing-with-open-vswitch/
https://blog.scottlowe.org/2012/10/19/vlans-with-open-vswitch-fake-bridges/

最後に

もっと簡単にできる
そもそも OVS なんていらない、Bridge だけでやれる

などあったら、ご意見、コメント頂けるとうれしいです

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6