Linuxコンテナを実行できるコンテナプラットフォームを簡単に構築/展開できるmobyとlinuxkitをさくらのクラウドに対応させてみましたのでご紹介します。
(2017/10/23追記): システム要件としてDockerとGNU Makeのインストールが必要な旨を追記しました
TL; DR
以下のようにすればmoby
とlinuxkit
でさくらのクラウド上に簡単にコンテナプラットフォームを構築できます。
※あらかじめDocker
とGNU 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
コマンドで作成できるイメージの形式
作成したイメージはブータブルとなっており、自分でクラウド上にアップロードしたりオンプレの仮想化基盤に登録したりすることでイメージを利用したサーバを起動できるようになっています。
(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
)対応先の一覧
イメージからのサーバ作成/起動(linuxkit run
)対応先の一覧
標準ではさくらのクラウドに対応していませんので今回対応させてみました。
linuxkitのさくらのクラウド対応
以下のリポジトリにlinuxkitをforkしてさくらのクラウド対応を行っています。
このリポジトリを利用することで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の実行
あとは通常のmoby
とlinuxkit
と同様の手順でOKです。
システム要件もmoby
とlinuxkit
と同じく以下がインストールされていること、となっています。
なお、linuxkit
でAzureを利用する場合などと同じくログイン情報(APIキー)を環境変数に登録しておく必要があります。
sacloud/linuxkit
では以下の環境変数の設定を行っておく必要があります。
さくらのクラウドのコントロールパネルでAPIキーを発行しておいてください。
(環境変数はusacloudやTerraform 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]
終わりに
今回はmoby
とlinuxkit
を用いてさくらのクラウド上でコンテナプラットフォームを簡単に構築する方法をご紹介しました。
linuxkit
を用いれば特定機能に特化したイメージを簡単に作成でき、アップロード/サーバ作成と起動も手軽に行えますね。
ぜひお試しください。以上です。