仮想化ツール >

目次

インストール

cake.pnglxcs クックブックを利用する

  • 以下で説明しているセットアップ方法は、筆者が作成した lxcs Chefクックブックの lxcs::lxd レシピで同様に行うことができます。

クイックセットアップ

  • 最も簡単なセットアップは以下のように chef-solo を利用して行うことができます。設定のカスタマイズは lxd ロールの編集によって行います。
$ sudo apt-get install ca-certificates curl git
$ curl -L https://omnitruck.chef.io/install.sh | sudo bash
$ git clone git://git.osdn.net/gitroot/metasearch/grid-chef-repo.git
$ cd grid-chef-repo/
$ chef-solo -c solo.rb -j nodes/local-lxd.json

サンプルロール

  • roles/lxd.rb
    1. name 'lxd'
    2. description 'LXD role.'
    3.  
    4. run_list(
    5.   'recipe[lxcs::lxd]',
    6. )
    7.  
    8. ssh_pub_key = 'ssh-rsa AAAAB3Nz ...'
    9.  
    10. override_attributes(
    11.   'lxcs' => {
    12.     'lxd' => {
    13.       'with_zfs' => true,
    14.       'users_allow' => [
    15.         'alice',
    16.         #'bob',
    17.       ],
    18.       'init' => {
    19.         'enabled' => true,
    20.         'options' => [
    21.           #"--network-address #{node['ipaddress']}",
    22.           #'--network-port 8443',
    23.           #'--storage-backend dir',
    24.           '--storage-backend zfs',
    25.           '--storage-create-loop 20',  # 20GB file
    26.           '--storage-pool lxd',
    27.           # NOT recommended, use 'trust_password_vault_item' attribute.
    28.           #'--trust-password secret',  
    29.         ].join(' '),
    30.       },
    31.       # Ubuntu >= 16.10
    32.       'network' => {
    33.         'lxdbr0' => {
    34.           'config' => {
    35.             'dns.mode' => 'dynamic',
    36.             'ipv4.address' => '10.1.3.1/24',
    37.             'ipv4.dhcp.ranges' => '10.1.3.100-10.1.3.254',
    38.             'ipv4.nat' => 'true',
    39.             'ipv6.address' => 'none',
    40.           },
    41.           'managed' => 'true',
    42.           'type' => 'bridge',
    43.         },
    44.       },
    45.       # Deprecated: Ubuntu <= 16.04
    46.       # use `lxc network set` command on 16.10 (yakkety) or later
    47.       'bridge' => {
    48.         'enabled' => true,
    49.         'conf' => {
    50.           'USE_LXD_BRIDGE' => 'true',
    51.           'LXD_BRIDGE' => 'lxdbr0',
    52.           'UPDATE_PROFILE' => 'true',
    53.           'LXD_CONFILE' => '',
    54.           'LXD_DOMAIN' => 'lxd',
    55.           'LXD_IPV4_ADDR' => '10.1.3.1',
    56.           'LXD_IPV4_NETMASK' => '255.255.255.0',
    57.           'LXD_IPV4_NETWORK' => '10.1.3.1/24',
    58.           'LXD_IPV4_DHCP_RANGE' => '10.1.3.100,10.1.3.254',
    59.           'LXD_IPV4_DHCP_MAX' => '155',
    60.           'LXD_IPV4_NAT' => 'true',
    61.           'LXD_IPV6_ADDR' => '',
    62.           'LXD_IPV6_MASK' => '',
    63.           'LXD_IPV6_NETWORK' => '',
    64.           'LXD_IPV6_NAT' => 'false',
    65.           'LXD_IPV6_PROXY' => 'false',
    66.         },
    67.       },
    68.       'profile' => {
    69.         'default-br0' => {
    70.           'config' => {
    71.             'user.user-data' => <<-"EOS",
    72. #cloud-config
    73. users:
    74.   - name: alice
    75.     groups: sudo,wheel
    76.     ssh-authorized-keys:
    77.       - #{ssh_pub_key}
    78. EOS
    79.           },
    80.           'description' => 'Default LXD profile for real NIC bridged',
    81.           'devices' => {
    82.             'eth0' => {
    83.               'name' => 'eth0',
    84.               'nictype' => 'bridged',
    85.               'parent' => 'br0',
    86.               'type' => 'nic',
    87.             },
    88.           },
    89.         },
    90.         'docker-lxdbr0' => {
    91.           'config' => {
    92.             'linux.kernel_modules' => 'overlay, nf_nat',
    93.             'security.nesting' => 'true',
    94.           },
    95.           'description' => 'Profile supporting docker in containers',
    96.           'devices' => {
    97.             'aadisable' => {
    98.               'path' => '/sys/module/apparmor/parameters/enabled',
    99.               'source' => '/dev/null',
    100.               'type' => 'disk',
    101.             },
    102.             'eth0' => {
    103.               'name' => 'eth0',
    104.               'nictype' => 'bridged',
    105.               'parent' => 'lxdbr0',
    106.               'type' => 'nic',
    107.             },
    108.             'fuse' => {
    109.               'path' => '/dev/fuse',
    110.               'type' => 'unix-char',
    111.             },
    112.           },
    113.         },
    114.       },
    115.     },
    116.   },
    117. )

