Insight into VMware Photon Controller – devbox 03 – Build


はじめに

Insight of ~ ではなく Insight into ~ が普通の言い回し… Orz

Photon Controller の Getting Started Guide には VMware Fusion 向けの Photon Controller 全部入りアプライアンスのダウンロードリンクがあります。しかしながら、このアプライアンスに含まれている Photon Controller は Github 上で公開されているコードよりも古いものであり、すでに公開されて 2 ヶ月が経とうとしている Photon Controller の現在の master からは別物になってきています。

特に Cluster Manager。

このエントリーでは、Photon Controller の最新のコードツリーから、Photon Controller の全コンポーネントを一つの仮想アプライアンスに詰め込んだ Devbox をビルドするところまでを追っていきます。

単純な構成でのビルド環境

Devbox は devbox ディレクトリの Vagrantfile を使って作成します。この Vagrantfile は Shell Provisioning の塊で

  • Photon Controller ビルド用コンテナを起動
  • ビルド用のコンテナ内でコンパイル & パッケージング
  • Devbox の各コンテナ作成
  • Devbox の各コンテナ起動

といった作業を自動化しています。

コンテナでビルドするのは、環境の微妙な差異で嵌まることがなくなるので、非常に良いアイディアだと思うのですよ…。

前提

以下のソフトウェアがインストールされていること。

私の環境では Vagrant 1.8.0、VirtualBox 5.0.10 r104061 で確認しています。

ビルド方法

適当なフォルダに Photon Controller のローカルリポジトリを作成し、ここからビルドしていきます。ビルドといっても Vagrantfile の Shell Provisioning 部分に処理が集中しているため、ユーザーが実行するのは、実質 vagrant up のみと非常にシンプルなモノです。

記事の最後にビルドのログ (VMware Fusion 上の ESXi と接続する構成でのビルド) を載せておきます。

これで開発向けの Photon Controller の各種プロセスを含むコンテナを保持する VirtualBox イメージができあがります。MacbookPro Retina Early 2015 (3.1GHz、2cores、HT) で 7 分弱掛かりました。

Devbox のビルドでは、ローカルリポジトリがソースとしてコンパイルされます。つまり、自身で適当に処理を追加したコードで Devbox を作成できるので、動作の詳細を追ったり、コンテナクラスタ周りの動作を変えたいといった場合に便利に利用できます。

Devbox の動作確認

まず、コンテナが動作しているかを確認します。su のパスワードは “vmware” になります。

次にブラウザで http://localhost:9080/api にアクセスします。このポート番号は、Vagrantfile で NAT が設定されており、仮想アプライアンスの ポート 9000 にフォワードされます。つまり http://localhost:9080/api は Devbox の http://localhost:9000/api にフォワードされ、API FrontEnd の Swagger UI が表示されます。RESTful API に慣れている人は、この画面をドリルダウンするだけで、かなりのことを把握できるのではないかと思います。

photon-controller-swagger-ui

もう一押し、curl で Photon Controller の状態を確認します。Getting Started Guide にある Go 言語で実装された CLI バイナリを使っても良いかも知れません。ここでは整形とカラーリングのために jq コマンドを利用しています。python -m json.tool にパイプしても良いでしょう。

以下は、Photon CLI での実行結果です。API FrontEnd の URL を target に設定し、ステータスを確認しています。

問題点

確かに Devbox はこれで作成できるのですが、ネットワークが VirtualBox の NAT 接続となっており、他のネットワーク エンティティから Devbox に接続できません。例えば ESXi 上の Photon Controller Agent から Devbox 内の Chairman に通信できないため、ESXi を Photon Controller に認識させることにすら辿り着けません。

photon-controller-network-disconnected

ESXi も Nested ESXi として VirtualBox にインストールすれば、確かに通信はできるでしょうが Nested Hypervisor に VirtualBox は対応していません。手元の Mac 一台で、Photon Controller の Devbox と ESXi を連携させるためには、Oracle VirtualBox と VMware Fusion を同居させるという多少の荒行が必要になります。

