CentOS7.3とoVirtとGlusterFSによるOSS版ハイパーコンバージドインフラ(構築編)

# はじめに

oVirtはRHEV(Red Hat Enterprise Virtualization)のアップストリームにあたるOSSで、商用の仮想化製品と同等の機能が無償で利用できるKVM仮想化基盤ソフトです(単なるKVMの管理ソフトを探している人は手を出さないことをお勧めします)。開発速度が早く日本語の最新情報は少ないですが、コミュニティーMLの投稿は活発で、Red Hatの開発者を中心に現在も開発が精力的に進められているようです。

昨年末に[Hyperconverged Infrastructure using oVirt and Gluster](http://blogs-ramesh.blogspot.jp/2016/01/ovirt-and-gluster-hyperconvergence.html)のblogを発見して、oVirtがGlusterFSと組み合わせたハイパーコンバージド構成を推進していることを知り使ってみたところ、共有ディスクを用意することなく仮想化基盤が作れるため小規模構成に向いていると感じました。しかしながら実際に構築しようとすると、oVirt4.1系で構築方法がCLIベースからWebベースになるという大きな変更があったこともあり、正規の手順が見当たりませんでしたのでノウハウを共有したいと思います。

3台のホストのローカルディスクをGlusterFSのreplicatedを使って冗長化します。ディスク容量が1/3しか使えないというデメリットと(後述のArbiter機能である程度改善可能)、oVirtが動作することによるオーバーヘッドというデメリットがありますが、その代わりに商用仮想化製品の持つメリットを享受できます。oVirt+GlusterFSの最小構成は以下の図のようになります。
![pic01.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/54fab383-e2e4-4fd1-a16f-8b5eac789100.png)

本記事ではまずoVirtとGlusterFSを使用した仮想インフラ基盤の構築手順について紹介します。そして次の記事[CentOS7.3とoVirtとGlusterFSによるOSS版ハイパーコンバージドインフラ(運用編)](http://qiita.com/infrajp/items/a5602e993e74205853b7)ではゲストOSの作成手順と、作成したゲストOSのスナップショット作成、クローン作成、ライブマイグレーション、ゲストHA、ホストHAといった運用に役立つ機能を紹介します。

# 環境

## ハードウェア構成

本環境ではローエンドなNUCを使用していますがoVirtのオーバーヘッドを考慮するとよりハイスペックなマシンを使用することをお勧めします(下記性能の場合、各ホストのCPU使用率が常時30%程度あり、Hosted-Engineが稼動するホストはメモリー使用率も75%程度ありました。)

|      ホスト名      |      機種      |      CPU      |      Memory      |      HDD      |
|:-----------------:|:--------------:|:-------------:|:----------------:|:-------------:|
| host1 | DN2820FYKH | Celeron 2core | 8GB | SSD 120GB |
| host2 | DN2820FYKH | Celeron 2core | 8GB | SSD 120GB |
| host3 | NUC5CPYH | Celeron 2core | 8GB | SSD 120GB |

IPアドレスは分かりやすいように以下の通りシンプルな構成にしています。本記事では下記を前提に説明していきます。

![pic02.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/f4e25eea-ce51-ffc1-c476-13d7f71a92c4.png)


## ソフトウェアバージョン

2017/4/7時点の最新のoVirtを使用しています。oVirtは開発サイクルが早いのですぐに新しいバージョンが出ると思われますが、インストール方法が大幅に変わったばかりなのでしばらくは本記事の手順が生かせると思います。

|      OS      |      oVirt      |      GlusterFS      |
|:-----------------:|:--------------:|:-------------:|
| CentOS 7.3.1611 | 4.1.1.6 | 3.8.10 |

# 構築手順

## CentOS7 インストール(host1,host2,host3共通手順)

細かい手順は省略します。本環境ではソフトウェアの選択は「最小限のインストール」を選択しています。ディスクサイズが120GBしかないためルートパーティションに15GBだけ割り当て、oVirt用のパーティションはOSインストール後に作成します。

|      マウントポイント      |      サイズ      |
|:-----------------:|:--------------:|
| /boot/efi | 0.5GiB |
| /boot | 0.5GiB |
| swap | 4GiB |
| / | 15GiB |

インストールが完了したらyumアップデートします。

```
# yum -y update
# shutdown -r now
# uname -a
Linux host1 3.10.0-514.10.2.el7.x86_64 #1 SMP Fri Mar 3 00:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
```

**名前解決**

各ホスト同士はホスト名でSSHログインできる必要があります。DNS環境がない場合はhostsを設定して下さい。

```sh:/etc/hosts
192.168.12.101 host1 host1.jitaku.test
192.168.12.102 host2 host2.jitaku.test
192.168.12.103 host3 host3.jitaku.test
192.168.12.111 ovirt-engine ovirt-engine.jitaku.test
```

クライアント端末からもホスト名でアクセスできるように設定します。Windowsの場合は以下のように設定して下さい。

```C:\Windows\System32\drivers\etc\hosts
 192.168.12.101 host1 host1.jitaku.test
 192.168.12.102 host2 host2.jitaku.test
 192.168.12.103 host3 host3.jitaku.test
 192.168.12.111 ovirt-engine ovirt-engine.jitaku.test
```

**パーティション作成**

oVirt用のパーティション(本環境では/dev/sda4)を作成します。本環境では/dev/sda4に全空き容量の90GB程度を割り当てました。

```
# ls /dev/sda*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3
# gdisk /dev/sda
# shutdown -r now
# ls /dev/sda*
 /dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sda4
```

**公開鍵の登録**

各サーバ間はSSHでパスワードレスのrootログインをできるようにします。各サーバでそれぞれ下記を実行して下さい。

```
# ssh-keygen -N "" -t rsa
# ssh-copy-id root@host1
# ssh-copy-id root@host2
# ssh-copy-id root@host3
```

その他、各自の環境に応じたOS設定を行って下さい。

なおfirewalldやSELINUXは後ほど実施するデプロイ時に自動設定されるため癖で(?)止めないようにして下さい。

## Hosted Engineのデプロイ

**oVirt hosted engine と vdsm package、cockpit UIのインストール(host1,host2,host3共通手順)**

oVirtのリポジトリーパッケージをインストールして必要なパッケージをyumで一括ダウンロードします。

```
# yum install http://resources.ovirt.org/pub/yum-repo/ovirt-release41.rpm
# yum -y install screen ovirt-hosted-engine-setup vdsm-gluster ovirt-engine-appliance gdeploy cockpit cockpit-ovirt-dashboard cockpit-ovirt-uiplugin
# systemctl start cockpit
# systemctl enable cockpit.socket
# firewall-cmd --zone=public --add-port=9090/tcp --permanent
# firewall-cmd --reload
```

*以降はhost1のみで実施します。*

**基本設定(Logical Volume、GlusterFS Volume、SELINUX、Firewalld等)のデプロイ(host1のみで実施)**

Cockpit UIをインストールするとホストに直接ブラウザアクセスすることができるようになりますので、以下のURLにアクセスしてストレージ設定やHosted Engine(VMwareのvCenterにあたる管理用VM)のインストールを行います。

```
https://host1:9090/ovirt/ovirt
```

ログイン画面が表示されたらhost1のOSのログインIDとPWを入力してログインします。
![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/6d3d6b96-6e44-94c7-e37f-92986332b5b6.png)


Virtualization -> Hosted Engine をクリックして「Hosted Engine with Gluster」を選択しStartをクリックします。
![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/fddb7f46-1f92-54e4-fe5b-9058395940b5.png)


クラスタを構成するホスト名を入力します。ここで入力するホスト名にはhost1からパスワードレスでSSHできる必要があります。
![03.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/3a4adb7c-c647-69de-c739-cab5638079b2.png)


リポジトリ名は空で構いません。
![04.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/02fbc2e2-53e5-1a27-e27a-b74a38eccb27.png)


GlusterFSの詳細パラメータの設定を行います。ここでは、Hosted Engine用の「engine」、仮想マシン保存用の「data」、仮想マシンインストールに使用するISOイメージ保存用の「iso」の3つのボリューム用にブリックを指定しています(ディレクトリは自動的に作成されるため前もって作成しておく必要はありません)。「iso」のブリック(本環境では/gluster/iso/brick1)は仮想マシン作成用にISOイメージをアップロードする際に必要になりますので覚えておいて下さい。
ちなみにArbiterはスプリットブレインを回避しつつディスク使用量を削減できるGlusterFSの機能です(詳しくは[oVirtの公式Blog](https://www.ovirt.org/feature/gluster-arbiter-volume/)を参照して下さい。)。本記事ではArbiterを使わずに進めますが、ファイル数が少ない場合にはArbiterを有効にすると3台目のディスク使用量を大きく減らすことができますので、例えば複数ブリックを作成してArbiterノードを分散させることで全体のディスク使用効率を上げることが可能です。また、ブリックを1つしか作らない場合でも、Arbiterノードにバックアップファイルを保存する等で使用効率を高めることもできます。
![05.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/7a17766b-10e7-fe69-44c2-3c3907b748b5.png)

ディスク周りの詳細設定です。上部にRAID設定がありますが、本環境では各サーバはディスクを1つしか搭載していないためRaid TypeにはJBODを選択しています。
次に下部にある各ボリュームのサイズを設定します。Hosted Engineの要件として20GB以上が必要なため、engineボリュームは少し余裕を見て21GBにしています。isoボリュームはISOイメージを2つは置けるように10GBにしています。dataには残りの領域を割り当てています。ちなみにここでThinpにチェックを入れることでLogical Volume自体をThin provisioningにすることも可能ですが、後ほど仮想マシンを作成する際に仮想マシン単位で設定することが可能なためチェックを入れていません。
![06.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/db067fb1-7041-4988-1e3d-a351f37d50eb.png)


最後に確認画面が表示されます。ここで細かい修正が可能なようですが特に修正する必要はありませんのでそのままDeployをクリックします。
![07.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/21379324-0d49-8bd0-a507-df82fa078dd9.png)


各ホストに対してLVMやGlusterFS、Firewalld、SELINUXの設定などが自動的に行われるのでしばらく待ちます(Ansibleを使っているようです。)
![08.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/8c637c5a-0c3e-6981-e930-131c590589b3.png)


以下のような画面になれば正常にデプロイ完了です。そのまま「Continue to Hosted Engine Deployment」をクリックしてHosted Engineのデプロイに進みます。
![09.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/e0784184-9409-4cb7-b3df-f8287483b9a4.png)


**Hosted Engineのデプロイ(host1のみから実施)**

ここまでの作業でHosted Engine用のディスクが作成されていますので、問いに答えて行くことでインストールまで完了します。

以降はページ容量削減のためテキストベースで内容を記載していきます(太字が本環境での回答内容です)。
![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/2d1b1a46-f056-37e8-787b-12876b0e30d3.png)

Continuing will configure this host for serving as hypervisor and create a VM where you have to install the engine afterwards.
 Are you sure you want to continue? **Yes**

 --------------------------------------------

Do you want to configure this host and its cluster for gluster? (Yes, No) [No]:**Yes**

 --------------------------------------------

Please indicate a pingable gateway IP address [192.168.12.1]: **192.168.12.1**

完了にあわせてデフォルトルートを設定します。
 --------------------------------------------

Please indicate a nic to set ovirtmgmt bridge on: (enp3s0, enp0s20u1) [enp3s0]: **enp3s0**

 --------------------------------------------

Please select an appliance (1, 2) [1]: **1**

 --------------------------------------------

Would you like to use cloud-init to customize the appliance on the first boot (Yes, No)[Yes]?
**Yes**

 --------------------------------------------

Would you like to generate on-fly a cloud-init ISO image (of no-cloud type)
 or do you have an existing one (Generate, Existing)[Generate]?
**Generate**

 --------------------------------------------

Please provide the FQDN you would like to use for the engine appliance.
 Note: This will be the FQDN of the engine VM you are now going to launch,
 it should not point to the base host or to any other existing machine.
 Engine VM FQDN: (leave it empty to skip): []:
**ovirt-engine.jitaku.test**

 --------------------------------------------

Please provide the domain name you would like to use for the engine appliance.
 Engine VM domain: [jitaku.test]
**jitaku.test**

 --------------------------------------------

Automatically execute engine-setup on the engine appliance on first boot (Yes, No)[Yes]?
**Yes**

 --------------------------------------------

Enter root password that will be used for the engine appliance (leave it empty to skip):
**[パスワードを入力]**

 --------------------------------------------

Confirm appliance root password:
**[パスワードを入力]**

 --------------------------------------------

Enter ssh public key for the root user that will be used for the engine appliance (leave it empty to skip):
**未入力(空白のまま)**

--------------------------------------------

Do you want to enable ssh access for the root user (yes, no, without-password) [yes]:
**Yes**

 --------------------------------------------

Please specify the memory size of the VM in MB (Defaults to maximum available): [6704]:
**6704**

メモリー搭載量に応じてデフォルト値が変わりますのでHosted Engineに割り当てる量を修正して下さい(4GBでは厳しいと思います。)
 --------------------------------------------

Please specify the CPU type to be used by the VM [model_Nehalem]:
**model_Nehalem**

 --------------------------------------------

Please specify the number of virtual CPUs for the VM (Defaults to appliance OVF value): [4]:
**2**

 --------------------------------------------

You may specify a unicast MAC address for the VM or accept a randomly generated default [00:16:3e:XX:XX:XX]:
**00:16:3e:XX:XX:XX**

 --------------------------------------------

How should the engine VM network be configured (DHCP, Static)[DHCP]?
**Static**

 --------------------------------------------

Please enter the IP address to be used for the engine VM [192.168.12.2]:
**192.168.12.111**

任意のHosted EngineのIPアドレスを入力します。
 --------------------------------------------

Please provide a comma-separated list (max 3) of IP addresses of domain name servers for the engine VM
 Engine VM DNS (leave it empty to skip) [AAA.AAA.AAA.AAA,BBB.BBB.BBB.BBB]:
**AAA.AAA.AAA.AAA,BBB.BBB.BBB.BBB**

OSに設定しているDNSサーバのアドレスが自動設定されます(各自の環境に読み替えて下さい。)

 --------------------------------------------

Add lines for the appliance itself and for this host to /etc/hosts on the engine VM?
 Note: ensuring that this host could resolve the engine VM hostname is still up to you
 (Yes, No)[No]
**Yes**

 --------------------------------------------

Enter engine admin password:
**[パスワードを入力]**

 --------------------------------------------

Confirm engine admin password:
**[パスワードを入力]**

 --------------------------------------------

Please provide the name of the SMTP server through which we will send notifications [localhost]:
**localhost**

 --------------------------------------------

Please provide the TCP port number of the SMTP server [25]:
**25**

 --------------------------------------------

Please provide the email address from which notifications will be sent [root@localhost]:
**root@localhost**

 --------------------------------------------

Please provide a comma-separated list of email addresses which will get notifications [root@localhost]:
**root@localhost**

 --------------------------------------------

Please confirm installation settings (Yes, No)[Yes]:
**Yes**

 --------------------------------------------

ここまで設定が終わったらデプロイが始まりますので完了するのを待ちます。
![39.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/e91b2647-899b-60c7-8dfd-1fb3de4b460f.png)

--------------------------------------------

「Hosted Engine Setup successfully completed!」が表示されたら完了です。
![40.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/f865e3db-2b9d-d1e6-2760-60f4d1465eab.png)


--------------------------------------------


**Hosted Engineデプロイ後の確認**

以下のようにCockpit UIで設定した内容で自動設定が行われていることが確認できます。

```
# lvs
   LV                VG              Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
   root              cl_host1        -wi-ao---- 15.00g
   swap              cl_host1        -wi-ao----  4.00g
   gluster_lv_data   gluster_vg_sda4 -wi-ao---- 60.00g
   gluster_lv_engine gluster_vg_sda4 -wi-ao---- 21.00g
   gluster_lv_iso    gluster_vg_sda4 -wi-ao---- 10.00g

# gluster peer status
 Number of Peers: 2

 Hostname: host2
 Uuid: 7d40a7a9-0ffa-4231-9cc8-9bba873d980c
 State: Peer in Cluster (Connected)

 Hostname: host3
 Uuid: 9b77feb3-d150-4003-94ea-ba0c7362c08f
 State: Peer in Cluster (Connected)
```

## Hosted Engineの基本設定

**Hosted Engineへのログイン**

ブラウザから以下のURLにアクセスするとoVirt Managerが開きますので、「管理ポータル」リンクをクリックします。

```
https://ovirt-engine.jitaku.test
```

![41.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/2e21de7d-2f6e-a8a7-1c95-8dbb8891e9ff.png)


IDは「admin」、PWは先ほどHosted Engineのdeployで指定したものを入力します。
![42.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/d429dbe6-1c93-b5ed-7323-2dd11aabf687.png)


ログインに成功するとダッシュボードが開きます。
![43.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/ffe10660-28f5-d53b-b03b-c6d9ab5bfda8.png)


**dataドメインとengineドメインの追加**

上部のストレージタブを選択して「新規ドメイン」をクリックし、以下のように入力することでdataドメインを追加します。
![45.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/81d29197-f85e-9a2e-73cf-8144068cdc1f.png)


OKをクリックすると、dataドメインとともにengineドメインも追加されて最終的に以下のような状態になります。
![46.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/f8eca811-de84-9a4a-94d6-a7177a3049c0.png)


**ホストの追加**

上部メニューのホストタブを選択して「新規作成」をクリックし、host2を追加します。host2のIPアドレスとOSにログインする際のパスワードを入力します。
![49.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/4623bd9f-3e2f-753c-1191-84f24fc14ae2.png)


次に左側にあるセルフホストエンジンタブをクリックして「デプロイ」を選択することでHosted Engineをhost2にデプロイします。本設定によりhost2でもHosted Engineを起動できるようになります。複数のHosted Engineを同時に起動することはできませんが、障害時にHosted Engineがhost2へフェイルオーバーできるようになります。
![50.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/d1e302e0-79ed-0fca-441e-b2ee0fe9e34e.png)


以上で設定完了です。NUCには電源管理機能がないことから電源管理設定をしていないためワーニングが出ましたがOKで問題ありません。
![51.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/ecabe70d-a289-09d0-ebff-9e752a49d6ee.png)


同じ要領でhost3も追加します。
![52.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/c96ebd4c-ff45-de98-ba2c-33ec88055893.png)
![53.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/48e24793-9ecf-3a3f-f626-b26dad24b3f9.png)


追加後、まず、host2とhost3のステータスがInstallingになります。
![54.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/51fd1159-b1ee-534c-1087-33d713281351.png)


ステータスがUpになってしばらくすると左の方にエクスクラメーションマークのアイコンが表示されますが、これはHosted Engineのインストール中を表しています。
![55.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/38949300-80f0-189f-e1d5-41fc15bb9596.png)


エクスクラメーションが取れて最終的にシルバーの冠のようなアイコンがhost2とhost3に表示されればHosted Engineのデプロイまで完了しています。
![56.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/2533457c-4712-6b61-4f49-2467c95dad47.png)

※実際には以下のコマンドを実行してログが定期的に出力されている場合はまだ完全には完了していませんので障害試験等は安定するまでやらない方が無難です。ちなみに本環境の非力なNUCでは安定するまで1～2時間程度を要しました。

```
[root@host1 ~]# tail -f /var/log/vdsm/vdsm.log
```

**ISOドメインの追加**

dataドメインを追加した要領でisoドメインも追加します。上部のストレージタブを選択して「新規ドメイン」をクリックし、以下のように入力することでisoドメインを追加します。
![57.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/aac7a9dc-b463-19af-43b1-72a82f8b81bb.png)


以下のようにISOドメインのステータスがActiveになったら完了です。
![58.PNG](https://qiita-image-store.s3.amazonaws.com/0/165176/db41787f-1387-1f13-e26a-aa73cb769f14.png)


# 最後に

以上でホストのセットアップは完了です。このまま続けたいところですが長くなってきましたので記事を分割します。

次の記事[CentOS7.3とoVirtとGlusterFSによるOSS版ハイパーコンバージドインフラ(運用編)](http://qiita.com/infrajp/items/a5602e993e74205853b7)では、まずゲストOSの作成手順について説明します。

その後、作成したゲストOSのスナップショット作成、クローン作成、ライブマイグレーション、ゲストOS障害時のHA動作、ホストOS障害時のHA動作といった基本的なオペレーション手順について紹介します。

# 参考文献
[Hyperconverged Infrastructure using oVirt and Gluster](http://blogs-ramesh.blogspot.jp/2016/01/ovirt-and-gluster-hyperconvergence.html)
[CentOS7.1にKVMハイパーバイザーを構築してoVirtで管理してみる Part.1](http://qiita.com/ine1127/items/1bc2f2ff12f38e19ba9a)
[oVirt Blog](https://www.ovirt.org/)
[oVirt Users Archive](http://lists.ovirt.org/pipermail/users/)
[oVirt and Gluster hyper-converged!](http://www.linux-kvm.org/images/5/51/03x04-Martin_Sivak-oVirt_and_gluster_hyperconverged.pdf)