ubuntu.pngSnappyUbuntuCore

  1. snappy コマンドでインストールします。SnappyUbuntuCoreの場合、LXDの初期設定も完了しています。
    $ sudo snappy install lxd
  2. 初期設定の内容は以下の通りです。ストレージバックエンドは通常のディレクトリで、LXDサーバはネットワークに公開されていないようです。
    1. $ lxc info
    2. apicompat: 0
    3. auth: trusted
    4. environment:
    5.   addresses: []
    6.   architectures:
    7.   - x86_64
    8.   - i686
    9.   certificate: |
    10.     -----BEGIN CERTIFICATE-----
    11.     MIIGATCCA+mgAwIBAgIQH+VJmjNOcp1DMx87NmYOTDANBgkqhkiG9w0BAQsFADBD
    12.     ...
    13.     -----END CERTIFICATE-----
    14.   driver: lxc
    15.   driverversion: 2.0.0
    16.   kernel: Linux
    17.   kernelarchitecture: x86_64
    18.   kernelversion: 3.19.0-51-generic
    19.   server: lxd
    20.   serverpid: 957
    21.   serverversion: 2.0.0
    22.   storage: dir
    23.   storageversion: ""
    24. config: {}
    25. public: false

ubuntu.png通常のUbuntu(デスクトップ、サーバ)

  1. apt-get コマンドでインストールします。
    $ sudo apt-get install lxd lxd-client
  2. ストレージバックエンドとしてベターなZFSを使用する場合には、以下のパッケージもインストールします。ubuntu.pngUbuntu 16.04からzfsカーネルモジュールが標準で含まれています。
    $ sudo apt-get install zfsutils-linux
  3. 初期設定を行います。
    1. 以下の例ではストレージバックエンドにZFSのブロックデバイスを使い、LXDをネットワークに公開しています。
      1. $ sudo lxd init
      2. Name of the storage backend to use (dir or zfs): zfs
      3. Create a new ZFS pool (yes/no)? yes
      4. Name of the new ZFS pool: lxd
      5. Would you like to use an existing block device (yes/no)? yes
      6. Path to the existing block device: /dev/sdb1
      7. Would you like LXD to be available over the network (yes/no)? yes
      8. Address to bind LXD to (not including port): 192.168.56.99
      9. Port to bind LXD to (8443 recommended): 8443
      10. Trust password for new clients:
      11. Again:
      12. Do you want to configure the LXD bridge (yes/no)? yes
    2. ここから先はブリッジ設定の別のウィザードになります。設定初期値はランダムなIPアドレスになっていますので、既存のサブネットと衝突しないように適宜変更します。以下の例では、LXCのデフォルト設定(10.0.3.1/24)との衝突を避けています。
      1. Would you like to setup a network bridge for LXD containers now? yes
      2. Bridge interface name: lxdbr0
      3. Do you want to setup an IPv4 subnet? yes
      4. IPv4 address: 10.0.13.1
      5. IPv4 CIDR mask: 24
      6. First DHCP address: 10.0.13.100
      7. Last DHCP address: 10.0.13.254
      8. Max number of DHCP clients: 155
      9. Do you want to NAT the IPv4 traffic? yes
      10. Do you want to setup an IPv6 subnet? no
    3. 以下のメッセージ表示で初期化が完了します。
      1. Warning: Stopping lxd.service, but it can still be activated by:
      2.   lxd.socket
      3. LXD has been successfully configured.
  4. 初期化の結果を確認します。
    1. $ lxc info
    2. apicompat: 0
    3. auth: trusted
    4. environment:
    5.   addresses:
    6.   - 192.168.56.99:8443
    7.   architectures:
    8.   - x86_64
    9.   - i686
    10.   certificate: |
    11.     -----BEGIN CERTIFICATE-----
    12.     MIIF5jCCA86gAwIBAgIRAMzzVTKxAzRurnQgc+4NjycwDQYJKoZIhvcNAQELBQAw
    13.     ...
    14.     -----END CERTIFICATE-----
    15.   driver: lxc
    16.   driverversion: 2.0.1
    17.   kernel: Linux
    18.   kernelarchitecture: x86_64
    19.   kernelversion: 4.4.0-24-generic
    20.   server: lxd
    21.   serverpid: 16366
    22.   serverversion: 2.0.2
    23.   storage: zfs
    24.   storageversion: "5"
    25. config:
    26.   core.https_address: 192.168.56.99:8443
    27.   core.trust_password: true
    28.   storage.zfs_pool_name: lxd
    29. public: false

14.04 LTS (trusty)

  • trusty-backports で提供されていますので、それを利用します。
  1. Kernelを16.04と同じものにアップデートします。
    $ sudo apt-get install linux-image-generic-lts-xenial linux-image-extra-virtual-lts-xenial
    $ sudo reboot
  2. trusty-backports を指定してlxdパッケージをインストールします。
    $ sudo apt-get install -t trusty-backports lxd
  3. 以降のセットアップ手順は、16.04の場合と同様です(上記参照)。

