LoginSignup
3
2

More than 5 years have passed since last update.

LinuxKitで作成したイメージをPacketのベアメタルサーバー上で動かす

Last updated at Posted at 2017-04-24

DockerCon 2017LiuxKitというツールが発表されました。

LinuxKitを使用するとDockerのイメージを組み合わせてLinuxのイメージを作成することができます。イメージはISOやqcow2等の形式で出力して、各種ハイパーバイザ、クラウド、ベアメタルサーバー上で実行することが可能です。

今回はLinuxKitで作成したイメージをベアメタルサーバー上で実行する例として、Packetのベアメタルサーバー上で実行してみます。

Packet

PacketはAWSやGCPと同じようなパブリッククラウドのプロバイダーですが、特徴として他の多くのクラウドと異なり仮想ではなくベアメタルでサーバーを提供しています。操作感的には他のクラウドとほぼ同様でAPIも提供されています。

とりあえず動かしてみる

とりあえず、LinuxKitのGetting Startedのlinuxkit.ymlで作成したイメージをPacketのベアメタルサーバーで動かしてみます。

linuxkit/README.md at master · linuxkit/linuxkit · GitHub

まずmoby buldを実行してイメージを作成します。

$ moby build linuxkit.yml
$ ls linuxkit* | grep -v yml
linuxkit-bzImage
linuxkit-cmdline
linuxkit-efi.iso
linuxkit-initrd.img
linuxkit.iso

次にlinuxkit-bzImagelinuxkit-initrd.imgをどこかにアップロードします。例ではGoogle Cloud Storageを使用していますが、Packetでサーバー作成する際にダウンロード可能であればどこでも良いです。

$ gsutil mb gs://<YourBucketName>
$ gsutil cp -a public-read linuxkit-bzImage  gs://<YourBucketName>
$ gsutil cp -a public-read linuxkit-initrd.img  gs://<YourBucketName>

PacketはLinuxKitでサポートされているためlinuxkit run packetコマンドで簡単にサーバーを作成することができます。

$ linuxkit run packet --base-url http://storage.googleapis.com/<YourBucketName> --api-key <YourPacketAPIKey> --project-id <YourPacketProjectID> linuxkit

コマンドを実行したら、WebUI等でサーバーの作成状況とIPアドレスを確認します。Active状態になったらサーバーのIPアドレスをブラウザで開いてNignxの画面が表示されることを確認します1

今のところlinuxkit run packetコマンドではコンソールへの接続まではやってくれないですが以下のようにSSHするとコンソールに接続することも可能です。2

How to use our S.O.S. Rescue Mode | Packet Support

動作を確認したら必要以上に課金されないよう忘れず削除しておきましょう。今のところ削除のコマンドはないのでPacketのAPIやUIから削除します。

サーバーにSSHでログインする

Dockerイメージを組み合わせてOSのカスタマイズする例としてsshdのイメージを使ってSSHでログインできるようにしてみます。

次のようにlinuxkit.ymlservicesfilesにSSHサーバーと鍵の情報を追記します。

services:
  - name: rngd
    image: "mobylinux/rngd:3dad6dd43270fa632ac031e99d1947f20b22eec9"
    capabilities:
     - CAP_SYS_ADMIN
    oomScoreAdj: -800
    readonly: true
  - name: nginx
    image: "nginx:alpine"
    capabilities:
     - CAP_NET_BIND_SERVICE
     - CAP_CHOWN
     - CAP_SETUID
     - CAP_SETGID
     - CAP_DAC_OVERRIDE
    net: host
  - name: sshd
    image: "linuxkit/sshd:e108d208adf692c8a0954f602743e0eec445364e"
    capabilities:
     - all
    net: host
    pid: host
    binds:
     - /root/.ssh:/root/.ssh
     - /etc/resolv.conf:/etc/resolv.conf
files:
  - path: etc/docker/daemon.json
    contents: '{"debug": true}'
  - path: root/.ssh/authorized_keys
    contents: '#your ssh key here'

再度イメージをビルド、アップロードしてlinuxkit run packetコマンドでサーバーを作ります。

$ moby build linuxkit.yml
$ gsutil versioning set on gs://linuxkit
$ gsutil cp -a public-read linuxkit-bzImage gs://<YourBucketName>
$ gsutil cp -a public-read linuxkit-initrd.img gs://<YourBucketName>
$ linuxkit run packet --base-url http://storage.googleapis.com/<YourBucketName> --api-key <YourPacketAPIKey> --project-id <YourPacketProjectID> linuxkit

成功していればSSHでsshdコンテナの中に入ることができます。bindsを変更することでホストのファイルをコンテナに見せることもできます。

ssh root@<サーバーのIP>

linuxkit run packetは何をしているか?

PacketではインストールするOSをCentOSやUbuntu、ESXi等から選択できますが、独自のOSがインストールできるようiPXEのスクリプトが使用できるようになっています。

Custom iPXE | Packet Support

linuxkit run packetはこの仕組みを利用し、以下のようなiPXEスクリプトを生成、サーバー作成時の引数に渡すことによってアップロードしたイメージでサーバーを起動しています。

#!ipxe

dhcp
set base-url http://http://storage.googleapis.com/<YourBucketName>
set kernel-params ip=dhcp nomodeset ro serial console=ttyS1,115200
kernel ${base-url}/linuxkit-bzImage ${kernel-params}
initrd ${base-url}/linuxkit-initrd.img
boot

linuxkit/run_packet.go at 456f2623d57e547df11184e00fd2fae89b2da994 · linuxkit/linuxkit · GitHub

iPXEスクリプトが使われるのはサーバー作成時のみで、それ以降はローカルディスクから起動されます。今回のようにディスクにインストールしていない状態でサーバーを落とすと起動できなくなり作り直しになります。

さいごに

簡単にですがLinuxKitで作成したイメージをPacketのベアメタルサーバーで動かす方法と仕組みを見てきました。基本的には同じような方法で、他の物理サーバーでもLinuxKitで作成したイメージを動かせると思います。

今回はデフォルトのType0のみで試しましたが構成の異なる他のタイプやARMのサーバーも試してみると面白そうです。


  1. linuxkit.ymlで作成されるイメージではNginxが起動しています 

  2. サーバー作成時に公開鍵を登録していないと接続に失敗しまうようなので、もし登録してなければ左メニューの「SSH Keys」から登録しておく 

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2