Ubuntu 16.04でLXDを設定するための段階的な手順

このマニュアルには、LXDをインストールおよび構成するための段階的なアルゴリズムが含まれています。 この手順では、次のトピックについて説明します。







-コンテナのインストールと起動。

-ネットワークのセットアップ。

-コンテナの静的IPアドレスを構成します。

-NATおよびIptablesを構成します。

-バックアップの作成とそれらからの復元。

-Dockerの特徴的な機能。







はじめに



LXDは、LXCに基づいたコンテナハイパーバイザーです[1]。 LXCとの主な違いは、LXDがコンテナイメージの概念を導入し、これら2つの概念に基づいてインフラストラクチャを構築することです。







簡単に言えば、LXDは仮想OS用のDockerです。 原則は同じです。リポジトリからOSイメージをダウンロードし、ホストとしてコンテナとしてインスタンスを展開できます。 1つのイメージを複数の仮想マシンに「クローン」できます。







Dockerとの違い:







  1. Dockerはアプリケーションの仮想化であり、LXDはオペレーティングシステムの仮想化です。
  2. コンテナが起動すると、完全なLinux環境が起動します。スクリプトは、init.dおよびインストールされているさまざまなサービス(mysql、apache、nginx、cronなど)で起動されます。
  3. コンテナの静的IPアドレスを設定することが可能です。
  4. コンテナを起動した後、コンテナの構成を変更できます(フォルダを「転送」するなど)。
  5. exit



    を使用してコンテナを終了すると、作業が続行されます。
  6. ホストマシンからコンテナファイルシステムに直接アクセスできます。 コンテナのルートシステムは、 /var/lib/lxd/containers/< >/rootfs



    フォルダに/var/lib/lxd/containers/< >/rootfs



  7. デフォルトでは、LXDサービスはUNIXソケットを介して機能しますが、外部ネットワークで開いて画像を配布できます。 つまり、画像を使用して個人用サーバーを作成できます。


LXDのその他の機能:







  1. nova-lxdプラグインを介してOpenStackと統合できます。
  2. コンテナのスリープモード(休止状態)の可能性があります。
  3. コンテナ管理API [4]があります。
  4. LXD内でDockerを実行できます[5]。


LXDをインストールする



現在、LXDはUbuntu 16.04 LTSで正常に動作します。 他のシステムで実行することもできますが、問題がある場合や、正常に機能しない場合があります。 たとえば、Centos 7では、コンテナは特権モードでのみ実行され、既製のlxdアセンブリはないため、手動でコンパイルする必要があります。







新しいUbuntuバージョンでは、デフォルトでlxdはすでに統合されています。 インストールされていない場合は、次のように配置できます。







 aptitude install lxd
      
      





LXDを構成する



システムを更新し、作業に必要なパッケージをインストールします。







 aptitude update aptitude upgrade aptitude install lxd zfs zfsutils-linux
      
      





LXDを初期化する



コンテナの使用を開始する前に、LXDの初期化を行う必要があります。







初期化を行う前に、使用するバックエンドストレージを決定する必要があります。 バックエンドストレージ-これは、すべてのコンテナとイメージが配置される場所です。 ストレージには、ZFSとDirの2つの主なタイプがあります。









ZFSはループデバイスとしてファイルにマウントされるため、ストレージのサイズを監視し、十分な空きがない場合はスペースを増やす必要があります。 プライベートリモートイメージストレージがある場合は、ZFSを使用して、コンテナーのスナップショットをバックアップとして時々送信し、そこからダウンロードして、新しいバージョンをインストールしたり、バックアップからコンテナーを復元したりするのは理にかなっています。







運用サーバーにDirをインストールすることにしました。 LANでZFSをテストします。 通常のスクリプトを使用してバックアップを作成します-それらをtarにパックし、Amazon S3に送信します。







使用するバックエンドストレージを決定したら、初期化プロセスを開始します。 これは次のコマンドで実行されます。







 lxd init
      
      





ユーティリティは、答える必要がある質問をします。 ユーティリティは最初の質問をします:使用するストレージの種類は?







 Name of the storage backend to use (dir or zfs): dir
      
      





答えがDirの場合、ユーティリティはすぐにネットワークの構成に進みます。 答えがZFSの場合、システムは次の質問をします。







 Create a new ZFS pool (yes/no)? yes Name of the new ZFS pool: lxd Would you like to use an existing block device (yes/no)? no Size in GB of the new loop device (1GB minimum): 10
      
      





