Install Container Linux to disk(What is Ignition?)

CoreOS社のLinuxディストリビューションであるCoreOSが、Container Linuxに名称変更しましたね(もう1年経つのか…)。

今回Container LinuxをISOイメージからディスク(VMware)へインストールする機会があったのでやり方をメモします。以前とやりかたが変わっていたので。 😮

インストール方法

ISOイメージでブート後、coreosユーザでログインされるのでrootユーザに切り替えて以下のコマンドを実行することでディスクへインストール出来ます。

sudo su - root
coreos-install -d /dev/sda -C stable

さて、上の例ではインストールはされるものの、ユーザのパスワードもsshの公開鍵も設定されていないので、起動後にログインすることが出来ません。

Container Linuxはプロビジョニングユーティリティを使用して初期設定を行うことができるので、これを利用します。

対応しているプロビジョニングユーティリティはcloud-initとignitionです。オプションで指定できます。cloud-initと言っても本家をContainer Linux用に改造したcoreos-cloudinitのようです。

-c CLOUD Insert a cloud-init config to be executed on boot.
-i IGNITION Insert an Ignition config to be executed on boot.

Installing to Disk

今回はignitionを利用してみます。

Ignitionとは

ignitionとはContainer Linux用に設計されたプロビジョニングユーティリティです。よく見かけるのはcloud-initですよね。AWSとかでYAMLで書くアレ。何が違うのでしょうか。

Ignitionがリリースされた際の記事を見てみると、まずcloudinitの課題が書かれていました。

Ignitionはこの問題を解決するために作成されたようです。

ignition.jsonの作成方法

ignition.jsonの例は以下。

ですが、jsonを手で書くのは非常に辛いので既存のcloud-configを変換するツールがあります。

以下のように使います。

ct < cloud-config.yaml

するとjsonが吐かれるのでこれをそのまま使います。

coreos-install -d /dev/sda -C stable -i ignition.json

ignition.jsonとcoreos-cloudinitのバリデータもあります。

container-linux-config-transpilerについては以下で使い方が説明されています。

cloud-configの書き方は以下のドキュメントをつらつら眺めていました。

作成したcloud-config.yamlとignition.json

今回はこんな感じで最小限の設定をやってみました。公開鍵の登録、ネットワークの設定、Dockerの自動起動の設定。

{"ignition":{"config":{},"timeouts":{},"version":"2.1.0"},"networkd":{"units":[{"contents":"[Match]\nName=ens32\n\n[Network]\nDNS=8.8.8.8\nAddress=192.168.1.100/24\nGateway=192.168.1.1\n","name":"ens32.network"}]},"passwd":{"users":[{"name":"core","sshAuthorizedKeys":["ssh-rsa XXXXXXXX"]}]},"storage":{},"systemd":{"units":[{"enable":true,"name":"docker.service"}]}}

感想

ブート時にIgnitionやcloudinitが実行されるという部分についてもう少し詳しく知りたいと思った。どんな感じで実行されるのかいまいち実感出来てない…。

ignition.jsonは最初手で作っていて辛すぎました。もっと目立つところにcontainer-linux-config-transpilerについて書いてほぴい。 😂

cloud-init, coreos-cloudinit, cloud-config, metadata, userdataとか概念が多くて難しい…。AWSとかDigitalocean固有の言葉なのか一般的な話なのか分かり辛い印象…。

参考リンク

インストール方法について。

ignitionについて。

Container Linux Configについて。

cloud-initについて。