再設定

  1. コンテナとイメージが残存していなければ、初期化(lxd init)を再実行できます。

バージョン毎の注意点

ubuntu.png16.10 (yakkety)

  • ブリッジインタフェイスのセットアップ。lxd init のみを利用している限り違いを意識することはありませんが、ブリッジインタフェイスのセットアップが dpkg-reconfigure から lxc network コマンドに変更になりました。
    1. 16.10以降:
      $ lxc network -h
      Usage: Manage networks.
      
      lxc network list                               List available networks.
      lxc network show <network>                     Show details of a network.
      lxc network create <network> [key=value]...    Create a network.
      lxc network get <network> <key>                Get network configuration.
      lxc network set <network> <key> <value>        Set network configuration.
      lxc network unset <network> <key>              Unset network configuration.
      lxc network delete <network>                   Delete a network.
      lxc network edit <network>
          Edit network, either by launching external editor or reading STDIN.
          Example: lxc network edit <network> # launch editor
                   cat network.yml | lxc network edit <network> # read from network.yml
      
      lxc network attach <network> <container> [device name]
      lxc network attach-profile <network> <profile> [device name]
      
      lxc network detach <network> <container> [device name]
      lxc network detach-profile <network> <container> [device name]
      
      Options:
      
          --debug  (= false)
              Enables debug mode.
          --force-local  (= false)
              Force using the local unix socket.
          --no-alias  (= false)
              Ignore aliases when determining what command to run.
          --verbose  (= false)
              Enables verbose mode.
    2. 16.04以前: 設定結果は、/etc/default/lxd-bridge に書き出されます。あまり推奨されませんが、この設定ファイルを直接編集し、lxd-bridgeサービスを再起動させても構いません。
      $ sudo dpkg-reconfigure -p medium lxd
      ...
  • アップグレード後のコンテナ起動エラー
    1. 16.04以前で作成したコンテナが以下のエラーにより起動に失敗します。
      $ lxc start xenial00
      error: Bad key: volatile.idmap.base
      Try `lxc info --show-log xenial00` for more info
    2. lxc config edit コマンドで古いキーを削除してから起動させます。古いキーが複数ある場合がありますので、unset ではなく edit コマンドを使い一括して削除します。筆者の環境では、volatile.idmap.basevolatile.idmap.next が不要でした。
      $ lxc config edit xenial00

利用方法

