LoginSignup
7
7

More than 5 years have passed since last update.

Moby/LinuxKit on さくらのクラウド

Last updated at Posted at 2017-04-28

Linuxkit/Mobyプロジェクトについて

Linuxkit/Mobyプロジェクトは2017年4月のDockerConで発表されました。

内容については、既に様々な記事が出ていますね。

LinuxKit/Mobyプロジェクトについてはこれらの記事を読むのが良さそうです。

早速調べつつ触ってみました。

mobyコマンド

mobyコマンドが具体的にどう動いているかは以下に詳しく書かれていました。
https://github.com/linuxkit/linuxkit/blob/master/docs/architecture.md

moby = イメージをビルドするためのツール

ですね。

linuxkit?

linuxkitというプロジェクトには以下が含まれます。

  • mobyコマンドでのビルドで利用する、各種コンテナの実装など
  • linuxkitコマンド

ライブラリとしてのlinuxkitと、コマンドとしてのlinuxkitですね。
今回はlinuxkitコマンドは使わず、mobyコマンドのみを対象に触ってみました。

今回試すこと

mobyコマンドでISOイメージ(iso-bios)を出力し、それをさくらのクラウド上で起動させてみます。

Note:
今回は手動でさくらのクラウドへのアップロードなどを行いますが、
そのうちlinuxkit(コマンド)で実施できるようにしたいです。
(今の所linuxkitの実装がもう少し固まるまで様子見中)

CD-ROMから起動するImmutableなサーバを作る

作業環境はmacOS(Sierra)でした。

以外の環境の方は適宜読み替えてください。

Mobyのインストール

まずはmobyコマンドのインストールを行います。

go開発環境がある場合

go開発環境がある場合
go get -u github.com/docker/moby/src/cmd/moby

自分でmakeする場合

GitHubからクローンしてmakeします。
makeするには以下が必要とのことです。

  • GNU make
  • GNU or BSD tar (not busybox tar)
  • Docker
makeする場合
git clone https://github.com/linuxkit/linuxkit.git
cd linuxkit
make

binディレクトリ配下にlinuxkitコマンドとmobyコマンドが作成されているはずです。

mobyコマンドでイメージを作成

mobyコマンドはyamlでの定義ファイルを読み込んで、ブータブルなイメージを出力してくれます。
examplesディレクトリにサンプルがありますのでまずはそこからビルドしてみます。

サンプル: minimal

最小構成でイメージをビルドするためのサンプルが用意されています。

examples/minimal.yml
kernel:
  image: "linuxkit/kernel:4.9.x"
  cmdline: "console=ttyS0 console=tty0 page_poison=1"
init:
  - linuxkit/init:f71c3b30ac1ba4ef16c160c89610fa4976f9752f
  - linuxkit/runc:b0fb122e10dbb7e4e45115177a61a3f8d68c19a9
  - linuxkit/containerd:60e2486a74c665ba4df57e561729aec20758daed
onboot:
  - name: dhcpcd
    image: "linuxkit/dhcpcd:48e249ebef6a521eed886b3bce032db69fbb4afa"
    binds:
     - /var:/var
     - /tmp/etc:/etc
    capabilities:
     - CAP_NET_ADMIN
     - CAP_NET_BIND_SERVICE
     - CAP_NET_RAW
    net: host
    command: ["/sbin/dhcpcd", "--nobackground", "-f", "/dhcpcd.conf", "-1"]
trust:
  image:
    - linuxkit/kernel
outputs:
  - format: kernel+initrd

yamlにどのようなものが記載できるのかは以下のドキュメントを参照すれば良さそうです。
https://github.com/linuxkit/linuxkit/blob/master/docs/yaml.md

この内容ではDHCPクライアントしか動いていない最小構成のOSイメージが作成されます。

今回はさくらのクラウドを利用しますので、一番下のoutputsを以下のようにしてISOイメージを出力するようにしましょう。

example/minimal.yml修正
cp example/minimal.yml sakura.yml
vi sakura.yml
# 一番下のoutputs部分を以下のように修正
#outputs:
#  - format: iso-bios

イメージのビルド

以下のコマンドでビルドします。sakura.isoというファイルが出力されるはずです。

mobyでビルド
moby build sakura.yml

ビルドしたイメージをさくらのクラウド上で起動

isoイメージができましたので、アップロードしてサーバ作成、ISOイメージを挿入しサーバを起動します。

コントロールパネルから実施しても良いのですが、今回はさくらのクラウドの新しい非公式CLIクライアントであるusacloudコマンドで実施します。

usacloudコマンド

usacloudコマンドのインストール

GitHubのリリースページからバイナリをダウンロードするだけでOKです。
また、yum/apt/homebrewでのインストールにも対応しています。

今回はmacOSで作業していますので、homebrewでインストールします。

