今年11月からおうちクラウドと称して自宅サーバにKubernetesクラスタを構築して使っています。 仕事や興味のあるトピックを自宅で検証できる環境があるのは良いものです。
使い始めるとやりたいことは増えてくるもので、実はここ最近は週1でクラスタを再構築しています。 多くの原因はストレージ(Rook/Ceph, Longhorn)やネットワーク(NGINX Ingress, MetalLB)に関する設定なので、下手にいじるより作り直しで対応しています。
しかし、構築当初からクラスタのNode VMだけは手作業で構築していました。そうなると毎回手作業の構築だと隙間時間ではできない場面が出てきます。もっとカジュアルに作って壊すために、Ubuntuのautoinstallを使ってVM構築を自動化するできないか検証しました。
Ubuntu autoinstallとは
もともとUbuntu ServerにはSubiquityというインストーラがあります。 ISOから起動した時に出てくるオレンジ帯のTUIでポチポチしながらセットアップする画面を提供しています。
autoinstallはUbuntu Serverに設定ファイルを渡すことでセットアップを自動化するしくみです。 設定ファイルはcloud-initを拡張した形式で記述します。
autoinstallの設定ファイルを書いてみる
ここから実際にautoinstallでVMを自動設定します。 UbuntuはUbuntu Server 20.04.3 LTSを使用します。
設定ファイルはcloud-init同様のディレクトリ構成で設定ファイルを配置します。 meta-dataファイルは中身は空のファイルです。 user-dataファイルに設定値を書き込みます。
$ tree template/ template ├── meta-data └── user-data 0 directories, 2 files
VM構築時に実現したいことを列挙します。
- 日本語ロケール/タイムゾーン/キーボードを使用する。
- ホスト名を固定で設定する。
- SSHで接続するが、公開鍵認証のみ許可する。
- 特定のパッケージを入れる。
- インストール済みパッケージを最新化する。
- 固定のIPアドレスを振る。
これらの設定を実現する場合は、以下の内容になります。
IPアドレスの設定だけはリファレンスの network
セクション通りに記載しても設定できませんでした。なので苦肉の策として late-commands
セクションで直接netplanの設定ファイルを書き込むようにしています。
autoinstallで自動設定してみる
設定ファイルを書いたら、Ubuntu Serverに適用して自動インストールしてみます。 設定ファイルはISOファイルに固めた上で、CD/DVDドライブにマウントして適用すればOKです。
ISOファイルへ固める方法はワンライナーで実行可能です。以下はmacOSの場合の例です。
$ hdiutil makehybrid -o $VM_HOST_NAME.iso \ -hfs \ -joliet \ -iso \ -default-volume-name cidata \ template
結局効果はあったのか
ありました。 今まで再構築に1時間以上かかっていましたが、30分程度になったので作業時間を半減できたことになります。 おおよその作業時間の比較を並べます。
作業項目 | Before (時間: 分) | After (時間: 分) |
---|---|---|
VM設定値の保管 | 5 | 1 |
VM作成 | 4VM * 10 | 4VM/2並列 * 6 |
VM疎通確認 | 2 | 2 |
パッケージインストール | 5 | 0 |
Kubernetesクラスタ構築 by Kubespray | 15 | 15 |
疎通確認 | 3 | 3 |
合計 | 70 | 33 |
一番影響が大きかったのはVMごとに手を動かす必要がないので、並列で構築できるようになったことです。VMごとの構築作業短縮と合わせて効果は絶大でした。 また、設定値を全てファイルに記載しているので、設定値を変更するときは直接SSHするのではなく、ファイルの中身を変えてあげれば良いという安心感があります。
参考記事
以上。