「新しいループデバイスのサイズ(GB単位)」は、ZFSストレージのサイズです。 すべての画像とコンテナはこのストレージに保存されるため、多くの画像やコンテナを保存する場合は、この数を増やす必要があります。







次に、ユーティリティは「外部からLXDへのアクセスを開く必要がありますか?」 答えはノーです。 パブリックまたはプライベートリポジトリを作成する場合は、yesと答える必要があります。







 Would you like LXD to be available over the network (yes/no)? no
      
      





LXDブリッジを構成する



ストレージタイプを設定すると、ユーティリティは「LXDブリッジを設定しますか?」と尋ねます。 答えはイエスです。







 Do you want to configure the LXD bridge (yes/no)? yes
      
      





ネットワークセットアップインターフェイスが起動します。 次のように質問に答えてください。







 Would you like to setup a network bridge for LXD containers now? Yes Bridge interface name: lxdbr0 Do you want to setup an IPv4 subnet? Yes IPv4 address: 10.200.0.1 IPv4 CIDR mask: 16 First DHCP address: 10.200.100.1 Last DHCP address: 10.200.255.254 Max number of DHCP clients: 25399 Do you want to NAT the IPv4 traffic? Yes Do you want to setup an IPv6 subnet? No
      
      





ネットワークには、lxdbr0インターフェースを備えたブリッジが使用されます。







ネットマスク10.200.0.0/16。

ホストIPアドレスは10.200.0.1です。

DHCPは、コンテナのIPを10.200.100.1から10.200.255.254に自動的に配布しますが、10.200.0.2から手動で設定できます。

コンテナのip6プロトコルは省略できます。







次のコマンドを使用して、LXDブリッジ構成ユーティリティを再起動できます。







 dpkg-reconfigure -p medium lxd
      
      





コンテナの静的IPを設定する



ファイルを開きます。







 nano /etc/default/lxd-bridge
      
      





行LXC_DHCP_CONFILEのコメントを解除して、次のように記述します。







 LXD_CONFILE="/etc/lxd-dnsmasq.conf"
      
      





静的IPアドレス構成ファイルを作成します。







 nano /etc/lxd-dnsmasq.conf
      
      





テストコンテナの静的IPアドレスを記述します。







 dhcp-host=test,10.200.1.1
      
      





将来的には、他のコンテナ用の他の静的IPアドレスをこのファイルに追加できるようになるでしょう。







/etc/lxd-dnsmasq.confファイルを変更するたびに、次のコマンドでlxd-bridgeを再起動する必要があります。







 service lxd-bridge restart
      
      





これで解決しない場合は、間違ったIPを持つコンテナを停止し、dnsmasq.lxdbr0.leasesファイルを削除してから、lxd-bridgeを再起動する必要があります。







 lxc stop test rm /var/lib/lxd-bridge/dnsmasq.lxdbr0.leases service lxd-bridge restart
      
      





NATセットアップ



コマンドを実行してNATが機能するには:







 echo 1 > /proc/sys/net/ipv4/ip_forward echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
      
      





Grubを構成する



ファイルを編集







 nano /etc/default/grub
      
      





行を変更する







 GRUB_CMDLINE_LINUX="swapaccount=1 quiet"
      
      





この行がないと、lxdを起動したときに、cgroupスワップアカウントが機能しないという警告が表示されました。 オプションswapaccount = 1を有効にすることにしました。 quiet-これはQuietブートシステムです(オプション)







自動実行へのLXDの追加



 systemctl enable lxd
      
      





システムの再起動



Ubuntuを再起動します。







 init 6
      
      





仮想マシンイメージをインストールして実行する



リポジトリを追加します(オプション、デフォルトでは、画像はすでに追加されています):







 lxc remote add images images.linuxcontainers.org:8443
      
      





ダウンロード画像:







 lxc image copy images:centos/6/amd64 local: --alias=centos-image
      
      





centos-image-画像への同義語であり、アクセスしやすい







イメージを実行します。







 lxc launch local:centos-image test
      
      





test-将来のコンテナの名前







次の2つのコマンドで画像を実行できます。







 lxc init local:centos-image test lxc start test
      
      





