第521回ではLXD 3.
- ネットワークインターフェースの追加
- 固定IPアドレスの指定
- 標準のインターフェースeth0のカスタマイズ
- 特定のアドレス・
ポートにホストの外からアクセスする方法
LXDにおけるネットワークの設定
現在のLXD 3.
lxc network
コマンド:ホストとコンテナ間の橋渡しを行うブリッジインターフェースの設定lxc config device
コマンド:個々のコンテナの中で作られるネットワークインターフェースの設定
ブリッジインターフェースはホスト上でlxd init
を実行したときにも設定されます。特に設定を変更していないなら
$ lxc network show lxdbr0 config: ipv4.address: 10.154.195.1/24 ipv4.nat: "true" ipv6.address: fd42:284:93c1:a178::1/64 ipv6.nat: "true" description: "" name: lxdbr0 type: bridge used_by: [] managed: true status: Created locations: - none $ ip addr show dev lxdbr0 3: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether fe:53:81:5f:d5:f3 brd ff:ff:ff:ff:ff:ff inet 10.154.195.1/24 scope global lxdbr0 valid_lft forever preferred_lft forever inet6 fd42:284:93c1:a178::1/64 scope global valid_lft forever preferred_lft forever inet6 fe80::284f:6aff:fef6:c174/64 scope link valid_lft forever preferred_lft forever
上記lxdbr0では、
Ubuntu 16.lxc network
コマンドを使うことで、
個々のコンテナインスタンスにおけるネットワークインターフェースはlxc config device
コマンドによって追加・lxc config
は未設定の状態となり、lxc profile
の値が継承されます。
たとえば何も設定せずに
コンテナの作成・起動 $ lxc launch ubuntu:18.04 container デバイス設定は空の状態 $ lxc config device show container {} コンテナの中にはeth0が存在する $ lxc exec container ip addr show eth0 6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:16:3e:e5:c5:37 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.154.195.67/24 brd 10.154.195.255 scope global dynamic eth0 valid_lft 3553sec preferred_lft 3553sec inet6 fd42:284:93c1:a178:216:3eff:fee5:c537/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 3596sec preferred_lft 3596sec inet6 fe80::216:3eff:fee5:c537/64 scope link valid_lft forever preferred_lft forever
デバイス設定は空にも関わらずeth0インターフェースが作られています。これは作成したコンテナには自動的にdefaultプロファイルが適用され、
$ lxc profile show default config: {} description: "" devices: eth0: name: eth0 nictype: bridged parent: lxdbr0 type: nic root: path: / pool: default type: disk name: default used_by: []
上記のプロファイルの設定は、lxc config device show
」lxc config show
」--expanded
」
LXDにおけるプロファイルの設定はまた別の機会に譲るとして、
ネットワークインターフェースを追加する
コンテナに複数のネットワークインターフェースを持たせたいことがあるでしょう。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
」
実際にコンテナの中で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
」
もし追加したインターフェースを削除したい場合は、
$ lxc config device remove container eth1 デバイス eth1 が container から削除されました
ブリッジインターフェースで固定IPアドレスを設定する
コンテナがUbuntu 18.
たとえばIPv4のlease情報は次のように確認できます。
$ lxc exec container -- sh -c 'cat /run/systemd/netif/leases/*' # This is private data. Do not parse. ADDRESS=10.154.195.28 NETMASK=255.255.255.0 ROUTER=10.154.195.1 SERVER_ADDRESS=10.154.195.1 NEXT_SERVER=10.154.195.1 BROADCAST=10.154.195.255 T1=1800 T2=3150 LIFETIME=3600 DNS=10.154.195.1 DOMAINNAME=lxd HOSTNAME=container CLIENTID=ff8210b60000020000ab11cd753f09779ead4b
単にホストからコンテナのIPアドレスを知りたければlxc list
コマンドを使うと良いでしょう。
$ lxc list container +-----------+---------+----------------------+----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-----------+---------+----------------------+----------------------------------------------+------------+-----------+ | container | RUNNING | 10.154.195.28 (eth0) | fd42:284:93c1:a178:216:3eff:fea7:d454 (eth0) | PERSISTENT | 0 | +-----------+---------+----------------------+----------------------------------------------+------------+-----------+ JSONなど機械読み取り可能なフォーマットが良い場合は 「--format」オプションを指定する $ lxc list --format=json container (略)
コンテナの用途によっては静的にIPアドレスを割り当てたい場合もあるでしょう。次のようにbridgedなネットワークインターフェースデバイスを作成し、
まずbridgedなネットワークインターフェースデバイスを作成します。LXDには標準でlxdbr0ネットワークが作成されていますので、
$ lxc network attach lxdbr0 container eth1
次にこのインターフェースに対してIPv4アドレス
アドレスの割り当て $ lxc config device set container eth1 ipv4.address 10.154.195.100 デバイス情報の確認 $ lxc config device show container eth1: ipv4.address: 10.154.195.100 nictype: bridged parent: lxdbr0 type: nic
「ipv4.
IPアドレスの割り当て $ lxc exec container dhclient eth1 コンテナの状態の確認 $ lxc list container +-----------+---------+-----------------------+----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-----------+---------+-----------------------+----------------------------------------------+------------+-----------+ | container | RUNNING | 10.154.195.28 (eth0) | fd42:284:93c1:a178:216:3eff:fea7:d454 (eth0) | PERSISTENT | 0 | | | | 10.154.195.100 (eth1) | fd42:284:93c1:a178:216:3eff:fe37:425f (eth1) | | | +-----------+---------+-----------------------+----------------------------------------------+------------+-----------+
うまくアドレスが割り当たっているようであれば、lxc network list-leases
で確認できます。
$ lxc network list-leases lxdbr0 +-----------+-------------------+----------------+---------+ | HOSTNAME | MAC ADDRESS | IP ADDRESS | TYPE | +-----------+-------------------+----------------+---------+ | container | 00:16:3e:37:42:5f | 10.154.195.100 | DYNAMIC | +-----------+-------------------+----------------+---------+
ちなみに
なお、lxd init
時に設定しています。特に指定せずにすべて初期値どおりに設定していたとしたら、
$ lxc config set lxdbr0 ipv4.dhcp.ranges \ 10.154.195.10-10.154.195.10.20,10.154.195.110-10.154.195.10.120
連続する範囲をハイフンで、
標準のインターフェースeth0をカスタマイズする
eth0はdefaultプロファイルから継承されたデバイスです。このためlxc config device
による設定の変更が動作しない場合もあります。おおよそlxc config device
が使えないと考えればいいでしょう。たとえばIPv4アドレスを指定するipv4.
」lxc config device
」
もし、
- defaultプロファイルをカスタマイズする
- default以外のプロファイルを作成し、
それを適用する - コンテナに対してeth0設定を上書きする
1.のdefaultプロファイルをカスタマイズする方法は、
3.の方法において、
$ lxc stop container $ lxc network attach lxdbr0 container eth0 $ lxc config device set container eth0 ipv4.address 10.154.195.100 $ lxc start container
macvlanなインターフェースをeth0として作るのであれば、
$ lxc config device add container eth1 nic nictype=macvlan parent=enp0s31f6 $ lxc exec container dhclient eth0
特定のアドレス・ポートを公開する
コンテナでbridgedインターフェースを使っている場合、
LXD 2.
たとえばホストの80番ポート宛のアクセスを、
$ lxc config device add container port80 \ proxy listen=tcp:0.0.0.0:80 connect=tcp:localhost:8080
「port80」bind()
やlisten()
を行い、
proxyデバイスは次のコマンドで削除できます。
$ lxc config device remove container port80
なお、