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にしておかないとブリッジの動作をしてくれない。 f:id:inixa:20180831132259p:plain

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 の設定

コンテナを動かすサーバでは、各種設定を変更した上で再起動

github.com

カーネルパラメータの変更 設定後は再起動

$ 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 の設定

UFWiptables 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

ubuntuforums.org

コンテナを動かす

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 に関する記事が結構上がってます。

gihyo.jp

コンテナ操作

複数コンテナ同時操作

シェルスクリプトでするしかないかなぁ・・・
第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 を使用する

Minimal - Ubuntu Wiki

上記に書かれていますが、 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>

github.com

ZFS を使ってストレージ作成

もっと簡単に作れました。

qiita.com

sudo truncate -s 【サイズ】 【出力ファイル名】
sudo zpool create 【pool名】 【先程作ったファイル】
lxc storage create 【ストレージ名】 zfs source=【pool名】

ただ、これだけだと再起動時に zpool のほうが自動で import してくれないので、 手動でpoolをimportしてからLXDを再起動する必要があります。

リソース操作

リソースの制御

qiita.com

ネットワーク操作

ネットワーク操作

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