これが受け容れられない場合は、別サーバーの ESXi か 別 PC/Mac 上の Nested ESXi と合わせての構成をご検討下さいませ。原因を解決するところまで辿り着けていませんが、VMware Fusion の ESXi と VirtualBox 上の Devbox の通信経路が途絶えることがしばしばある (特にサスペンドからの復帰時) ので、ちょいちょい再起動で誤魔化しています。

VMware Fusion 上の ESXi と接続する構成でのビルド

前提

VMware Fusion と Oracle VirtualBox の共存は非常にキモいところです。しかし、Photon Controller と ESXi を同一の Mac 上で動かすためにはやむを得ません。

  • Photon Controller Devbox の Vagrant Shell Provisioning が VirtualBox を前提としてる
  • Oracle VirtualBox が Intel VT-x に対応しておらず Nested Hypervisor を稼働できない

ということで、1 台の Mac 上で Photon Controller を試しきるために、VMware Fusion と Oracle VirtualBox の共存を試みます。

もちろん Devbox を VMware Fusion でビルドできるように Vagrantfile を修正すべしという話はありますが、Vagrant の VMware Plugin のお値段が… $79 (2016/01/10 現在) とか お〜えすえす企業 コワイ。

解決

2 つのデスクトップハイパーバイザーを混ぜることで、色々解決方法はあるかと思います。このエントリでは Devbox の 2 個目の NIC を追加し、これを VMware Fusion の vmnet8 インターフェースにブリッジさせることで、Oracle VirtualBox 上の Devbox と VMware Fusion 上の ESXi の疎通を計ります。

構成

前述の内容を図にすると以下のようになります。

photon-controller-devbox-network

Devbox の 2 個目の NIC を vmnet8 にブリッジさせるところが肝になります。私の環境の vmnet8 ネットワークのアドレスは、

  • Class A を使いたい
  • 10.0.0.0/8 は諸般事情で厳しい。Class B の 172.16.0.0/16 も同様。
  • 縁の無さそうな組織のネットワークアドレスから拝借

というダメ エンジニア的思考で 22.0.0.0/8 となっており、お行儀がよろしくないので適宜アドレスを設定をお願い致します。

環境変数

Devbox をビルドする際に利用できる環境変数は devbox-photon/README.md に記載されています。かなり数が多いのですが、ここでは今回利用するものに絞って紹介致します。

環境変数値の例説明
PUBLIC_NETWORK_IP22.31.1.1Devbox の 2 個目の NIC の IP アドレス
PUBLIC_NETWORK_NETMASK22.0.0.0Devbox の 2 個目の NIC のネットマスク
PUBLIC_NETWORK_GATEWAY22.255.255.254Devbox の 2 個目の NIC のゲートウェイ
REAL_AGENTtrueFake Agent でなく実施の ESXi を対象とするためのオプション。ここでは Nested とはいえ実際の ESXi を利用するので true
ESXI_IP22.31.1.101OVA/OVF で仮想マシンのイメージをアップロードする先の ESXi の IP アドレス。API FrontEnd の設定ファイルに反映される。
ESX_DATASTOREdatastore1OVA/OVF で仮想マシンのイメージをアップロードする先の ESXi のデータストア名。VMware Fusion で Nested ESXi で作成するとデフォルトで HDD 40GB となるのでこれで十分。必要に応じて容量や名前を変更して下さい。
BRIDGE_NETWORKvmnet8Devbox の 2 個目の NIC をブリッジさせるネットワーク インターフェース名。ifconfig で表示される名前を指定する。

確認

上記環境変数が設定されていることを確認し、vagrant up をやり直します。

おわりに

これで ESXi と Photon Controller Devbox が通信できるところまで辿り着けました。次のエントリでは、ESXi ホストを Photon Controller に追加し、CloudStore を curl で弄りながら仮想マシンを展開するところまでを辿ります。

vagrant up によるビルドログ