ひとめぐり

  1. ローカルユーザはUNIXソケット経由でLXDと通信しますので、あらかじめ lxd グループに追加しておく必要があります。現在のシェルですぐに使い始めたい場合には、グループ追加後に以下のコマンドを実行します。
    $ newgrp lxd
  2. Ubuntuではデフォルトで以下のリモートイメージサーバが登録されています。
    $ lxc remote list
    +-----------------+------------------------------------------+---------------+--------+--------+
    |      NAME       |                   URL                    |   PROTOCOL    | PUBLIC | STATIC |
    +-----------------+------------------------------------------+---------------+--------+--------+
    | images          | https://images.linuxcontainers.org       | lxd           | YES    | NO     |
    +-----------------+------------------------------------------+---------------+--------+--------+
    | local (default) | unix://                                  | lxd           | NO     | YES    |
    +-----------------+------------------------------------------+---------------+--------+--------+
    | ubuntu          | https://cloud-images.ubuntu.com/releases | simplestreams | YES    | YES    |
    +-----------------+------------------------------------------+---------------+--------+--------+
    | ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | simplestreams | YES    | YES    |
    +-----------------+------------------------------------------+---------------+--------+--------+
  3. imagesサーバ上のイメージをリストしてみます。
    $ lxc image list images: | head
    +---------------------------------+--------------+--------+-------------------------------------------+---------+----------+------------------------------+
    |              ALIAS              | FINGERPRINT  | PUBLIC |                DESCRIPTION                |  ARCH   |   SIZE   |         UPLOAD DATE          |
    +---------------------------------+--------------+--------+-------------------------------------------+---------+----------+------------------------------+
    | alpine/3.0/amd64 (1 more)       | 850b792748af | yes    | Alpine 3.0 (amd64) (20160608_18:03)       | x86_64  | 2.09MB   | Jun 8, 2016 at 6:15pm (UTC)  |
    +---------------------------------+--------------+--------+-------------------------------------------+---------+----------+------------------------------+
    | alpine/3.0/i386 (1 more)        | 2f52b23c9540 | yes    | Alpine 3.0 (i386) (20160608_17:50)        | i686    | 2.06MB   | Jun 8, 2016 at 6:15pm (UTC)  |
    +---------------------------------+--------------+--------+-------------------------------------------+---------+----------+------------------------------+
    | alpine/3.1/amd64 (1 more)       | 0977fe56e366 | yes    | Alpine 3.1 (amd64) (20160608_17:50)       | x86_64  | 2.32MB   | Jun 8, 2016 at 6:15pm (UTC)  |
    +---------------------------------+--------------+--------+-------------------------------------------+---------+----------+------------------------------+
    | alpine/3.1/i386 (1 more)        | 6fb50b272f54 | yes    | Alpine 3.1 (i386) (20160608_18:03)        | i686    | 2.26MB   | Jun 8, 2016 at 6:15pm (UTC)  |
  4. Ubuntuの最新安定版をシステムコンテナとして作成し、起動させてみます。
    $ lxc launch ubuntu:16.04 my-xenial
    Creating my-xenial
    Retrieving image: 100%
    Starting my-xenial
    
    $ lxc list
    +-----------+---------+-------------------+------+------------+-----------+
    |   NAME    |  STATE  |       IPV4        | IPV6 |    TYPE    | SNAPSHOTS |
    +-----------+---------+-------------------+------+------------+-----------+
    | my-xenial | RUNNING | 10.0.3.254 (eth0) |      | PERSISTENT | 0         |
    +-----------+---------+-------------------+------+------------+-----------+
  5. コンテナの中でBashを実行してみます。
    $ lxc exec my-xenial -- /bin/bash
    root@my-xenial:~# uname -a
    Linux my-xenial 3.19.0-51-generic #57-Ubuntu SMP Fri Feb 19 14:05:05 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    root@my-xenial:~# exit
    exit
  6. 直接システムコンテナを更新してみます。
    $ lxc exec my-xenial -- apt-get update
    ...
    
    $ lxc exec my-xenial -- apt-get upgrade
    ...
    53 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
    Need to get 22.4 MB of archives.
    After this operation, 45.1 kB of additional disk space will be used.
    Do you want to continue? [Y/n]
    ...
    
    $ lxc stop my-xenial
    
    $ lxc list
    +-----------+---------+------+------+------------+-----------+
    |   NAME    |  STATE  | IPV4 | IPV6 |    TYPE    | SNAPSHOTS |
    +-----------+---------+------+------+------------+-----------+
    | my-xenial | STOPPED |      |      | PERSISTENT | 0         |
    +-----------+---------+------+------+------------+-----------+
    
    $ lxc start my-xenial
    
    $ lxc exec my-xenial -- apt-get update
    ...
    
    $ lxc exec my-xenial -- apt-get upgrade
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    Calculating upgrade... Done
    0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
  7. コンテナ内のrootは、ホストのrootと分離されていることが分かります。
    $ ps -fe | grep lxc
    nobody     951     1  0 11:05 ?        00:00:00 dnsmasq -u nobody --strict-order --bind-interfaces --pid-file=/var/lib/apps/lxd/2.0.0-2/dnsmasq.pid
     --listen-address 10.0.3.1 --dhcp-range 10.0.3.2,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0
     --dhcp-authoritative --dhcp-leasefile=/var/lib/apps/lxd/2.0.0-2/dnsmasq.lxcbr0.leases
    root       954   885  0 11:05 ?        00:00:13 /apps/lxd/2.0.0-2/bin/x86_64/lxcfs/lxcfs /var/lib/apps/lxd/2.0.0-2/lxcfs
    root     21348     1  0 11:35 ?        00:00:00 [lxc monitor] /var/lib/apps/lxd/2.0.0-2/lxd/containers my-xenial
    
    $ ps -fe | grep 21348
    root     21348     1  0 11:35 ?        00:00:00 [lxc monitor] /var/lib/apps/lxd/2.0.0-2/lxd/containers my-xenial
    1000000  21365 21348  0 11:35 ?        00:00:00 /sbin/init
    
    $ ps -fe | grep 1000000
    1000000  21365 21348  0 11:35 ?        00:00:00 /sbin/init
    1000000  21672 21365  0 11:35 ?        00:00:00 /lib/systemd/systemd-udevd
    1000000  21687 21365  0 11:35 ?        00:00:00 /lib/systemd/systemd-journald
    1000000  21944 21365  0 11:35 ?        00:00:00 /usr/sbin/cron -f
    1000000  21974 21365  0 11:35 ?        00:00:00 /lib/systemd/systemd-logind
    1000000  22031 21365  0 11:35 ?        00:00:00 /usr/lib/accountsservice/accounts-daemon
    1000000  22087 21365  0 11:35 ?        00:00:00 /usr/lib/policykit-1/polkitd --no-debug
    1000000  22257 21365  0 11:35 ?        00:00:00 /sbin/dhclient -1 -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I
     -df /var/lib/dhcp/dhclient6.eth0.leases eth0
    1000000  22369 21365  0 11:35 ?        00:00:00 /usr/sbin/sshd -D
    1000000  22576 21365  0 11:35 pts/1    00:00:00 /sbin/agetty --noclear --keep-baud console 115200 38400 9600 linux
  8. 追加でCentOS 7のシステムコンテナを作成し、起動させてみます。
    $ lxc launch images:centos/7/amd64 my-centos7
    Creating my-centos7
    Retrieving image: 100%
    Starting my-centos7
    
    $ lxc list
    +------------+---------+-------------------+------+------------+-----------+
    |    NAME    |  STATE  |       IPV4        | IPV6 |    TYPE    | SNAPSHOTS |
    +------------+---------+-------------------+------+------------+-----------+
    | my-centos7 | RUNNING | 10.0.3.90 (eth0)  |      | PERSISTENT | 0         |
    +------------+---------+-------------------+------+------------+-----------+
    | my-xenial  | RUNNING | 10.0.3.254 (eth0) |      | PERSISTENT | 0         |
    +------------+---------+-------------------+------+------------+-----------+
  9. 当然ながら、Linuxカーネルはホストのものですが、システムはCentOSであることが分かります。
    $ lxc exec my-centos7 -- /bin/bash
    [root@my-centos7 ~]# uname -a
    Linux my-centos7 3.19.0-51-generic #57-Ubuntu SMP Fri Feb 19 14:05:05 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    
    [root@my-centos7 ~]# cat /etc/os-release
    NAME="CentOS Linux"
    VERSION="7 (Core)"
    ID="centos"
    ID_LIKE="rhel fedora"
    VERSION_ID="7"
    PRETTY_NAME="CentOS Linux 7 (Core)"
    ANSI_COLOR="0;31"
    CPE_NAME="cpe:/o:centos:centos:7"
    HOME_URL="https://www.centos.org/"
    BUG_REPORT_URL="https://bugs.centos.org/"
    
    CENTOS_MANTISBT_PROJECT="CentOS-7"
    CENTOS_MANTISBT_PROJECT_VERSION="7"
    REDHAT_SUPPORT_PRODUCT="centos"
    REDHAT_SUPPORT_PRODUCT_VERSION="7"