最初のコマンドはコンテナを作成し、2番目のコマンドはそれを起動します。 最初のコマンドは、コンテナを作成するだけで実行したくない場合に便利です。







実行中のコンテナのステータスを表示する







 lxc list
      
      





チームは次の情報を表示する必要があります。







 (Ubuntu)[root@ubuntu /]# lxc list +------+---------+-------------------+------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------+---------+-------------------+------+------------+-----------+ | test | RUNNING | 10.200.1.1 (eth0) | | PERSISTENT | 0 | +------+---------+-------------------+------+------------+-----------+
      
      





LXDは、/ etc / lxc-dnsmasq.confで構成したコンテナーの静的IPを発行したことに注意してください。







フォルダー転送



このコマンドは、フォルダ/データ/テスト/フォルダをフォルダ/フォルダ内のテストコンテナにマウントします







 mkdir -p /data/test/folder chown 100000:100000 /data/test/folder lxc config device add disk_name test disk path=/folder source=/data/test/folder
      
      





フォルダーをマウントしても、/ var / lib / lxd / containers / testフォルダーの内容は変更されませんが、別のフォルダー/ var / lib / lxd / devices / testにマウントされます。 したがって、コンテナーのバックアップとスナップショットには、マウントされたフォルダーとファイルは含まれません。 バックアップまたはイメージからコンテナーを更新しても、マウントされたフォルダーの内容には影響しません。







次のコマンドを使用して、構成情報を表示できます。







 lxc config show test
      
      





仮想マシンの接続



実行中のテストコンテナに移動します。







 lxc exec test -- /bin/bash
      
      





接続を確認します。







 ifconfig
      
      





