⚙️

退屈なことはMAAS(Metal as a Service)にやらせよう

2023/02/28に公開1

はじめに

Kubernetesクラスタ作りたいけど、OSのインストールめんどくさいな~って人を対象にしています。

MAAS(Metal as a Service)とはなんぞや?

Ubuntuの開発元、Canonicalが開発しているOSデプロイツール。
仮想マシンをツールから簡単に作れるように、ネットワーク上の物理マシンにOSをデプロイできるすぐれもの。すごいね。(なんと仮想マシンにも使えたりする)
デプロイできるOSはUbuntu, Windows, CentOS, VMWareESXi, Red Hat, RHELです。
https://maas.io/

インストールしよう

構成

今回は図のような構成で行っています。

インストール

本番用の手順に従います。
https://maas.io/docs/how-to-install-maas

前準備

$ sudo apt update -y
$ sudo apt install -y postgresql
$ sudo snap install --channel=3.2 maas
$ export MAAS_DBUSER=maasadmin
$ export MAAS_DBPASS=maasadmin
$ export MAAS_DBNAME=maasdb
$ export HOSTNAME=localhost #もしPostgreSQLと同じマシンにインストールするならlocalhostでおk

PostgreSQLの準備

$ sudo -u postgres psql -c "CREATE USER \"$MAAS_DBUSER\" WITH ENCRYPTED PASSWORD '$MAAS_DBPASS'"
$ sudo -u postgres createdb -O "$MAAS_DBUSER" "$MAAS_DBNAME"

下の内容を/etc/postgresql/14/main/pg_hba.confに追記します。(14の部分はインストールされたPostgreSQLのバージョンに合わせてください)
$MAAS_DBNAME$MAAS_DBUSERは実際の値に置き換えてください。
また、0/0となってるCIDRは、あなたのいいように書き換えちゃってください(私は127.0.0.1/32にしました)。

host    $MAAS_DBNAME    $MAAS_DBUSER    0/0     md5

MAASの初期化

$ sudo maas init region+rack --database-uri "postgres://$MAAS_DBUSER:$MAAS_DBPASS@$HOSTNAME/$MAAS_DBNAME"

するとブラウザからMAASにアクセスする時のURLを聞かれますが、よくわからない方はそのままEnterをッターンしてください。

ブラウザからMAASにアクセスして↓の画像のようになればひとまずインストール成功です。
お疲れ様でした。一旦寝ましょう。

MAASの初期設定

おはようございます。
MAASにアクセスすると、「管理者ユーザー作れ」と言われるので、作りましょう。

下のコマンドを実行します。

$ sudo maas createadmin

ユーザー名とパスワード、メールアドレスを聞かれますので、よしなにしてください。
その後Import SSH keysと、LaunchPadまたはGitHubのアカウント名を聞かれますが、今回は使いませんので、そのままEnterをッターンしてください。

ブラウザに戻り、Retryボタンを押すとログイン画面になるので、先程設定したユーザー名とパスワードでログインします。
色々聞かれますが、デフォルト設定で進めて大丈夫です。
最後にもう一度SSHキーを聞かれるので、クラスタにSSHでアクセスする予定のPCで鍵を発行して、それを貼り付けましょう。
これで初期設定は終わりです。

DHCPの有効化

DHCPの設定をします。Subnetsタブを開き、VLAN列のuntaggedを開きます。

少しスクロールしてConfigure DHCPをクリックします。

Select Rack Controllerとなっているところからmaasを選択します。そしてConfigure DHCPをクリックするとDHCP機能がオンになり、ネットワークブートさせることができるようになります。

ちなみに、DHCPの範囲はReserved rangesを変更することで行なえます。

さあ、退屈なことをやらせよう

Machineの登録

まず、登録したいPCのBIOS設定から、起動順序の一番上にPXE IPv4を設定しておいてください。
設定を保存してシャットダウンしておきます。
登録したいPCのLANをMAASと同じネットワークに接続したら、電源オン!!!!!!!!!!
しばらくしたら、Machinesタブに登録したいPCが現れます。



次にマシン名をクリックして、Power type> をクリックしてください。ここでは電源タイプを設定します。

登録したいPCに合った電源タイプにしましょう。私はめんどくさいのでManualを選びました(ぉ

電源タイプを設定したら、右上のTake actionからCommission...をクリックし、Start commissioning for machineをクリックします。先程設定した電源タイプがManual以外なら自動でPCが起動しているはずです。Manualに設定したあなたは自分でPCの電源を入れに行きましょう。
しばらくしたらステータスがReadyになります。

もうOSはDeployできるのですが、Kubernetesクラスタを作るためにIPアドレスを固定します。
IPアドレスを固定したい場合は、マシン名をクリックしてNetworkタブを開きます。IPアドレスを設定したいNICの右端にある﹀から、Edit Physicalをクリックします。
右下のIP modeをStatic assignにし、IP address欄を好みのIPアドレスにします。

IPアドレスを設定したら、右上のTake actionからAllocate...をクリックし、Allocate machineをクリックします。
・・・みたいなことを計4回繰り返した結果がこれ↓です。いよいよクラスタを作ります。

クラスタの構築

今回使用するディストリビューションはK3sです。選んだ理由はクラスタの構築が簡単すぎるからです。
https://k3s.io/
まずはサーバーノードからインストールします。サーバーにしたいマシンにチェックを入れてTake actionからDeploy...をクリックします。
Cloud-init user-data...にチェックをいれ、下の欄にcloud-configを記述していきます。
下に記述例を載せておきます。参考にどうぞ。

#cloud-config
package_update: true
pakcage_upgrade: true

runcmd:
 - apt-get update -y
 - curl -sfL https://get.k3s.io | sh -

cloud-configの記述が終わったら、Start deployment for machineをクリック!!!!!!例によって電源タイプManualのあなたは電源を入れに行ってください。
Deployが始まりました。温かい目で見守ってあげてください。

無事デプロイ出来ました(一回Failedになったのは内緒)。

後のやり方はもう察してください
先程デプロイしたPCにSSHでアクセスして、K3sのトークンをゲットしましょう。

$ sudo cat /var/lib/rancher/k3s/server/node-token

ワーカーノードにしたいPCにチェックを入れ、サーバーノードと同じようにデプロイします。
そのとき、cloud-configはワーカーノード用に変更しておきます。

#cloud-config
package_update: true
pakcage_upgrade: true

runcmd:
 - apt-get update -y
 - curl -sfL https://get.k3s.io | K3S_URL=https://172.13.100.1:6443 K3S_TOKEN=ここにトークン sh -

無事にすべてのPCにデプロイが完了しました。

マスターノードにログインしてkubectl get nodesしてみましょう。

やったぜ。

お疲れ様でした。あとは煮るなり焼くなり好きにしてください。

最後に

「結局退屈でめんどくさかったよ」って思いましたか?思いましたよね?私も思ってます
初回は大変ですが、一度構築するとクラスタの規模を大きくしたいときに楽ちんです。
これを機にMAASを使ってくれる人が増えればいいなと思っています。ちなみにMAASの競合にForemanというものがありますので、どなたか記事を書いてください(ぉ

別件ですが今回初めてZennの記事を書きました、結構しんどかったです。
これからもめげずに記事を書いていこうと思います。

参考文献

https://maas.io/docs/how-to-install-maas
https://k3s.io/
https://theforeman.org/

Discussion

EVE:/i (いゔ)EVE:/i (いゔ)

NodeのプライベートIPアドレスには突っ込まないでください・・・(後で知って恥ずかしい)