febc技術メモ

Japanese version of http://febc-yamamoto.hatenablog.com

moby / linuxkit をさくらのクラウド対応させました

f:id:febc_yamamoto:20171023183107p:plain

Linuxコンテナを実行できるコンテナプラットフォームを簡単に構築/展開できるmobylinuxkitさくらのクラウドに対応させてみましたのでご紹介します。
(2017/10/23追記): システム要件としてDockerとGNU Makeのインストールが必要な旨を追記しました

TL; DR

以下のようにすればmobylinuxkitさくらのクラウド上に簡単にコンテナプラットフォームを構築できます。
※あらかじめDockerGNU Makeをインストールしておく必要があります。

# sacloud/linuxkitのインストール
$ brew tap sacloud/linuxkit
$ brew install --HEAD moby
$ brew install --HEAD linuxkit

# さくらのクラウドAPIキーを環境変数に設定
$ export SAKURACLOUD_ACCESS_TOKEN="your-token"
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET="your-secret"
$ export SAKURACLOUD_ZONE="tk1a"

# mobyコマンドでraw形式のイメージ作成
$ moby build -format raw -size 256M sakuracloud.yml

# linuxkit pushでさくらのクラウド上にアップロード
$ linuxkit push sakuracloud sakuracloud.raw

# linuxkit runでさくらのクラウド上にサーバ作成/起動
$ linuxkit run sakuracloud sakuracloud

moby/linuxkitとは?

mobyとlinuxkitについてはPublickeyの以下の記事にわかりやすくまとめられています。

Publickey: Docker、「LinuxKit」を発表。コンテナランタイムのためだけにゼロから開発されたセキュアなLinux Subsystem。DockerCon 2017

全てがコンテナで実行される軽量でimmutableなLinuxイメージを作成できるツールとなっています。

どうやって使うの?

LinuxKitを使ってLinuxイメージを作成するためにmobyコマンドが提供されています。
mobyコマンドは、使用するカーネルやinitプロセス、動かしたいコンテナといった構成情報をyaml形式のファイルで定義し、定義に沿ったLinuxイメージを作成してくれます。

出力形式は以下のようなものがサポートされており、AWS/Azure/GCPといったクラウド上で利用できるイメージだけでなくOpenStackやオンプレのベアメタルサーバなどに対応できる形式のイメージが作成できます。

mobyコマンドで作成できるイメージの形式

  • docker
  • dynamic-vhd
  • gcp
  • iso-bios
  • iso-efi
  • kernel+initrd
  • qcow2
  • raw
  • rpi3
  • tar
  • tar-kernel-initrd
  • vhd
  • vmdk

作成したイメージはブータブルとなっており、自分でクラウド上にアップロードしたりオンプレの仮想化基盤に登録したりすることでイメージを利用したサーバを起動できるようになっています。
(ISOイメージで出力してCD/DVDなどのメディアを用意する方法も可能)

自分で(各クラウドの)コントロールパネルなどからアップロードしても良いですしCLIなどを利用してもよいですが、これらを簡単に行えるようにlinuxkitコマンドが用意されています。

linuxkitコマンドは何をするもの?

linuxkitコマンドは主にmobyコマンドで作成したイメージをクラウド(など)へアップロードし、そのイメージを用いて起動するサーバの作成を行ってくれます。
メタデータ用ISOイメージ作成や構成要素として利用できるパッケージ作成などの補助機能もあります。

イメージ作成〜サーバ起動までの利用イメージは以下のようになります。

# mobyコマンドでイメージ作成(example.rawファイルが作成される)
$ moby build -format raw example.yml

# linuxkit pushでアップロード
$ linuxkit push aws -bucket bucketname example.raw

# linuxkit runでアップロードしたイメージを利用したサーバを作成/起動
$ linuxkit run aws example

定義ファイル(yaml)の作り方についてはこちらのドキュメントに詳しく記載されています。

linuxkitドキュメント: Yaml Configuration Document

現時点では以下のクラウド(など)に対応しています。