結論:







 [root@test ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:16:3E:23:21:3F inet addr:10.200.1.1 Bcast:10.200.255.255 Mask:255.255.0.0 inet6 addr: fe80::216:3eff:fe23:213f/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:15078 errors:0 dropped:0 overruns:0 frame:0 TX packets:15320 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:28090645 (26.7 MiB) TX bytes:841975 (822.2 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
      
      





NATを確認します。







 ping ya.ru
      
      





結論:







 [root@test ~]# ping ya.ru PING ya.ru (93.158.134.3) 56(84) bytes of data. 64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=1 ttl=50 time=105 ms 64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=2 ttl=50 time=106 ms 64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=3 ttl=50 time=105 ms 64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=4 ttl=50 time=105 ms 64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=5 ttl=50 time=104 ms 64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=6 ttl=50 time=106 ms ^C --- ya.ru ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 6671ms rtt min/avg/max/mdev = 104.942/105.845/106.664/0.568 ms
      
      





基本パッケージをインストールします。







 yum install mc nano openssh-server epel-release wget -y yum update -y chkconfig sshd on service sshd start
      
      





ルートパスワードを設定する







 passwd
      
      





コンテナから切断します。







 exit
      
      





SSH接続



ホストsshキーをコンテナにコピーします







 ssh-copy-id root@10.200.1.1
      
      





Ubuntuがキーを見つけられないと誓った場合、最初にsshキーを生成し、次にssh-copy-idコマンドでコピーします。 キーが正常にコピーされた場合、この手順(キー生成)をスキップします。







 ssh-keygen
      
      





これで、パスワードなしで(証明書を使用して)sshを介してコンテナーに入ることができます。







 ssh root@10.200.1.1
      
      





NATを介したsshの転送



多くの場合、ホストをバイパスして、sshを介してコンテナに直接接続する機能を取得する必要があります(毎回ホストに移動しないように、コンテナに移動するため)。







これを行うには、次のコマンドを実行します。







 iptables -t nat -A PREROUTING -p tcp --dport 22001 -j DNAT --to-destination 10.200.1.1:22
      
      





Ubuntuの起動後にiptablesを自動保存する



Ubuntuでは、デフォルトではホストマシンを再起動するとiptablesが失われます。 この問題を解決するには、ファイルを作成する必要があります。







 nano /etc/network/if-up.d/00-iptables
      
      





記録ファイルの内容:







 #!/bin/sh iptables-restore < /etc/default/iptables #ip6tables-restore < /etc/default/iptables6
      
      





起動権を設定します。







 chmod +x /etc/network/if-up.d/00-iptables
      
      





現在の設定を保存します。







 iptables-save > /etc/default/iptables
      
      





再起動して、sshを使用してコンテナに接続してみます。







 ssh root@< ip  > -p22001
      
      





iptablesを微調整する



ブート時にiptablesリカバリを使用すると、LXDはコマンドをiptablesに追加し、重複したエントリがiptablesに含まれます。 さらに、さまざまなサーバーへの着信接続を禁止し、必要なポートのみを開く必要があります。







完成したリスト/etc/default/iptables



、2つのタスクを同時に解決します。







 # Generated by iptables-save v1.6.0 on Fri Aug 19 16:21:18 2016 *mangle :PREROUTING ACCEPT [129:9861] :INPUT ACCEPT [129:9861] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [102:11316] :POSTROUTING ACCEPT [102:11316] COMMIT # Completed on Fri Aug 19 16:21:18 2016 # Generated by iptables-save v1.6.0 on Fri Aug 19 16:21:18 2016 *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] #  ssh    test -A PREROUTING -p tcp -m tcp --dport 22001 -j DNAT --to-destination 10.200.1.1:22 COMMIT # Completed on Fri Aug 19 16:21:18 2016 # Generated by iptables-save v1.6.0 on Fri Aug 19 16:21:18 2016 *filter :INPUT ACCEPT [128:9533] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [102:11316] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT #    http  ssh -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT #     -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Fri Aug 19 16:21:18 2016
      
      





バックアップを作成する



このメソッドは、インポートの準備ができたLXDイメージとしてコンテナーバックアップを作成します。 理想的には、スナップショットを作成し、プライベートLXDリポジトリに送信する必要があります。 しかし、時にはこれを行うことができません。 たとえば、小さな会社には別のサーバーを購入する機会がありません。 この場合、単純なtar + Amazon S3ソリューションでできます。







バックアップを作成および復元するための既製のスクリプトをダウンロードします。







 wget https://github.com/vistoyn/lxd_backup/raw/1.1/scripts/lxc-backup -O "/usr/local/bin/lxc-backup" wget https://github.com/vistoyn/lxd_backup/raw/1.1/scripts/lxc-restore -O "/usr/local/bin/lxc-restore"
      
      





スクリプトの実行フラグを設定します。







 chmod +x /usr/local/bin/lxc-restore chmod +x /usr/local/bin/lxc-backup
      
      





バックアップを作成および復元する前に、作業コンテナを停止する必要があります。 原則として、実行中のコンテナでバックアップを作成できますが、バックアップを作成すると、一部のデータが失われる可能性があります(コンテナにインストールされているプログラムによって異なります)。







dirの場合



このコマンドは、テストコンテナーのバックアップを作成し、ファイルをアーカイブに圧縮して、/ backup / lxc / testフォルダーのディスクに保存します。







 lxc stop test lxc-backup test
      
      





スナップショットからバックアップを復元します。







 lxc-restore test /backup/lxc/test/snap-test-2016-08-19.tar.bz2
      
      





ZFSの場合



ZFSの場合、コンテナ名の後に「.zfs」を追加します







バックアップの作成:







 lxc stop test lxc-backup test.zfs
      
      





スナップショットからバックアップを復元します。







 lxc-stop test lxc-restore test.zfs /backup/lxc/test/snap-test.zfs-2016-08-19.tar.bz2
      
      





バックアップをインポート



新しいホストでは、バックアップからコンテナを作成する必要がある場合があります。 これを行うには、最初にイメージをインポートしてから、コンテナーとして実行します。







バックアップをLXDイメージとしてインポートするコマンド:







 lxc image import /backup/lxc/test/snap-test-2016-08-19.tar.bz2 --alias my-new-image
      
      





コンテナとしてイメージを開始するコマンド:







 lxc launch me-new-image test2
      
      





素材



この記事では、LXDに関連する他の多くの問題には対処していません。 LXDの詳細については、こちらをご覧ください。







  1. LXDの公式サイト。
  2. 利用可能な画像のリスト。
  3. ロシア語のLXD 2.0に関する一連の記事。
  4. LXD APIとの直接の相互作用。
  5. LXDコンテナーでのDockerの実行。
  6. Ubuntu 16.04でLXCコンテナーの静的アドレスを構成します。
  7. UbuntuでLXD用のZFSを構成します。
  8. ZFSに関する参照情報。
  9. Ubuntuの再起動後にiptablesルールを保存する方法は?
  10. LXDのバックアップを作成および復元するユーティリティ



All Articles