MAASを使って物理サーバとVMを簡単に構築/管理できるようにする

物理サーバ上でVMを簡単に立てたり落としたりできる環境がほしかったので、OpenStackの検証をしていました。

とりあえず最新版でVMが建てるために必要な構成を考えてKeystone, Glance, Horizon, Placement, Nova, Neutronをデプロイして、VMが経つところまでいくのに数日かかりました。(実質12時間くらい)VMが経ったのはいいのですが、VMメタデータサーバがうまく通信できていないのでcloud-initが動作せずという感じでこれ以上ゴールデンウィークの時間を使うのがしんどくなり、半ば諦める形でMAASを検証してみたのですが、MAASが自分の用途にかなり合っていたので紹介します。

結論から言うと個人で数台の物理サーバとVM管理する程度だったら構築が本当に簡単なのでおすすめです。

やりたかったこと

遠隔地にある物理サーバ数台を管理して、その上にVMを建てたり落としたりを簡単に管理できるようにする。

VMを建てるだけであれば物理サーバにOSを入れてsshをすればよいのですが、できればどのマシンでどのVMが動いているのかとか、IPアドレスとか、ついでにいろいろ管理したかったのです。 分かっていたことですが、物理サーバ複数台上にVMを建てるのとブロックストレージも使わないような環境だとOpenStackはおおげさすぎました。(単に使ってみたかった)

前提条件

MAASで管理したい各サーバの通信用ポートとIPMIポートはネットワーク的にMAASをインストールするマシンと繋がっている必要があります。サーバの通信用ポートとIPMIポートは同じネットワークでもよいですし、別れていても大丈夫です。通信用のポートに関してはPXE bootする際にDHCPを使うので同一のL2に存在している必要があります。(後述のrack controllerというのを増やすことでスケールします)IPMIがないサーバも管理できますが、MAAS経由でIPMIがないと自動で電源を入れたり、起動設定を変えたりといったことはできません。

管理対象のサーバ

RX200S5

  • CPU: 8コア16スレッド
  • Memory: 16GB
  • HDD: 1TB x 2
  • OS: Ubuntu 18.04

R610

  • CPU: 12コア24スレッド
  • Memory: 48GB
  • HDD: 320GB x2, 1TB x2
  • OS: 未インストール

R610

  • CPU: 12コア24スレッド
  • Memory: 48GB
  • HDD: 1TB x 1
  • OS: 未インストール

その他

  • 将来的には管理対象に入れたいサーバがあと数台

MAASとは

Metal as a Serviceの略でCanonicalが提供している物理サーバ等の管理ソフトウェアです。Metal(物理サーバのこと)といいつつもVMの管理もできちゃいます。

今回は詳しく紹介しませんが、MAASと連携するjujuというソフトウェアを組み合わせるとOpenStackやKubernetes等もWeb UIからぽちぽちするだけで構築できます。

MAASの構成

MAASの最小構成はサーバ1台で十分です。この次で紹介するコマンドを打つだけで以下のすべてがインストールされます。構成がシンプルなので冗長化やバックアップも簡単そうです。

PostgreSQL

MAASが使うDBです。インストール時にユーザ作成やテーブルのマイグレーション作業も自動で行われるので直接触ることはなかったです。

Region Controller

データセンターやリージョン全体を管理する概念です。1つのRegion内で管理されるAZやデータセンタのフロアといった概念も設定で表現できます。 今回は管理したい規模がとても小さいのですべてdefaultのままです。 postgresql(DB), regiond(APIとWeb UI), bind9(DNS), ntpd, squid(http cache proxy), rsyslogdが動いています。

Rack Controller

データセンタのラックを管理する概念です。ラックやラック列といった一定規模のサーバの集合ごとに設置されるイメージです。 今回は管理したい規模がとても小さいのでRegion ControllerとRack Controllerは1つのサーバに同居しています。 rackd, dhcpd, httpd, tftpdが動いています。 regiondが親だとするとrackdは子に相当します。rackdがラック等の一定規模ごとに存在することでデータセンタが大きくなってもスケールします。

MAASのインストール

今回はMAASの管理ノードとしてRX200S6を使うことにしました。ちなみにMAAS上でもVMは作れるので限られたリソースは活用できます。

