ネットワークインターフェースを追加する
コンテナに複数のネットワークインターフェースを持たせたいことがあるでしょう。LXD 3.
- physical:ホスト上の物理デバイスをそのままコンテナの中に見せる方式です。指定したデバイスはホスト上からは見えなくなります。性能的な要件から物理NICを特定のコンテナのみで使用したい場合に便利です。
- bridged:ホスト上の仮想ブリッジに紐付いた仮想ネットワークデバイスを作成する方式です。コンテナに最初から存在するeth0はこの方式を使っています。
- macvlan:既存のデバイスに対して異なるMACアドレスを割り当てた仮想ネットワークデバイスを作成する方式です。第533回のようにコンテナをホストの外からも見えるようにしたい場合に便利ですが,
ホストとコンテナでの通信はできなくなります。 - p2p:vethペアを作成し片方をコンテナに割り当てる方式です。bridgedと異なり,
特定のインターフェースへの紐付けは必須ではありません。より柔軟に複雑なネットワーク環境を構築したい場合に使うようです。 - sriov:ホスト上の物理デバイスの仮想機能
(Virtual Function) をコンテナに専有させる方式です。物理デバイスがSR-IOVに対応している必要があります。
LXDではネットワークインターフェースを次のように追加します。
$ lxc config device add コンテナ名 設定名 nic nictype=種別 オプション
設定名は追加するデバイス設定を一意に決める値です。nicを含む他のデバイス設定と被らない値を指定する必要があります。設定名がそのままコンテナ内部のネットワークインタフェースデバイスの名前になるため,name=デバイス名
」
オプションはkey=value
」
「とりあえずインターフェースを追加したい」lxc network
コマンドを使います。その手順は後述の
たとえば
$ lxc config device add container eth1 nic nictype=macvlan parent=enp0s31f6 デバイス eth1 が container に追加されました
ここでparent=
」nictype=bridged
」
- ※3
- サブインターフェースと親のインターフェースはMACアドレスが異なります。このためカーネルは物理NIC自身のMACアドレス宛以外のフレームも受け付けるように設定されます。ちなみにVMWareやVirtualBoxといった仮想マシンの管理システムによっては,
インスタンスのMACアドレス宛以外のフレームを落とすことがあります。仮想マシン上のLXD環境でmacvlanを使用する場合は, 仮想マシンマネージャーの設定にも注意してください。
実際にコンテナの中でip addr
」
$ lxc exec container ip addr show eth1 16: eth1@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 00:16:3e:22:10:68 brd ff:ff:ff:ff:ff:ff link-netnsid 0
enp0s31f6が親デバイスではあるものの,dhclient
コマンドを使えば,
$ lxc exec container dhclient eth1
ためしにeth1あてに外部からアクセスしつつ,
ちなみにLXDで設定したmacvlanのモードは
$ lxc exec container -- ip -d link show eth1 16: eth1@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 00:16:3e:22:10:68 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 0 macvlan mode bridge addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
MACアドレスにはhwaddr=FOO
」
- ※4
- 「00:16:3e」
はCitrixに買収されたXenSourceのOUIです。LXDは意図的にこのOUIを使っているようです。
もし追加したインターフェースを削除したい場合は,
$ lxc config device remove container eth1 デバイス eth1 が container から削除されました