イメージのアップロード(linuxkit push)対応先の一覧

  • aws
  • azure
  • gcp
  • openstack
  • vcenter

イメージからのサーバ作成/起動(linuxkit run)対応先の一覧

標準ではさくらのクラウドに対応していませんので今回対応させてみました。

linuxkitのさくらのクラウド対応

以下のリポジトリにlinuxkitをforkしてさくらのクラウド対応を行っています。

Github: sacloud/linuxkit

このリポジトリを利用することでlinuxkitさくらのクラウド上にイメージのアップロードを行いサーバ起動を行うことが可能となります。

sacloud/linuxkitのインストール

まずはforkしたsacloud/linuxkitのインストールを行う必要があります。 以下2つの方法があります。

  • 方法1) homebrewを利用してインストール
  • 方法2) 上記リポジトリをクローンして自分でビルド

方法1) homebrewでsacloud/linuxkitをインストール

本家linuxkitと同じくhomebrewでのインストールを行えるようにしています。

# まずはtap
$ brew tap sacloud/linuxkit

# インストール実施
$ brew install --HEAD moby
$ brew install --HEAD linuxkit

もしすでにlinuxkit/linuxkitをtapしている場合は名前が衝突しますのでbrew install時に以下のように完全名で指定する必要があります。

$ brew install --HEAD sacloud/linuxkit/moby
$ brew install --HEAD sacloud/linuxkit/linuxkit

方法2) sacloud/linuxkitをクローンして自分でビルド

ビルドにはGo言語の開発環境が必要です。$GOPATHの設定なども行っておく必要があります。

$GOPATH/src/github.com/linuxkit/linuxkitディレクトリにsacloud/linuxkitをクローンしてmakeを実行すればOKです。

# ディレクトリ作成
$ mkdir -p $GOPATH/src/github.com/linuxkit

# クローン
$ git clone https://github.com/sacloud/linuxkit.git $GOPATH/src/github.com/linuxkit/linuxkit

# 移動
$ cd $GOPATH/src/github.com/linuxkit/linuxkit

# ビルド(binディレクトリ配下にlinuxkit/mobyコマンドが作成される)
$ make

必要に応じて$PATHの設定を行ってください。

sacloud/linuxkitの実行

あとは通常のmobylinuxkitと同様の手順でOKです。
システム要件もmobylinuxkitと同じく以下がインストールされていること、となっています。

  • GNU Make(BSD Makeは不可)
  • Docker
  • qemu(オプション)

なお、linuxkitでAzureを利用する場合などと同じくログイン情報(APIキー)を環境変数に登録しておく必要があります。
sacloud/linuxkitでは以下の環境変数の設定を行っておく必要があります。
さくらのクラウドのコントロールパネルでAPIキーを発行しておいてください。
(環境変数usacloudTerraform for さくらのクラウドと共通となっています)

# APIキー(アクセストークン)
$ export SAKURACLOUD_ACCESS_TOKEN="your-access-token"

# APIキー(アクセスシークレット)
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET="your-access-secret"

# 対象ゾーン(石狩第1: is1a / 石狩第2: is1b / 東京第1: tk1a / サンドボックス: tk1v)
$ export SAKURACLOUD_ZONE="tk1a"

イメージのビルド

定義ファイルを用意した上でmobyコマンドでビルドを行います。

定義ファイルの例をGitHub上で公開していますのでそれを元に作成してください。

さくらのクラウドでの定義ファイルの例: GitHub: sacloud/linuxkit/examples/sakuracloud.yml

kernel:
  image: linuxkit/kernel:4.9.56
  cmdline: "console=tty0 console=ttyS0 console=ttyAMA0"
init:
  - linuxkit/init:6b3755e47f00d6027321d3fca99a19af6504be75
  - linuxkit/runc:52f92cb577879ce4cfe4e89be2d63af82523fc92
  - linuxkit/containerd:ed8e8f92e24dd4b94260cf147594ae3fd13a2182
  - linuxkit/ca-certificates:ea3c4c120f929f4f07ac8535d75933365b5e9582