usacloudインストール
brew tap sacloud/homebrew-usacloud; brew install usacloud

インストールしたら動作確認しておきます。(bash_completionを有効にするため再ログインしておいてください)

usacloud確認
$ usacloud -v
usacloud version 0.0.8, build 4934960

APIキーの設定

以下のコマンドでAPIキーを入力します。(コンパネでAPIキーを作成しておいてください)

apiキー設定
usacloud config

Setting SakuraCloud API Token => 
    Enter token:                  # APIトークンを入力

Setting SakuraCloud API Secret => 
    Enter secret:                 # APIシークレットを入力

Setting SakuraCloud Zone => 

    Enter zone[is1a/is1b/tk1a/tk1v](default:tk1a):    # ゾーン選択(空でOK)

Written your settings to ~/.usacloud_config

以上で準備完了です。

サーバ作成〜ISOアップロード〜ISOイメージ挿入〜起動

ではいよいよ作成したISOイメージからサーバ起動してみます。

サーバ起動
# mobyで作成したISOイメージをアップロードする
usacloud iso-image create -y --name moby_example --iso-file sakura.iso

# ディスクレスなサーバを作成(ISOイメージを挿入し、作成後起動する)
usacloud server build -y \
            --name moby_example \
            --disk-mode diskless \
            --iso-image-id `usacloud iso-image read -q moby_example | head -n1`

# 起動したサーバのコンソールに接続(さくらのクラウドのVNCプロキシを経由して接続)
usacloud server vnc -y moby_example

usacloud server vncで、デフォルトのVNCクライアントが起動します。
macOSの場合は画面共有.appが開くはずです。

moby_example.png

DHCPクライアントが起動しているので、さくらのクラウドが割り当てたグローバルIPがeth0に付けられているのが確認できるはずです。

これでコンテナが動く最小構成のサーバが作成できました。

確認したら後始末として以下コマンドでサーバとISOイメージを削除しておきましょう。

削除
usacloud server rm -f -y moby_example
usacloud iso-image rm -y moby_example

ディスクをマウントしてみる

ディスクをマウントすることもできるようです。
今回は空のディスクを作ってフォーマット/マウントする処理をonbootに書いてみます。

イメージのビルド

yamlファイルを以下のように作成します。

sakura.yml
kernel:
  image: "linuxkit/kernel:4.9.x"
  cmdline: "console=ttyS0 console=tty0 page_poison=1"
init:
  - linuxkit/init:63eed9ca7a09d2ce4c0c5e7238ac005fa44f564b
  - linuxkit/runc:b0fb122e10dbb7e4e45115177a61a3f8d68c19a9
  - linuxkit/containerd:18eaf72f3f4f9a9f29ca1951f66df701f873060b
onboot:
  - name: format
    image: "linuxkit/format:53748000acf515549d398e6ae68545c26c0f3a2e"
    binds:
     - /dev:/dev
    capabilities:
     - CAP_SYS_ADMIN
     - CAP_MKNOD
  - name: mount
    image: "linuxkit/mount:d2669e7c8ddda99fa0618a414d44261eba6e299a"
    binds:
     - /dev:/dev
     - /var:/var:rshared,rbind
    capabilities:
     - CAP_SYS_ADMIN
    rootfsPropagation: shared
    command: ["/mount.sh", "/var/external"]
services:
  - name: dhcpcd
    image: "linuxkit/dhcpcd:57a8ef29d3a910645b2b24c124f9ce9ef53ce703"
    binds:
     - /var:/var
     - /tmp/etc:/etc
    capabilities:
     - CAP_NET_ADMIN
     - CAP_NET_BIND_SERVICE
     - CAP_NET_RAW
    net: host
    oomScoreAdj: -800
trust:
  image:
    - linuxkit/kernel
outputs:
  - format: iso-bios

続いてmobyでビルドします。

mobyでビルド
moby build sakura.yml

さくらのクラウドの操作

続いてさくらのクラウド側へISOをアップロードします。
その後、サーバと空のディスクを作成し接続、起動という流れです。

さくらのクラウド操作
# mobyで作成したISOイメージをアップロードする
usacloud iso-image create -y --name moby_example --iso-file sakura.iso

# ディスクレスなサーバを作成(まだ起動させない)
usacloud server build -y \
            --name moby_example \
            --disk-mode diskless \
            --disable-boot-after-create

# 空のディスクを作成
usacloud disk create -y --name moby_example

# サーバとディスクを接続
usacloud server disk-connect -y \
            --disk-id `usacloud disk read -q moby_example | head -n1` \
            moby_example

# サーバにISOイメージを挿入
usacloud server iso-insert -y \
           --iso-image-id `usacloud iso-image read -q moby_example | head -n1` \
           moby_example

# 起動
usacloud server boot -y moby_example

