LXD 3.0 使い方まとめ
9/21 コンテナの引っ越しに関して追記
9/21 ubuntu-minimalのイメージの追加に関して追記
設定環境
- HP ProLiant DL380 G7
- ESXi 6.7.0
- Ubuntu 18.04 on ESXi
一通りコンテナを動かすまでの手順
LXDコンテナを使うまでの準備
ESXi switch の設定
LXDでコンテナをNATではなく、通常のブリッジ接続をしてネットワークに参加させる場合、 ESXi側でプロミスキャストをOnにしておかないとブリッジの動作をしてくれない。
Netplan Bridge の設定
17.04からNetplanでネットワークの設定を行う。 18.04をアップグレードではなく、 新規インストールした場合は /etc/netplan/01-netcfg.yaml がある。 コンテナを作成時にIPアドレスも設定したい場合、netplanで使うYAML形式で指定するのでnetplanを使用するほうが便利だと思います。
$ sudo vim /etc/netplan/01-netcfg.yaml network: version: 2 renderer: networkd ethernets: ens160: dhcp4: false dhcp6: false bridges: br0: interfaces: - ens160 dhcp4: false addresses: - 192.168.1.2/24 gateway4: 192.168.1.1 nameservers: search: - test.local addresses: - 192.168.1.10 - 8.8.8.8 - 1.1.1.1
上記は一例です。
netplan の設定反映
sudo netplan apply
Ubuntu Server の設定
コンテナを動かすサーバでは、各種設定を変更した上で再起動
各カーネルパラメータの変更 設定後は再起動
$ sudo vim /etc/security/limits.conf * soft nofile 1048576 * hard nofile 1048576 root soft nofile 1048576 root hard nofile 1048576 * soft memlock unlimited * hard memlock unlimited $ sudo vim /etc/sysctl.conf fs.inotify.max_queued_events = 1048576 fs.inotify.max_user_instances = 1048576 fs.inotify.max_user_watches = 1048576 vm.max_map_count = 262144 kernel.dmesg_restrict = 1 net.ipv4.neigh.default.gc_thresh3 = 8192 net.ipv6.neigh.default.gc_thresh3 = 8192
LXD 初期設定
Bridgeで使用する場合は、 Would you like to create a new network bridge? (yes/no) [default=yes] を no
$ sudo lxd init [sudo] password for : 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 (btrfs, dir, lvm) [default=btrfs]: Create a new BTRFS pool? (yes/no) [default=yes]: Would you like to use an existing block device? (yes/no) [default=no]: Size in GB of the new loop device (1GB minimum) [default=15GB]: Would you like to connect to a MAAS server? (yes/no) [default=no]: Would you like to create a new 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]: yes Name of the existing bridge or host interface: br0 Is this interface connected to your MAAS server? (yes/no) [default=yes]: no Would you like LXD 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]: $ lxc version If this is your first time running LXD on this machine, you should also run: lxd init To start your first container, try: lxc launch ubuntu:16.04 Client version: 3.0.1 Server version: 3.0.1 $ lxc profile list +---------+---------+ | NAME | USED BY | +---------+---------+ | default | 0 | +---------+---------+ $ lxc profile show default config: {} description: Default LXD profile devices: eth0: name: eth0 nictype: bridged parent: br0 type: nic root: path: / pool: default type: disk name: default used_by: []
UFW の設定
UFW の iptables before rules を適切に設定しないと通信できない。 FORWARD の箇所を通したいプロトコルとポートを指定する。 下記は一例 取り敢えず 名前解決 と apt (HTTPとHTTPS) が通るように設定
# vim /etc/default/ufw DEFAULT_FORWARD_POLICY="ACCEPT"
もしくは細かくルールを書く。
#vim vim /etc/ufw/before.rules # for LXD # name resolve -A ufw-before-forward -i br0 -p udp -s 192.168.55.0/24 --dport 53 -j ACCEPT -A ufw-before-forward -i br0 -p udp -d 192.168.55.0/24 --sport 53 -j ACCEPT # apt -A ufw-before-forward -i br0 -p tcp -s 192.168.55.0/24 --dport 80 -j ACCEPT -A ufw-before-forward -i br0 -p tcp -s 192.168.55.0/24 --dport 443 -j ACCEPT -A ufw-before-forward -i br0 -p tcp -d 192.168.55.0/24 --sport 80 -j ACCEPT -A ufw-before-forward -i br0 -p tcp -d 192.168.55.0/24 --sport 443 -j ACCEPT
コンテナを動かす
LXD Ubuntu 18.04 コンテナの追加
lxc launch でコンテナの作成、起動まで行ってくれる。
u18c1 は適当に作ったコンテナ名です。
$ lxc launch ubuntu:18.04 u18c1 Creating u18c1 Starting u18c1 $ lxc profile show default config: {} description: Default LXD profile devices: eth0: name: eth0 nictype: bridged parent: br0 type: nic root: path: / pool: default type: disk name: default used_by: - /1.0/containers/u18c1
コンテナ内の操作
lxc exec 【コンテナ名】 でコンテナ内のコマンドを扱える。
lxc exec 【コンテナ名】 bash とすると bash が立ち上がってコンテナ内に入ったかのように操作できる。
$ lxc exec u18c1 bash
もしくは、直接実行
lxc exec コンテナ名 -- ls -la /
-- が無いと実行するコマンドの引数が exec に対する引数として認識されてしまう。
固定IPの設定
lxc launch の時点で 指定する必要がある。 (内部のnetplanでも変えてもいいが、予め指定可能)
lax launch ubuntu:18.04 u18c1 --config=user.network-config="version: 1 config: - type: physical name: eth0 subnets: - type: static ipv4: true address: 192.168.100.101 netmask: 255.255.255.0 gateway: 192.168.100.1 control: auto - type: nameserver address: 8.8.8.8"
LXD
Gihyo.jp さんのほうで LXD に関する記事が結構上がってます。
コンテナ操作
複数コンテナ同時操作
シェルスクリプトでするしかないかなぁ・・・
第1引数に 操作(launch,start,stop,delete)、第2引数にマシン数を指定する。
#/bin/sh if [ "$1" = "" ] then echo "no argument" echo "sh $0 [launch|start|stop|delete] number_of_vm(1~)" exit fi if [ $1 = launch ]; then for i in `seq 0 $2` do number=$(($i + 110)) COMMAND="lxc launch ubuntu:18.04 u18c${i} --config=user.network-config=\"version: 1 config: - type: physical name: eth0 subnets: - type: static ipv4: true address: 192.168.1.${number} netmask: 255.255.255.0 gateway: 192.168.1.1 control: auto - type: nameserver address: 8.8.8.8\"" echo "$COMMAND" eval "$COMMAND" done elif [ $1 = start ]; then for i in `seq 0 $2` do echo lxc start u18c${i} lxc start u18c${i} done elif [ $1 = stop ]; then for i in `seq 0 $2` do echo lxc stop u18c${i} lxc stop u18c${i} done elif [ $1 = delete ]; then for i in `seq 0 $2` do echo lxc delete u18c${i} lxc delete u18c${i} done else echo "Sorry. Nothing to do." fi
各コンテナすべてに同じ操作を行なうのであれば seq とparallel コマンドを使って連番にしたコンテナ名を指定するやり方が良いと思います。
seq 0 19 |parallel -j 5 lxc exec u18c{} -- apt-get update -y seq 0 19 |parallel -j 5 lxc exec u18c{} -- apt-get upgrade -q -y seq 0 19 |parallel -j 5 lxc exec u18c{} -- apt autoremove -q -y
コンテナ一覧を見る。
$ lxc list +-------+---------+----------------------+------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-------+---------+----------------------+------+------------+-----------+ | u18c1 | RUNNING | 192.168.100.101 (eth0) | | PERSISTENT | 0 | +-------+---------+----------------------+------+------------+-----------+
コンテナの詳細を見る。
$ lxc info u18c1 Name: u18c1 Remote: unix:// Architecture: x86_64 Created: 2018/08/31 04:27 UTC Status: Running Type: persistent Profiles: default Pid: 1457 Ips: eth0: inet 192.168.100.101 vethJYJS8A eth0: inet6 fe80::216:3eff:fe37:e6c9 vethJYJS8A lo: inet 127.0.0.1 lo: inet6 ::1 Resources: Processes: 31 CPU usage: CPU usage (in seconds): 8 Memory usage: Memory (current): 187.77MB Memory (peak): 227.43MB Network usage: eth0: Bytes received: 636.83kB Bytes sent: 31.68kB Packets received: 1640 Packets sent: 463 lo: Bytes received: 872B Bytes sent: 872B Packets received: 12 Packets sent: 12
コンテナの設定を見る。
$ lxc config show u18c1 architecture: x86_64 config: image.architecture: amd64 image.description: ubuntu 18.04 LTS amd64 (release) (20180823) image.label: release image.os: ubuntu image.release: bionic image.serial: "20180823" image.version: "18.04" volatile.base_image: c76b5028c7566d4f3488c4ae26ea9f5794b24d6347e1849ce945baa6ae769016 volatile.eth0.hwaddr: 00:16:3e:37:e6:c9 volatile.idmap.base: "0" volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":100000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":100000,"Nsid":0,"Maprange":65536}]' volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":100000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":100000,"Nsid":0,"Maprange":65536}]' volatile.last_state.power: STOPPED devices: {} ephemeral: false profiles: - default stateful: false description: ""
イメージに対する操作
イメージ一覧
$ lxc image list +-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE | +-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+ | | c76b5028c756 | no | ubuntu 18.04 LTS amd64 (release) (20180823) | x86_64 | 173.93MB | Aug 31, 2018 at 4:27am (UTC) | +-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
ubuntu-minimal を使用する
上記に書かれていますが、 lxc remote add することで、ubuntu-minimal を launch 出来るようになります。
lxc remote add --protocol simplestreams ubuntu-minimal https://cloud-images.ubuntu.com/minimal/releases/ # 確認する場合は下記のコマンド lxc image list ubuntu-minimal: -c ds +-------------------------------------------------------+---------+ | DESCRIPTION | SIZE | +-------------------------------------------------------+---------+ | ubuntu 16.04 LTS amd64 (minimal release) (20180705) | 93.08MB | +-------------------------------------------------------+---------+ | ubuntu 16.04 LTS amd64 (minimal release) (20180814) | 93.43MB | +-------------------------------------------------------+---------+ | ubuntu 18.04 LTS amd64 (minimal release) (20180705) | 92.76MB | +-------------------------------------------------------+---------+ | ubuntu 18.04 LTS amd64 (minimal release) (20180806.1) | 93.01MB | +-------------------------------------------------------+---------+ | ubuntu 18.04 LTS amd64 (minimal release) (20180814) | 93.03MB | +-------------------------------------------------------+---------+
ストレージに対する操作
ストレージ一覧
$ lxc storage list
+---------+-------------+--------+--------------------------------+---------+
| NAME | DESCRIPTION | DRIVER | SOURCE | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| default | | btrfs | /var/lib/lxd/disks/default.img | 22 |
+---------+-------------+--------+--------------------------------+---------+
ストレージ確認
show -> Show storage pool configurations and resources
$ lxc storage show default config: size: 15GB source: /var/lib/lxd/disks/default.img description: "" name: default driver: btrfs used_by: - /1.0/containers/u18c0 - /1.0/containers/u18c1 - /1.0/containers/u18c10 - /1.0/containers/u18c11 - /1.0/containers/u18c12 - /1.0/containers/u18c13 - /1.0/containers/u18c14 - /1.0/containers/u18c15 - /1.0/containers/u18c16 - /1.0/containers/u18c17 - /1.0/containers/u18c18 - /1.0/containers/u18c19 - /1.0/containers/u18c2 - /1.0/containers/u18c3 - /1.0/containers/u18c4 - /1.0/containers/u18c5 - /1.0/containers/u18c6 - /1.0/containers/u18c7 - /1.0/containers/u18c8 - /1.0/containers/u18c9 - /1.0/images/51d8adf6ba25c3f79963994a06cbfb55aa6eb2ebb2d67817bd0938b799ec0315 - /1.0/profiles/default status: Created locations: - none
info -> Show useful information about storage pools
$ lxc storage info default
info:
description: ""
driver: btrfs
name: default
space used: 6.77GB
total space: 15.00GB
used by:
containers:
- u18c0
- u18c1
- u18c10
- u18c11
- u18c12
- u18c13
- u18c14
- u18c15
- u18c16
- u18c17
- u18c18
- u18c19
- u18c2
- u18c3
- u18c4
- u18c5
- u18c6
- u18c7
- u18c8
- u18c9
images:
- 51d8adf6ba25c3f79963994a06cbfb55aa6eb2ebb2d67817bd0938b799ec0315
profiles:
- default
ストレージ作成
ブロックデバイスじゃないと作れない模様 ループバックデバイスを作ってストレージを作るか、 新しいHDを追加する。
ループバックで作る方法は下記の通り。
まず、マウントするディスクイメージを dd を使って作成する。 bs と count は作成したいディスクイメージのサイズに合わせて調整(ここでは5GB)
$ sudo dd if=/dev/zero of=disk.img bs=16M count=320 320+0 records in 320+0 records out 5368709120 bytes (5.4 GB, 5.0 GiB) copied, 92.7007 s, 57.9 MB/s
次に、 losetup を使って空きループバックデバイスを特定し、 ループバックデバイスに作成したイメージをマウントする。
$ sudo losetup $(losetup -f) disk.img
ループバックデバイスになったかどうかは、 losetup -a
$ sudo losetup -a
これでブロックデバイスとして扱えるので、 lxc storage コマンドでストレージを作成する。
$ lxc storage create my-disk btrfs source=/dev/loop1
ループバックデバイスに関しては blog.amedama.jp
プロファイルにストレージを追加
プロファイルにrootの設定が無いと、 コンテナを起動出来ないので下記のコマンドが必要
lxc profile device add default root disk path=/ pool=<pool-name>
ZFS を使ってストレージ作成
もっと簡単に作れました。
sudo truncate -s 【サイズ】 【出力ファイル名】 sudo zpool create 【pool名】 【先程作ったファイル】 lxc storage create 【ストレージ名】 zfs source=【pool名】
ただ、これだけだと再起動時に zpool のほうが自動で import してくれないので、 手動でpoolをimportしてからLXDを再起動する必要があります。
リソース操作
リソースの制御
ネットワーク操作
ネットワーク操作
Network management with LXD (2.3+) | Stéphane Graber's website
コンテナのバックアップ、マイグレーション
同一ストレートプールの場合
同一ストレージプールの場合は、 lxc copy や lxc move で可能
別のストレージプールに行う場合
LXD 3.2 以降で copy や move を使って異なるストレージプールへ行えるようになる予定
なので、現状は lxc publish で一旦イメージを作成し、
異なるストレージをrootとするプロファイルを作成、そのプロファイルを用いて作成したイメージからlaunchする手順になる。
sudo truncate -s 48G /pool/LXD/LXD_POOL_1.IMG # 引っ越し先となる別のストレージプールのイメージを作成(ZFS) sudo zpool create Pool1 /pool/LXD/LXD_POOL_1.IMG # 引っ越し先となる別のストレージプールの作成 lxc storage create cpool1 zfs source=Pool1 # LXDにストレージ追加 lxc profile create pool1 # Profile「pool1」を新規作成 lxc profile device eth0 nic name=eth0 nictype=bridged parent=br0 # プロファイルにNICの追加 lxc profile device add pool1 root disk path=/ pool=cpool1 # プロファイルにdiskの追加 lxc publish 【コンテナ名】 --alias 【作成するイメージのエイリアス名】 # イメージの作成 lxc launch 【作成したイメージ名】 【作成するコンテナ名】 -p pool1 # コンテナの作成(引っ越し完了) lxc image delete 【作成したイメージ名】 # イメージの削除
ちなみに追加できる device は下記のページ参考 Container configuration - LXD - system container manager
参考記事
gihyo.jp qiita.com qiita.com websiteforstudents.com qiita.com www.komee.org github.com