LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術

第6回 Linuxカーネルのコンテナ機能[5] ─ネットワーク

この記事を読むのに必要な時間:およそ 5.5 分

macvlan

ホストと同じネットワークにコンテナを接続する場合,macvlanというインターフェースが使えます。

macvlanは,既に存在するeth0のような物理的なインターフェースに,新たにMACアドレスを持つ仮想的なインターフェースを作ります。言ってみれば,1つのインターフェースに複数のMACアドレスを割り当てられる機能です。そして,新たに割り当てたMACアドレスを持つ仮想的なインターフェースが作成されます。

LinuxではIPエイリアスと言って,1つのインターフェースに複数のIPアドレスを割り当てることができます。しかし,この機能ではMACアドレスは全て同じになり,DHCPでアドレスを割り当てることはできません。

一方,macvlanはMACアドレスを持ちますので,DHCPでアドレスを割り当てることが可能です。

macvlanが設定されたインターフェースでは,本来のMACアドレス宛のパケットを受信する以外に,macvlanインターフェースに割り当てられたMACアドレス宛のパケットも受信することで,この機能を実現しているようです。

仮想インターフェースとは言っても,実際の受信処理は物理的なインターフェースのドライバ経由で行われますので,vethに比べるとオーバーヘッドが少なく,パフォーマンスが良い傾向にあります。

ではさっそくmacvlanインターフェースを作成してみましょう。

$ sudo ip addr show
  :(略)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:56:3b:3a brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.199/24 brd 192.168.122.255 scope global eth0
    inet6 fe80::5054:ff:fe56:3b3a/64 scope link 
       valid_lft forever preferred_lft forever

以上のようなインターフェースeth0上にmacvlan0というインターフェースを作成します。

$ sudo ip link add dev macvlan0 link eth0 type macvlan mode bridge (eth0でmacvlan0を作成)
$ sudo ip link show
  : (略)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:56:3b:3a brd ff:ff:ff:ff:ff:ff
3: macvlan0@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN 
    link/ether 9e:0e:0e:d5:bb:2f brd ff:ff:ff:ff:ff:ff

macvlan0インターフェースが作成されました。作成時に指定しているmode bridgeの部分は後で説明します。

それではDHCPでIPアドレスを割り当ててみましょう。

$ sudo dhclient macvlan0 (DHCPでアドレスを取得)
$ sudo ip addr show
  :(略)
3: macvlan0@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether 9e:0e:0e:d5:bb:2f brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.83/24 brd 192.168.122.255 scope global macvlan0
    inet6 fe80::9c0e:eff:fed5:bb2f/64 scope link 
       valid_lft forever preferred_lft forever

ご覧のようにIPアドレスが割り当たりましたね。

macvlanインターフェースとホストインターフェース間の通信

macvlanインターフェースは実装の仕組み上,macvlanインターフェースとmacvlanインターフェースを割り当てたインターフェース(前述の例だとeth0の間の通信はできませんので注意が必要です。

コンテナとホスト間で通信が必要な場合には使えません。

macvlanのモード

macvlanインターフェースはいくつかのモードを持ちます。

先の例でmacvlanインターフェースを作成する際にmode bridgeとしました。これはmacvlanのモードをbridgeモードに設定しています。

以下で簡単にmacvlanが持つモードを紹介します。なお,それぞれのモードの実際の動きはLXCの設定や動きを紹介する際に紹介したいと思いますので,ここでは簡単に各モードについて説明するのにとどめます。

privateモード

mode privateと設定すると,同じインターフェースに複数のmacvlanインターフェースを割り当てた場合,そのインターフェース同士の通信はできません。

たとえば,eth0に接続するmacvlanインターフェースとしてmacvlan0macvlan1インターフェースをprivateモードで作成した場合,macvlan0macvlan1の間の通信はできません。

同じインターフェースに接続するmacvlanインターフェースを多数作成して,それぞれをコンテナに割り当てた場合,コンテナ同士の通信ができませんので注意が必要です。

bridgeモード

先の例でmode bridgeと設定したモードがこのbridgeモードです。bridgeモードで設定すると,privateモードと異なり,同じインターフェースに割り当てたmacvlanインターフェース同士の通信が可能になります。この場合のmacvlanインターフェース同士の通信は直接行われ,外部には送出されませ ん。

vepaモード

vepaモードはbridgeモードのように,同じインターフェースに接続したmacvlanインターフェース同士の通信が可能なモードです。

しかしbridgeモードとは違い,macvlanインターフェース間のパケットは,一旦macvlanインターフェースが接続されるホストのインターフェースが接続している外部のスイッチなどに送出されます。

この外部のスイッチがVEPAをサポートしている場合,スイッチに届いたmacvlanインターフェース同士のパケットは,再度macvlanインターフェースを接続したホストのインターフェースに戻されて,目的のmacvlanインターフェースに届きます。このような機能をVEPAといいます。

つまりコンテナのホストがVEPA対応のネットワーク機器に接続されている場合に使用するモードです。

passthruモード

KVMで使われる機能に,macvlanをベースとしたmacvtapという機能があります。passthruモードはこのmacvtapを使った場合の仮想マシンに割り当てたインターフェースの制限を回避するために作られた機能のようです。

このモードはLXCから使えませんのでここでは説明しません)⁠

※)
現在はpassthruモードが指定できるようになりました。ただし,現時点でリリースはされていません。新機能ですから1.2がリリースされる時に指定できるようになると思います。

まとめ

今回はLinuxカーネルに実装されているコンテナに関連するネットワーク機能を2つ紹介しました。いずれもこれまでのカーネルの機能と同様に,コンテナ専用の機能というわけではありませんが,vethは元々コンテナでの利用を念頭に開発された機能で,コンテナ用と言ってもよい機能です。

さて,今回を含めて5回に渡ってコンテナで使われるLinuxカーネルの機能を紹介してきました。次からはいよいよLXCの説明に入っていきたいと思います。

LXC日本語ページの移行

第2回LXC公式ページの日本語サイトを紹介しましたが,メンテナのStéphane Graberさんが作業をしてくださり,公式ページのサイト上に日本語ページを置けることになりました。新しい日本語ページはこちらになります。

まだ移行作業中ですが,リリース情報なども日本語に翻訳して公開していきますので,チェックしてみてください。

著者プロフィール

加藤泰文(かとうやすふみ)

2009年頃にLinuxカーネルのcgroup機能に興味を持って以来,Linuxのコンテナ関連の最新情報を追っかけたり,コンテナの勉強会を開いたりして勉強しています。英語力のない自分用にLXCのmanページを日本語訳していたところ,あっさり本家にマージされてしまい,それ以来日本語訳のパッチを送り続けています。

Plamo Linuxメンテナ。ファーストサーバ株式会社所属。

Twitter:@ten_forward
技術系のブログ:http://tenforward.hatenablog.com/

コメント

コメントの記入