非永続コンテナ

  1. デフォルトでは作成したコンテナは(停止させても)永続化されますが、-e, --ephemeral オプションを追加すると使い捨てのコンテナを起動させることができます。
    $ lxc launch ubuntu:16.04 xenial-1time -e
    ...
    $ lxc list
    +--------------+---------+--------------------+------+------------+-----------+
    |     NAME     |  STATE  |        IPV4        | IPV6 |    TYPE    | SNAPSHOTS |
    +--------------+---------+--------------------+------+------------+-----------+
    | xenial-1time | RUNNING | 10.0.13.187 (eth0) |      | EPHEMERAL  | 0         |
    +--------------+---------+--------------------+------+------------+-----------+
    | xenial00     | RUNNING | 10.0.13.133 (eth0) |      | PERSISTENT | 0         |
    +--------------+---------+--------------------+------+------------+-----------+
  2. コンテナを停止させると、同時に削除されていることが分かります。ちなみに、コンテナ内のシステムをシャットダウンするとコンテナも終了しますので削除されますが、システムの再起動はそのまま可能です。
    $ lxc stop xenial-1time
    $ lxc list
    +----------+---------+--------------------+------+------------+-----------+
    |   NAME   |  STATE  |        IPV4        | IPV6 |    TYPE    | SNAPSHOTS |
    +----------+---------+--------------------+------+------------+-----------+
    | xenial00 | RUNNING | 10.0.13.133 (eth0) |      | PERSISTENT | 0         |
    +----------+---------+--------------------+------+------------+-----------+

ZFSストレージバックエンド

  1. ストレージバックエンドをZFSに設定する方法は上記の通りですが、ZFSプールの状態は以下のように確認できます。
    $ sudo zpool list
    NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
    lxd   15.9G   752M  15.1G         -     3%     4%  1.00x  ONLINE  -
    
    $ sudo zpool status
      pool: lxd
     state: ONLINE
      scan: none requested
    config:
    
            NAME        STATE     READ WRITE CKSUM
            lxd         ONLINE       0     0     0
              sdb1      ONLINE       0     0     0
    
    errors: No known data errors

ZFSプールの破棄

  1. イメージやコンテナが存在しなければZFSプールを破棄して再セットアップすることができます。
    $ sudo zpool status -v lxd
      pool: lxd
     state: ONLINE
      scan: none requested
    config:
    
    	NAME        STATE     READ WRITE CKSUM
    	lxd         ONLINE       0     0     0
    	  sda6      ONLINE       0     0     0
    
    errors: No known data errors
    $ sudo zpool destroy lxd