onboot:
  - name: sysctl
    image: linuxkit/sysctl:1644bf07edbcaf5ce0bb764fa925b544183547f9
  - name: rngd1
    image: linuxkit/rngd:45ed7759dd927f4cce3863073ea2e0da1d52a427
    command: ["/sbin/rngd", "-1"]
services:
  - name: getty
    image: linuxkit/getty:7abaf7b276c59f80891d92e9279e3e3ee8e2f512
    env:
     - INSECURE=true
  - name: rngd
    image: linuxkit/rngd:45ed7759dd927f4cce3863073ea2e0da1d52a427
  - name: dhcpcd
    image: linuxkit/dhcpcd:aa685261ceb2557990dcfe9dd8824c6b9ec416e2
  - name: sshd
    image: linuxkit/sshd:4a2fc7be31fa57dcade391de6173e0af55296e7f
files:
  - path: root/.ssh/authorized_keys
    source: ~/.ssh/id_rsa.pub
    mode: "0600"
    optional: true
trust:
  org:
    - linuxkit

この例はSSHDを起動するイメージの例となっています。
SSH用のキーペアをssh-keygenなどで作成し定義ファイルに公開鍵のファイルパスを記載してください。(デフォルトでは~/.ssh/id_rsa.pubが指定されています)

定義ファイルを作成したらmobyコマンドを実行します。
さくらのクラウドではAWSなどと同じく-formatオプションにrawを指定する必要があります。

# mobyコマンドでraw形式のイメージ作成
$ moby build -format raw -size 256M sakuracloud.yml

デフォルトでは定義ファイルの拡張子を除いたもの+.rawというファイル名でイメージが作成されます。
これは-nameオプションで上書き可能です。

また、イメージのサイズはデフォルトで1024M(1GB)となっています。
SSHを実行する程度のイメージであれば256Mもあれば十分ですので-sizeオプションでサイズを明示しています。
定義ファイルの内容によってこの値は調節する必要があります。

うまくいくとsakuracloud.rawというファイルが作成されるはずです。

イメージのアップロード

次にlinuxkit pushコマンドでアップロードを行います。

# 作成したイメージをさくらのクラウドへアップロード
$ linuxkit push sakuracloud sakuracloud.raw

デフォルトではイメージファイル名の拡張子を除いたものがさくらのクラウドアーカイブ名として利用されます。
この例ではsakuracloudという名前でアーカイブが作成されます。

実行!!

いよいよサーバの作成/起動です。
linuxkit runコマンドにアップロードしたアーカイブ名を指定することで起動できます。

# アップロードしたアーカイブを利用してサーバ作成/起動
$ linuxkit run sakuracloud sakuracloud

現在は以下のオプションが利用可能です。

  • -name: 作成されるサーバの名称(デフォルトではアーカイブ名と同じになる)
  • -core : 作成されるサーバのコア数(デフォルト1)
  • -memory : 作成されるサーバのメモリサイズ、単位はGB(デフォルト1)
  • -disk-size : 作成されるサーバのディスクサイズ、単位はGB(デフォルト20)

-core-memoryの組み合わせによってはサーバ作成時にエラーとなりますので、以下のドキュメントを参考にサポートされている組み合わせを指定してください。

さくらのクラウド: サーバプラン一覧

作成されたら以下のコマンドでSSH接続可能です。
(定義ファイルの内容によってはSSH接続できない場合もあります)

$ ssh -i your-private-key-path root@サーバのグローバルIP

もしSSH接続できないイメージを作成した場合、SSH接続の代わりにさくらのクラウドCLIであるusacloudを用いてVNC接続を行うことも可能です。

# usacloudでVNC接続
$ usacloud server vnc [サーバ名 or サーバID]

終わりに

今回はmobylinuxkitを用いてさくらのクラウド上でコンテナプラットフォームを簡単に構築する方法をご紹介しました。
linuxkitを用いれば特定機能に特化したイメージを簡単に作成でき、アップロード/サーバ作成と起動も手軽に行えますね。

ぜひお試しください。以上です。