さくらのクラウドでLXDのコンテナにグローバルIPアドレスを使う話
サーバ
Published: 2021-02-11

さくらのクラウドでLXDを使っているのですが、LXDのコンテナに直接グローバルIPアドレスをつけたり、ローカルスイッチのIPアドレスを直接つけたいときのメモです。

今回は Ubuntu20.04 で実際に構築してみます。

構成

  • ルーター+スイッチに直接つながっている
  • ディスクは2つ。VMのOS用とLXDのコンテナ用

構築

OSインストール等は割愛します。
さくらのクラウドで用意されているUbuntu20.04.01LTSのアーカイブイメージを使っています。
/dev/vdaにOSがインストールされいてる状態で/dev/vdbが増設ディスク100GBの前提で進めます。

ubuntu@lxd:~$ cat /proc/partitions
major minor  #blocks  name

  11        0    1048575 sr0
 252        0   20971520 vda
 252        1       1024 vda1
 252        2    4194304 vda2
 252        3   16774144 vda3
 252       16  104857600 vdb

lxd のセットアップ

  • lxd のインストール
ubuntu@lxd:~$ sudo lxd init
  • lxd の初期設定
ubuntu@lxd:~$ sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (zfs, ceph, btrfs, dir, lvm) [default=zfs]:
Create a new ZFS pool? (yes/no) [default=yes]:
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]: yes
Path to the existing block device: /dev/vdb
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]: no
Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]:
Would you like the LXD server to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:

/dev/vdbをzfsとして使うようにしました。

ただ、この状態ではzfsコマンドも入っていないので入れておきます。

  • zfsutils-linuxをインストール
$ sudo apt install zfsutils-linux

ブリッジを作ってコンテナにグローバルIPアドレスを付与しよう!

おそらくこんな感じにすることを想定されると思います。
さくらのクラウドではこれではコンテナから外部に通信できません。

さくらのクラウドマニュアル スイッチやルータ+スイッチを通過できないパケットはありますか?

ソースMACアドレスがサーバ作成時に割り当てられたものと異なる場合は通過しません。

ということなので、上記図ではVM作成時に割り当てられたens3のMACアドレスをソースとする
通信以外はルーター+スイッチを通過できないため、コンテナのeth0のMACアドレス(自動生成)では
通過できません。

コンテナを作ってipvlanを利用する

bridgeではできないのでipvlanを使ってIPアドレスを割り当てることにします。

ipvlanはMACアドレスはホストのものを共有し、エイリアスで追加したIPアドレスを
LXDに割り当てるイメージです。

  • ipvlanを使う場合はforwardingを有効にする必要があります。
ubuntu@lxd:~$ sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
ubuntu@lxd:~$ sudo sysctl --system
  • コンテナの作成
ubuntu@lxd:~$ lxc launch images:ubuntu/20.04 container1
Creating container1

The instance you are starting doesn't have any network attached to it.
  To create a new network, use: lxc network create
  To attach a network to an instance, use: lxc network attach

Starting container1
ubuntu@lxd:~$ lxc list
+------------+---------+------+------+-----------+-----------+
|    NAME    |  STATE  | IPV4 | IPV6 |   TYPE    | SNAPSHOTS |
+------------+---------+------+------+-----------+-----------+
| container1 | RUNNING |      |      | CONTAINER | 0         |
+------------+---------+------+------+-----------+-----------+

この状態だとNICが割り当てられてないのでNICを割り当てipvlanの設定をします。
ただ、コンテナが動いているとNICを割り当てられないのでいったん止めます。

  • containerの停止
ubuntu@lxd:~$ lxc stop container1
  • nicの割り当て
ubuntu@lxd:~$ lxc config device add container1 eth0 nic nictype=ipvlan parent=ens3 ipv4.address=27.133.xx.85
Device eth0 added to container1
  • ついでにタイムゾーンをJSTにしておきます
ubuntu@lxd:~$ lxc config set container1 environment.TZ Asia/Tokyo
  • コンテナをスタートします
ubuntu@lxd:~$ lxc start container1
  • コンテナの中に入ってネットワークの設定をします
ubuntu@lxd:~$ lxc exec container1 bash
root@container1:~#
  • /etc/netplan/10-lxc.yaml があるので編集します
root@container1:~# cat << _EOF_ > /etc/netplan/10-lxc.yaml
network:
  version: 2
  ethernets:
    eth0:
      addresses: [ "27.133.xx.85/28" ]
      gateway4: 27.133.xx.81
      dhcp4: false
      nameservers:
        addresses: [ "8.8.8.8", "8.8.4.4" ]
_EOF_
  • netplanを反映
root@container1:~# netplan apply
  • 無事外部と通信できるようになりました。
root@container1:~# ping sakura.ad.jp -c5
PING sakura.ad.jp (163.43.24.70) 56(84) bytes of data.
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=1 ttl=63 time=0.290 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=2 ttl=63 time=0.341 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=3 ttl=63 time=0.304 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=4 ttl=63 time=0.347 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=5 ttl=63 time=0.340 ms

--- sakura.ad.jp ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4027ms
rtt min/avg/max/mdev = 0.290/0.324/0.347/0.022 ms

まとめ

こんな感じにipvlanを使えばさくらのクラウドのルーター+スイッチからLXDのコンテナにグローバルIPアドレスを割り当てたり、
できるため、検証などに役立ったり、ちょっとした外部公開サーバをまとめたりするのに役立てています。