$ sudo apt-add-repository -yu ppa:maas/stable
$ sudo apt update
$ sudo apt install maas
$ sudo maas init

MAAS URL [default=http://10.55.60.1:5240/MAAS]: http://192.168.0.1:5240/MAAS
Create first admin account:       
Username: admin
Password: ******
Again: ******
Email: admin@example.com
Import SSH keys [] (lp:user-id or gh:user-id): gh:kurochan

githubの公開鍵がインポートできるのでとても楽です。ここでインポートしなくてもあとで追加できますが、ここで追加しておくと作成した物理マシンやVMに自分の公開鍵でログインできるので便利です。

ハマったところ

MAASを動かすだけであれば構築作業は驚くほど簡単でした。

MAASをインストールしたサーバでだけ/var/log/syslogにログが転送されなくなるという現象に悩まされました。(Ubuntuはsyslogはログ発生(/dev/logに書き込み)→journald→rsyslog→/var/log/syslog書き込みという流れでログが転送されます)

いろいろ調査した結果、どうやらmaas-rsyslogというサービスが影響していそうなことまではわかりました。maas-rsyslogというのは、構築対象のサーバのsyslogをMAASに転送してくれるサービスです。プロセス的にはrsyslogで、

$ ps aux | grep -v grep | grep rsyslog
maas     30435  0.0  0.0 363932  4876 ?        Ssl  May05   0:00 /usr/sbin/rsyslogd -n -f /var/lib/maas/rsyslog.conf -i /var/lib/maas/rsyslog.pid
syslog   31712  0.0  0.0 269336  5344 ?        Ssl  May05   0:13 /usr/sbin/rsyslogd -n

syslogユーザで動いている通常のrsyslogに加えて、maasユーザで別のrsyslogが動いていることがわかります。maas用のrsyslogの設定を見た限り特に悪影響を与えるような設定は見当たらなかったのですが、以下の通り、通常のrsyslogの設定ファイル( /etc/rsyslog.conf )を編集し、module(load="imuxsock") の次の行に input(type="imuxsock" socket="/dev/log") の一行を加えたところなおりました。

module(load="imuxsock") # provides support for local system logging
input(type="imuxsock" socket="/dev/log") # ←この行を追加

物理マシンを認識させる

qiita.com

この記事を読みながら進めました。構築対象の物理サーバと同じセグメントに対してDHCPを有効にするとRegion ControllerのDHCPサーバが有効になり、PXE bootができるようになります。

物理マシンにOSをインストールする

物理マシンのboot優先順位をPXE bootが一番になるように設定して再起動します。するとMAASがPXE bootの要求をきっかけにサーバを認識し、IPMIのユーザを自動作成します。 対象サーバを選択し、comissionというボタンを押すとサーバの構成情報をひととおり収集してくれます。

f:id:kuro_m88:20190506183021p:plain

構築したいマシンを選んでデプロイボタンを押すだけで、rackdが対象の物理マシンのIPMIを操作して電源を入れて、PXE bootして自動でOSがインストールされます。複数台同時に構築もできて便利ですね。

f:id:kuro_m88:20190506183112p:plain

OSデプロイ時にRegister as MAAS KVM hostというチェックを入れておくとこの物理マシン上にMAASからVMが作成できるようになります。(ここでチェックを入れなくても既存のホストをKVM hostとして手動で追加する方法もあります)

VMを作成する

VMは物理マシンとちがって最初から存在しないので、作成してあげる必要があります。さきほど追加したKVM hostsはPodというメニューから見られて、ホストマシンを選択するとホストマシンのキャパシティと現在稼働しているVMの一覧が見られます。CPU, メモリのオーバーコミット率も設定できます。

f:id:kuro_m88:20190506183330p:plain

ここで好きなサイズや構成のVMを作成すると、物理マシンと同様にMachineとして認識されます。

f:id:kuro_m88:20190506183205p:plain

VMにOSをインストールする

VMと物理マシンは同様に扱われるため、物理マシンと同様な手順でOSのインストールが可能です。ただし、Comissionは終わった状態になります。

感想

OpenStackと比べなくても構築がびっくりするくらい簡単でよかった。