ローカルイメージを使う

  1. 一度ダウンロードしたイメージはローカルストレージに保存されます。
    $ lxc image list local:
    +-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
    | ALIAS | FINGERPRINT  | PUBLIC |                 DESCRIPTION                 |  ARCH  |   SIZE   |         UPLOAD DATE          |
    +-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
    |       | fa935b47f205 | no     | Centos 7 (amd64) (20160614_02:16)           | x86_64 | 62.95MB  | Jun 14, 2016 at 4:56am (UTC) |
    +-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
    |       | 4b747164eaff | no     | Debian jessie (amd64) (20160613_22:42)      | x86_64 | 104.10MB | Jun 14, 2016 at 5:06am (UTC) |
    +-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
    |       | 98dc4bd7cca2 | no     | ubuntu 16.04 LTS amd64 (release) (20160610) | x86_64 | 139.21MB | Jun 14, 2016 at 3:07am (UTC) |
    +-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
  2. 以降、同じバージョンのシステムコンテナを起動させる場合には、このローカルイメージを用いて高速に起動させることが可能です。
    $ for i in $(seq 1 5); do time lxc launch 98dc4bd7cca2 -e; done
    Creating southern-cari
    Starting southern-cari
    
    real	0m7.903s
    user	0m0.008s
    sys	0m0.004s
    Creating unbigoted-danelle
    Starting unbigoted-danelle
    
    real	0m5.145s
    user	0m0.008s
    sys	0m0.000s
    Creating selenographical-yuri
    Starting selenographical-yuri
    
    real	0m4.255s
    user	0m0.008s
    sys	0m0.000s
    Creating radiographical-marlo
    Starting radiographical-marlo
    
    real	0m5.691s
    user	0m0.008s
    sys	0m0.000s
    Creating nonprojecting-altagracia
    Starting nonprojecting-altagracia
    
    real	0m4.979s
    user	0m0.008s
    sys	0m0.000s
    
    $ lxc list
    +--------------------------+---------+-------------------+------+------------+-----------+
    |           NAME           |  STATE  |       IPV4        | IPV6 |    TYPE    | SNAPSHOTS |
    +--------------------------+---------+-------------------+------+------------+-----------+
    | centos00                 | STOPPED |                   |      | PERSISTENT | 0         |
    +--------------------------+---------+-------------------+------+------------+-----------+
    | deb00                    | STOPPED |                   |      | PERSISTENT | 0         |
    +--------------------------+---------+-------------------+------+------------+-----------+
    | nonprojecting-altagracia | RUNNING | 10.1.3.181 (eth0) |      | EPHEMERAL  | 0         |
    +--------------------------+---------+-------------------+------+------------+-----------+
    | radiographical-marlo     | RUNNING | 10.1.3.119 (eth0) |      | EPHEMERAL  | 0         |
    +--------------------------+---------+-------------------+------+------------+-----------+
    | selenographical-yuri     | RUNNING | 10.1.3.200 (eth0) |      | EPHEMERAL  | 0         |
    +--------------------------+---------+-------------------+------+------------+-----------+
    | southern-cari            | RUNNING | 10.1.3.104 (eth0) |      | EPHEMERAL  | 0         |
    +--------------------------+---------+-------------------+------+------------+-----------+
    | unbigoted-danelle        | RUNNING | 10.1.3.190 (eth0) |      | EPHEMERAL  | 0         |
    +--------------------------+---------+-------------------+------+------------+-----------+
    | xenial00                 | STOPPED |                   |      | PERSISTENT | 0         |
    +--------------------------+---------+-------------------+------+------------+-----------+

ホストの属するネットワークに参加させる(ブリッジ)

  1. bridge-utils パッケージがインストールされていることをあらかじめ確認しておきます。
  2. 以下の要領でブリッジインタフェイス(br*)を定義し、物理インタフェイス(eth*、p3p1等)にブリッジします。
    • /etc/netplan/01-netcfg.yaml(18.04以前): netplan がデフォルト設定ツールになっています。設定ファイル名は任意です。netplan apply コマンドで設定を反映させます。
      1. network:
      2.   version: 2
      3.   renderer: networkd
      4.   ethernets:
      5.     eth0:
      6.       dhcp4: no
      7.       dhcp6: no
      8.   bridges:
      9.     br0:
      10.       interfaces:
      11.       - eth0
      12.       dhcp4: no
      13.       dhcp6: no
      14.       addresses:
      15.       - 192.168.0.123/24
      16.       gateway4: 192.168.0.1
      17.       nameservers:
      18.         addresses:
      19.         - 192.168.0.53
      20.       parameters:
      21.         forward-delay: 0
      22.         stp: no
      23.       optional: yes
    • /etc/network/interfaces(17.10以前): ifupコマンドやOSの再起動によりインタフェイスを有効にします。なお、最近のUbuntuでは、NetworkManager?が起動していても自動でこれらの静的設定を避け、干渉することはありません。
      1. auto lo
      2. iface lo inet loopback
      3.  
      4. auto br0
      5. iface br0 inet static
      6.         address 192.168.0.123
      7.         netmask 255.255.255.0
      8.         gateway 192.168.0.1
      9.         bridge_ports eth0
      10.         bridge_stp off
  3. このブリッジを利用するLXDプロファイルを用意します。
    $ lxc profile list
    default
    docker
    $ lxc profile copy default{,-br0}
    $ lxc profile edit default-br0
    1. default-br0プロファイルの内容
      1. name: default-br0
      2. config: {}
      3. description: Default LXD profile for real NIC bridged
      4. devices:
      5.   eth0:
      6.     name: eth0
      7.     nictype: bridged
      8.     parent: br0
      9.     type: nic
  4. コンテナ作成時に、このプロファイルを指定します。
    $ lxc launch ubuntu:16.04 xenial00-br0 -p default-br0
    Creating xenial00-br0
    Starting xenial00-br0
    $ lxc list
    +--------------+---------+----------------------+------+------------+-----------+
    |     NAME     |  STATE  |         IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
    +--------------+---------+----------------------+------+------------+-----------+
    | xenial00     | RUNNING | 10.0.4.221 (eth0)    |      | PERSISTENT | 0         |
    +--------------+---------+----------------------+------+------------+-----------+
    | xenial00-br0 | RUNNING | 192.168.0.223 (eth0) |      | PERSISTENT | 0         |
    +--------------+---------+----------------------+------+------------+-----------+
    • ブリッジの状態を確認してみます。
      $ sudo brctl show
      bridge name     bridge id               STP enabled     interfaces
      br0             8000.d43d7e965021       no              eth0
                                                              vethOJNDRI
      lxcbr0          8000.000000000000       no
      lxdbr0          8000.fe3e93831af4       no              vethSKH6BO