# 起動したサーバのコンソールに接続(さくらのクラウドのVNCプロキシを経由して接続)
usacloud server vnc -y moby_example

まずはきちんと接続したディスクがマウントできているか確認します。
moby_example2.png

大丈夫ですね。マウントできました。もちろん書き込みもOKです。

ISOイメージからブートしてデータだけディスクに置く、Immutableなサーバの完成です!!

確認したら後片付けを忘れずに。

お片付け
usacloud server rm -f -y moby_example
usacloud iso-image rm -y moby_example

実用的なイメージを作ってみる

ここまでくれば、Dockerイメージ化しているものであればすぐにでもmobyでイメージ化できそうですね!

今回は実用的な例として、さくらのクラウドとMackerelを連携するためのツール「sackerel」を起動するイメージを作成してみます。

sackerelについては以下を参照してください。

サービス監視をお手軽に!さくらのクラウド + Mackerel = 「Sackerel(サカレル)」

servicesの中でsackerelを起動するように設定しています。

sakura.yml
kernel:
  image: "linuxkit/kernel:4.9.x"
  cmdline: "console=ttyS0 console=tty0 page_poison=1"
init:
  - linuxkit/init:63eed9ca7a09d2ce4c0c5e7238ac005fa44f564b
  - linuxkit/runc:b0fb122e10dbb7e4e45115177a61a3f8d68c19a9
  - linuxkit/containerd:18eaf72f3f4f9a9f29ca1951f66df701f873060b
  - linuxkit/ca-certificates:e091a05fbf7c5e16f18b23602febd45dd690ba2f
onboot:
  - name: sysctl
    image: "linuxkit/sysctl:2cf2f9d5b4d314ba1bfc22b2fe931924af666d8c"
    net: host
    pid: host
    ipc: host
    capabilities:
     - CAP_SYS_ADMIN
services:
  - name: rngd
    image: "linuxkit/rngd:c42fd499690b2cb6e4e6cb99e41dfafca1cf5b14"
    capabilities:
     - CAP_SYS_ADMIN
    oomScoreAdj: -800
  - name: dhcpcd
    image: "linuxkit/dhcpcd:48e249ebef6a521eed886b3bce032db69fbb4afa"
    binds:
     - /var:/var
     - /tmp:/etc
    capabilities:
     - CAP_NET_ADMIN
     - CAP_NET_BIND_SERVICE
     - CAP_NET_RAW
    net: host
    oomScoreAdj: -800
  - name: sackerel
    image: "sacloud/sackerel:latest"
    capabilities:
     - all
    net: host
    pid: host
    env:
     - "SAKURACLOUD_ACCESS_TOKEN=さくらのクラウドAPIトークンを入力"
     - "SAKURACLOUD_ACCESS_TOKEN_SECRET=さくらのクラウドAPIシークレットを入力"
     - "MACKEREL_APIKEY=MackerelのAPIキーを入力"
trust:
  image:
    - linuxkit/kernel
    - linuxkit/rngd
outputs:
  - format: iso-bios

envには適切にAPIキーを入力してください。
本来はcapabilitiesをきちんと設定する必要がありますが、今回はとにかく動かすことが目的のためにallにしてしまいました。

良い子は絶対に真似しないでね!!

起動してみる

あとはこれまでと同じくアップロードしてサーバ作成、起動してみましょう。

サーバ起動
# mobyで作成したISOイメージをアップロードする
usacloud iso-image create -y --name moby_example --iso-file sakura.iso

# ディスクレスなサーバを作成(ISOイメージを挿入し、作成後起動する)
usacloud server build -y \
            --name moby_example \
            --disk-mode diskless \
            --iso-image-id `usacloud iso-image read -q moby_example | head -n1`

# 起動したサーバのコンソールに接続(さくらのクラウドのVNCプロキシを経由して接続)
usacloud server vnc -y moby_example

起動したらrunc listで起動しているコンテナを確認してみましょう。

moby_example3.png

ログは/var/log/sackerel.logに出力されています。

moby_example4.png

今回はディスクレスなサーバにしましたので、ログが必要であれば別途fluentdを立てるなどしておけば良いでしょう。

終わりに

mobyでブータブルなイメージを作成してみました。
今回は扱いませんでしたが、dockerを動かすイメージも作成できます。
その場合、coreosやrancherOSと近いイメージになりますね。

また、linuxkitリポジトリ上ではAMIやk8s用イメージの作成なども実装が進められているようです。

こちらも楽しみです。

他にも、linuxkit(コマンド)と組み合わせたり、InfraKitで動的な足回り(インフラ)を構築する、Terraformと連携するなど色々と出来そうです。

linuxkit(コマンド)もmobyも活発に開発が進んでますので、今後も楽しみですね!

以上です。

7
7
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
7
7