リモートLXDのコンテナを操作する

  • LXDはネットワークに公開することができ、リモートからlxcコマンドやREST API経由で操作することが可能です。

LXDの設定

  1. lxd init で設定が完了しているかもしれませんが、そうでない場合には以下のコマンドでリスンするアドレスと管理パスワードを設定します。
    $ sudo lxc config set core.https_address "[::]"                # すべてのネットワークインタフェイス
     or
    $ sudo lxc config set core.https_address "192.168.56.99:8443"  # 特定のアドレス、ポートの例
    $ sudo lxc config set core.trust_password some-password

ワークステーション(LXDクライアント)からの操作

  1. ワークステーション上でリモートのLXDを追加登録します。表示の通り、サーバのフィンガープリントを確認の上、初回は管理パスワードの入力によりクライアントが認証され、リモートLXDにはそのクライアント証明書が登録されます。
    ubuntu@lxd-ws:~$ lxc remote add lxd99 192.168.56.99
    Generating a client certificate. This may take a minute...
    If this is your first time using LXD, you should also run: sudo lxd init
    
    Certificate fingerprint: 62f3016b553e8cd69910448ed3d306d2dfd5 ...
    ok (y/n)? y
    Admin password for lxd99:
    Client certificate stored at server:  lxd99
  2. リモートサーバ一覧を確認します。
    1. ubuntu@lxd-ws:~$ lxc remote list
    2. +-----------------+------------------------------------------+---------------+--------+--------+
    3. |      NAME       |                   URL                    |   PROTOCOL    | PUBLIC | STATIC |
    4. +-----------------+------------------------------------------+---------------+--------+--------+
    5. | images          | https://images.linuxcontainers.org       | lxd           | YES    | NO     |
    6. +-----------------+------------------------------------------+---------------+--------+--------+
    7. | local (default) | unix://                                  | lxd           | NO     | YES    |
    8. +-----------------+------------------------------------------+---------------+--------+--------+
    9. | lxd99           | https://192.168.56.99:8443               | lxd           | NO     | NO     |
    10. +-----------------+------------------------------------------+---------------+--------+--------+
    11. | ubuntu          | https://cloud-images.ubuntu.com/releases | simplestreams | YES    | YES    |
    12. +-----------------+------------------------------------------+---------------+--------+--------+
    13. | ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | simplestreams | YES    | YES    |
    14. +-----------------+------------------------------------------+---------------+--------+--------+
  3. リモートのコンテナを操作してみます。
    ubuntu@lxd-ws:~$ lxc exec lxd99:xenial00 -- /bin/bash
    error: Container is not running.
    
    ubuntu@lxd-ws:~$ lxc list lxd99:
    +----------+---------+--------------------+------+------------+-----------+
    |   NAME   |  STATE  |        IPV4        | IPV6 |    TYPE    | SNAPSHOTS |
    +----------+---------+--------------------+------+------------+-----------+
    | xenial00 | STOPPED |                    |      | PERSISTENT | 0         |
    +----------+---------+--------------------+------+------------+-----------+
    
    ubuntu@lxd-ws:~$ lxc start lxd99:xenial00
    
    ubuntu@lxd-ws:~$ lxc exec lxd99:xenial00 -- /bin/bash
    root@xenial00:~#

cloud-initによるノードの初期設定

  • Ubuntuのイメージは cloud-init に対応していますので、コンテナの起動と同時に自動でノードの初期設定を行うことができます。ただし、CentOSなど cloud-init に対応していない他のイメージでは無効です。
  1. 以下のようにコンテナプロファイルに、cloud-init.yml の内容を追加しておくと便利です。
    1. $ lxc profile show default
    2. name: default
    3. config:
    4.   user.user-data: |
    5.     #cloud-config
    6.     users:
    7.       - name: alice
    8.         groups: sudo,wheel
    9.         ssh-authorized-keys:
    10.           - ssh-rsa AAAAB3NzaC1yc2E ... == alice@wonderland.example.com
    11. description: Default LXD profile
    12. devices:
    13.   eth0:
    14.     name: eth0
    15.     nictype: bridged
    16.     parent: lxdbr0
    17.     type: nic
    18. usedby:

LXDとcloud-init

  • 詳しくは、こちらをご参照ください。

コンテナのネスト(LXD in LXD)

  1. まずクリーンに最初の(親)システムコンテナを作成し、最新に更新しておきます。note.png追加設定オプションで security.nesting を有効にしておきます。
    (amd64)ubuntu@snappy00:~$ lxc delete xenial00
    (amd64)ubuntu@snappy00:~$ lxc launch ubuntu:16.04 xenial00 -c security.nesting=true
    Creating xenial00
    Starting xenial00
    (amd64)ubuntu@snappy00:~$ lxc exec xenial00 -- /bin/bash
    root@xenial00:~# apt-get update
    ...
    root@xenial00:~# apt-get upgrade
    ...
    • lightbulb.png既存コンテナの security.nesting を有効にする場合には、以下のようにします。
      $ lxc config set xenial00 security.nesting true
  2. もしシステムコンテナにLXDがインストールされていない場合にはインストールします。
    root@xenial00:~# apt-get install lxd  lxd-client
    ...
  3. LXDの初期設定を行います。
    1. 通常のストレージバックエンドはZFSを選択するのがベターですが、すでにコンテナ内でZFS用にカーネルモジュールを新たにロードすることができませんので単純なディレクトリを選択しています。テストなので、以下の例ではLXDはネットワークに公開していません。
      1. root@xenial00:~# lxd init
      2. Name of the storage backend to use (dir or zfs): dir
      3.  
      4. We detected that you are running inside an unprivileged container.
      5. This means that unless you manually configured your host otherwise,
      6. you will not have enough uid and gid to allocate to your containers.
      7.  
      8. LXD can re-use your container's own allocation to avoid the problem.
      9. Doing so makes your nested containers slightly less safe as they could
      10. in theory attack their parent container and gain more privileges than
      11. they otherwise would.
      12.  
      13. Would you like to have your containers share their parent's allocation (yes/no)? yes
      14. Would you like LXD to be available over the network (yes/no)? no
      15. Do you want to configure the LXD bridge (yes/no)? yes
      1. note.pnguidとgidのアロケーションを親のそれと共有しない場合、以下のようなエラーが発生します。
        root@xenial00:~# lxc launch ubuntu:16.04 xenial10
        Creating xenial10
        Retrieving image: 100%
        error: Failed to change ownership of: /var/lib/lxd/containers/xenial10/rootfs
    2. ここから先はブリッジ設定の別のウィザードになります。設定初期値はランダムなIPアドレスになっていますので、既存のサブネットと衝突しないように適宜変更します。
      1. Would you like to setup a network bridge for LXD containers now? yes
      2. Bridge interface name: lxdbr0
      3. Do you want to setup an IPv4 subnet? yes
      4. IPv4 address: 10.0.4.1
      5. IPv4 CIDR mask: 24
      6. First DHCP address: 10.0.4.100
      7. Last DHCP address: 10.0.4.254
      8. Max number of DHCP clients: 155
      9. Do you want to NAT the IPv4 traffic? yes
      10. Do you want to setup an IPv6 subnet? no
    3. 以下のメッセージ表示で初期化が完了します。
      1. Warning: Stopping lxd.service, but it can still be activated by:
      2.   lxd.socket
      3. LXD has been successfully configured.
  4. 折角なので非特権ユーザになって、ネストされた(子)システムコンテナを作成します。
    root@xenial00:~# su ubuntu
    To run a command as administrator (user "root"), use "sudo <command>".
    See "man sudo_root" for details.
    
    ubuntu@xenial00:/root$ lxc launch ubuntu:16.04 xenial10
    Generating a client certificate. This may take a minute...
    If this is your first time using LXD, you should also run: sudo lxd init
    To start your first container, try: lxc launch ubuntu:16.04
    
    Creating xenial10
    Retrieving image: 100%
    Starting xenial10
    ubuntu@xenial00:/root$ lxc list
    +----------+---------+-------------------+------+------------+-----------+
    |   NAME   |  STATE  |       IPV4        | IPV6 |    TYPE    | SNAPSHOTS |
    +----------+---------+-------------------+------+------------+-----------+
    | xenial10 | RUNNING | 10.0.4.205 (eth0) |      | PERSISTENT | 0         |
    +----------+---------+-------------------+------+------------+-----------+
  5. 問題ないようです。コンテナの仕組上、パフォーマンスの劣化もありません。
    ubuntu@xenial00:/root$ lxc exec xenial10 -- /bin/bash
    root@xenial10:~# apt-get update
    ...
    root@xenial10:~# apt-get upgrade
    ...
  6. もう一段ネストしても動作に遜色ありません。
    root@xenial10:~# lxd init
    ...
    root@xenial10:~# su ubuntu
    To run a command as administrator (user "root"), use "sudo <command>".
    See "man sudo_root" for details.
    
    ubuntu@xenial10:/root$ lxc launch ubuntu:16.04 xenial20
    Generating a client certificate. This may take a minute...
    If this is your first time using LXD, you should also run: sudo lxd init
    To start your first container, try: lxc launch ubuntu:16.04
    
    Creating xenial20
    Retrieving image: 100%
    Starting xenial20
    ubuntu@xenial10:/root$ lxc list
    +----------+---------+-------------------+------+------------+-----------+
    |   NAME   |  STATE  |       IPV4        | IPV6 |    TYPE    | SNAPSHOTS |
    +----------+---------+-------------------+------+------------+-----------+
    | xenial20 | RUNNING | 10.0.5.131 (eth0) |      | PERSISTENT | 0         |
    +----------+---------+-------------------+------+------------+-----------+
    ubuntu@xenial10:/root$ lxc exec xenial20 -- /bin/bash
    root@xenial20:~#

DockerInLXD

リソース


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-10-03 (水) 22:46:45 (67d)