CentOS6.4+KVMで作るCloudStack環境

　社内の仮想環境基盤として、Wakame-vdcとkaresansuiをインストールしてみたが、どうも機能的に足りない。（要件としては、1台のサーバで運用して、長期的には複数台に増やす。Linux、Windows環境も対応する。）

　そこで要件に対応できそうなCloudStackをインストールしてみたいと思う。
　あとでインストール作業をシェルにまとめるつもり。

　とりあえず、全部ローカルにインストールするつもりで記載をする。

　あととりあえず起動するところまでは確認していますが、それ以降は確認していないので、参考にする場合にはそのつもりで。

**まだ仮想ルーターが正常に認識しないようだ。意見募集中。シングルノードではやはり動かないのかな？**

# ネットワーク構成
| サーバ名 | IPアドレス |
|:-----------|------------:|
| 管理サーバ | 192.168.0.165 |
| ストレージサーバ | 192.168.0.166 |
| KVMサーバ | 192.168.0.170 |


# システム要件
とりあえず、システム要件を以下に記載する。

## 管理サーバー、データベース、およびストレージ

|  |  |
|:-----------|------------:|
| OS | CentOS/RHEL 6.3+ もしくは Ubuntu 12.04(.1) |
| CPU | 64-bit x86 CPU |
| メモリ | 4GB以上 |
| HDD | 50 GB以上(但し、管理サーバは500GB以上推奨) |
| NIC | 最低1つ以上 |
| IP | 静的に割り当てられた IP アドレス(3つ以上) |
| ドメイン | hostname コマンドで返される完全修飾ドメイン名 |

## ホスト/ハイパーバイザー(KVM)
|  |  |
|:-----------|------------:|
| CPU | ハードウェア仮想化技術CPU |
| メモリ | 4GB以上 |
| HDD | 36 GB以上 |
| NIC | 最低1つ以上 |
| libvirt | 0.9.4以上 |
| Qemu/KVM | 1.0以上 |
※ CloudStackをインストールする際には、先にKVMが動作している事が必要。
※クラスタリングする場合は、全て同じCPUであること。

仮想CPUに対応しているかどうかは以下のコマンドで確認できる。
対応CPUのはずなのに、有効じゃない場合はBIOSの設定を見直す。

```sh:IntelCPUの場合、flagsの中にvmxが表示される
$ cat /proc/cpuinfo | grep flags
flags           : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl vmx smx est tm2 cx16 xtpr lahf_lm
```

```sh:AMDCPUの場合、flagsの中にsmvが表示される
$ cat /proc/cpuinfo | grep flags
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good extd_apicid pni cx16 lahf_lm cmp_legacy smv extapic cr8_legacy
```

# OSの設定
## OSのインストール
CentOS6.4をminimalでインストール
※*他のソフトウェアをインストールして、作業を行うと、
　不具合が発生する可能性があるので、気をつけること*

## ローカルのNICに3つのIPアドレスを設定する。
```sh:管理サーバー用
$ cat <<_EOF_ > /etc/sysconfig/network-scripts/ifcfg-eth0
> TYPE=Ethernet
> DEVICE=eth0
> BOOTPROTO=static
> IPADDR=192.168.0.165
> NETMASK=255.255.255.0
> ONBOOT=yes
> _EOF_
```

```sh:ストレージサーバー用
$ cp /etc/sysconfig/network-scripts/ifcfg-eth0{,:0}
$ sed -i 's/DEVICE=eth0/DEVICE=eth0:0/g' /etc/sysconfig/network-scripts/ifcfg-eth0:0
$ sed -i 's/BOOTPROTO=static/BOOTPROTO=none/g' /etc/sysconfig/network-scripts/ifcfg-eth0:0
$ sed -i 's/IPADDR=192.168.0.165/IPADDR=192.168.0.166/g' /etc/sysconfig/network-scripts/ifcfg-eth0:0
```

```sh:仮想環境用
$ cp /etc/sysconfig/network-scripts/ifcfg-eth0{,:1}
$ sed -i 's/DEVICE=eth0/DEVICE=eth0:1/g' /etc/sysconfig/network-scripts/ifcfg-eth0:1
$ sed -i 's/BOOTPROTO=static/BOOTPROTO=none/g' /etc/sysconfig/network-scripts/ifcfg-eth0:1
$ sed -i 's/IPADDR=192.168.0.165/IPADDR=192.168.0.167/g' /etc/sysconfig/network-scripts/ifcfg-eth0:1
```

ネットワークの設定の確認

```sh:ifconfigでネットワーク設定の確認
$ ifconfig
eth0      Link encap:Ethernet  HWaddr BC:5F:F4:1E:80:11
          inet addr:192.168.0.165  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: 2408:49:9fff:b09:be5f:f4ff:fe1e:8011/64 Scope:Global
          inet6 addr: fe80::be5f:f4ff:fe1e:8011/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:561 errors:0 dropped:0 overruns:0 frame:0
          TX packets:652 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:83658 (81.6 KiB)  TX bytes:74339 (72.5 KiB)

eth0:0    Link encap:Ethernet  HWaddr BC:5F:F4:1E:80:11
          inet addr:192.168.0.166  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth0:1    Link encap:Ethernet  HWaddr BC:5F:F4:1E:80:11
          inet addr:192.168.0.167  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:32 errors:0 dropped:0 overruns:0 frame:0
          TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2276 (2.2 KiB)  TX bytes:2276 (2.2 KiB)
```

## hostsの設定

```sh:hostsに管理サーバー、ストレージサーバー、仮想環境用のhostを設定
$ echo "192.168.0.165 manage01.local" >> /etc/hosts
$ echo "192.168.0.166 nfs01.local" >> /etc/hosts
$ echo "192.168.0.167 kvm01.local" >> /etc/hosts
```

# ホスト/ハイパーバイザー(KVM)のインストール

## ntpの設定を行う

```sh:ntpをインストールする
$ yum install -y ntp
$ sed -i 's/server 0.centos.pool.ntp.org/#server 0.centos.pool.ntp.org/g' /etc/ntp.conf
$ sed -i 's/server 1.centos.pool.ntp.org/#server 1.centos.pool.ntp.org/g' /etc/ntp.conf
$ sed -i 's/server 2.centos.pool.ntp.org/#server 2.centos.pool.ntp.org/g' /etc/ntp.conf
$ sed -i '/#server 2.centos.pool.ntp.org/a\server ats1.e-timing.ne.jp iburst' /etc/ntp.conf
$ sed -i '/#server 2.centos.pool.ntp.org/a\server ntp3.jst.mfeed.ad.jp iburst' /etc/ntp.conf
$ sed -i '/#server 2.centos.pool.ntp.org/a\server ntp2.jst.mfeed.ad.jp iburst' /etc/ntp.conf
$ sed -i '/#server 2.centos.pool.ntp.org/a\server ntp1.jst.mfeed.ad.jp iburst' /etc/ntp.conf
$ sed -i '/#server 2.centos.pool.ntp.org/a\server ntp.nict.jp iburst' /etc/ntp.conf
$ ntpdate -b ntp.nict.jp
$ /etc/init.d/ntpd start
$ chkconfig ntpd on
```

ntpqコマンドで設定の確認

```sh:ntpq
$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp-b2.nict.go. .NICT.           1 u   33   64   17    8.016    0.161   0.086
+ntp1.jst.mfeed. 172.29.2.50      2 u   29   64   17    4.603    0.311   0.137
-ntp2.jst.mfeed. 133.243.236.17   2 u   28   64   17    4.595    0.395   0.051
-ntp3.jst.mfeed. 172.29.3.60      2 u   30   64   17    4.701    0.462   0.068
*61-114-187-55.s .PPS.            1 u   26   64   17    6.369    0.148   0.173
```


## ローカルFQDNの設定

```sh:hostnameコマンドでfqdnを確認
$ hostname --fqdn
manage01.local
```

上記で、『hostname: 不明なホスト』となった場合、

```sh:/etc/hostsと/etc/sysconfig/networkを書き換え、FQDNを設定する。
$ sed -i 's/127.0.0.1   localhost/127.0.0.1   manage01.local localhost/g' /etc/hosts
$ sed -i 's/HOSTNAME=\+/HOSTNAME=manage01.local/g' /etc/sysconfig/network
$ sysctl kernel.hostname=manage01.local
$ sed -i '/kernel.shmall = 4294967296/a\\nkernel.hostname=manage01.local' /etc/sysctl.conf
```

※今回はmanage01.localを管理用FQDNとして利用している。

## CloudStackエージェントのインストール

```sh:CloudStackエージェントのインストール
$ yum erase -y qemu-kvm
$ yum erase -y libvirt-java
$ cat <<_EOF_ > /etc/yum.repos.d/cloudstack.repo
> [cloudstack]
> name=cloudstack
> baseurl=http://cloudstack.apt-get.eu/rhel/4.0/
> enabled=1
> gpgcheck=1
_EOF_
$ yum install -y --nogpgcheck cloud-agent
```

※最新の情報は[こちら](http://cloudstack.apache.org/downloads.html)を参照

## libvirtdの設定

```sh:libvirtdの設定
$ sed -i 's/#listen_tls = 0/listen_tls = 0/g' /etc/libvirt/libvirtd.conf
$ sed -i 's/#listen_tcp = 1/listen_tcp = 1/g' /etc/libvirt/libvirtd.conf
$ sed -i 's/#tcp_port = "16509"/tcp_port = "16509"/g' /etc/libvirt/libvirtd.conf
$ sed -i 's/#auth_tcp = "sasl"/auth_tcp = "none"/g' /etc/libvirt/libvirtd.conf
$ sed -i 's/#mdns_adv = 1/mdns_adv = 0/g' /etc/libvirt/libvirtd.conf
$ sed -i 's/#LIBVIRTD_ARGS="--listen"/LIBVIRTD_ARGS="--listen"/g' /etc/sysconfig/libvirtd
$ /etc/init.d/libvirtd restart
```

## SElinuxの設定

```sh:SElinuxの設定
$ sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
$ setenforce permissive
```

## ファイアーウォールの設定

```sh:iptableの設定を行う
$ iptables -I INPUT -p tcp -m tcp --dport 22 -j ACCEPT
$ iptables -I INPUT -p tcp -m tcp --dport 1798 -j ACCEPT
$ iptables -I INPUT -p tcp -m tcp --dport 16509 -j ACCEPT
$ iptables -I INPUT -p tcp -m tcp --dport 5900:6100 -j ACCEPT
$ iptables -I INPUT -p tcp -m tcp --dport 49152:49216 -j ACCEPT
$ /etc/init.d/iptables save
$ /etc/init.d/iptables restart
```

```sh:iptableの設定の確認を行う
$ /etc/init.d/iptables status
```

# 管理サーバーのインストール

```sh:cloud-clientのインストール
$ yum install -y --nogpgcheck cloud-client
```

## MySQL Serverの設定

```sh:MySQLServerの設定
$ yum install -y mysql-server
$ sed -i '/\[mysqld\]/a\binlog-format = ROW' /etc/my.cnf
$ sed -i '/\[mysqld\]/a\log-bin=mysql-bin' /etc/my.cnf
$ sed -i '/\[mysqld\]/a\max_connections=350' /etc/my.cnf
$ sed -i '/\[mysqld\]/a\innodb_lock_wait_timeout=600' /etc/my.cnf
$ sed -i '/\[mysqld\]/a\innodb_rollback_on_timeout=1' /etc/my.cnf
$ /etc/init.d/mysqld start
```

```sh:MySQLServerのセキュリティ設定
$ mysql_secure_installation
```
※『Y』、『N』で回答するものは、Disallow root login remotelyだけ『N』、それ以外は全て『Y』
※パスワードなどは環境に合わせて設定する。


外部MYSQLを利用した場合の設定の場合、以下を追加

```sh:iptableの設定を行う
$ iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
$ /etc/init.d/iptables save
$ /etc/init.d/iptables restart
```

```sh:iptableの設定の確認を行う
$ /etc/init.d/iptables status
```

```sh:CloudStackのデータベースのデータインポート
$ cloud-setup-databases cloud:cloud_password@localhost --deploy-as=root:root_password
```

※cloud_passwordには今回作成するcloudデータベースのパスワードを設定する。
※root_passwordにはMySQL Serverの設定で設定したrootパスワードを設定する。

## ストレージサーバの設定

### NFSサーバの準備

```NFSサーバの設定
$ yum -y install nfs-utils
$ mkdir -p /export/primary
$ mkdir -p /export/secondary
$ echo '/export *(rw,async,no_root_squash)' >> /etc/exports
$ exportfs -a
$ mkdir -p /mnt/secondary
$ sed -i 's/#LOCKD_TCPPORT=32803/LOCKD_TCPPORT=32803/g' /etc/sysconfig/nfs
$ sed -i 's/#MOUNTD_PORT=892/MOUNTD_PORT=892/g' /etc/sysconfig/nfs
$ sed -i 's/#RQUOTAD_PORT=875/RQUOTAD_PORT=875/g' /etc/sysconfig/nfs
$ sed -i 's/#STATD_PORT=662/STATD_PORT=662/g' /etc/sysconfig/nfs
$ sed -i 's/#STATD_OUTGOING_PORT=2020/STATD_OUTGOING_PORT=2020/g' /etc/sysconfig/nfs
```

### ファイアーウォールの設定

```IPtableの設定
$ iptables -A INPUT -m state --state NEW -p udp --dport 111 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p tcp --dport 111 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p tcp --dport 2049 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p tcp --dport 32803 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p udp --dport 32769 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p tcp --dport 892 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p udp --dport 892 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p tcp --dport 875 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p udp --dport 875 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p tcp --dport 662 -j ACCEPT
$ iptables -A INPUT -m state --state NEW -p udp --dport 662 -j ACCEPT   
$ /etc/init.d/iptables save
$ /etc/init.d/iptables restart
```

```sh:iptableの設定の確認を行う
$ /etc/init.d/iptables status
```

###NFSサーバの設定

```NFSサーバの設定
$ sed -i 's/Domain = localdomain/Domain = nfs01.local/g' /etc/idmapd.conf
$ service rpcbind start
$ service nfs start
$ chkconfig nfs on
$ chkconfig rpcbind on
$ reboot
```
※今回はNFSサーバをnfs01.localとして設定している。

##SystemVM用のテンプレートを配置

```NFSサーバのマウント
$ mkdir /mnt/secondary
$ mount -t nfs nfs01.local:/export/secondary /mnt/secondary
$ /usr/lib64/cloud/common/scripts/storage/secondary/cloud-install-sys-tmplt -m /mnt/secondary -u http://download.cloud.com/templates/acton/acton-systemvm-02062012.qcow2.bz2 -h kvm -F
$ umount /mnt/secondary
```

```sh:CloudStackサーバの設定と起動
$ cloud-setup-management
```

以下にアクセスすると管理サーバのGUIが起動します。
http://192.168.0.165:8080/client/
（適正に設定されているかどうかは未検証。）

その後の設定は[こちら](http://www.slideshare.net/zero_root/dev-cloud-installation303)を参照。

# FAQ

## ホストが追加できない。

ホストを追加する際に、『unable to add the host』と表示され、以下のようなエラーメッセージが表示された場合、ローカルのSSHサーバへのアクセスエラーです。SSHが指定したID/パスワードでログインできるか確認しましょう。特にポート番号変更、PermitRootLoginの設定を行っている場合、接続が適正に行えませんので、注意しましょう。

```sh:/var/log/cloud/management/management-server.log
2013-04-23 18:53:48,323 WARN  [kvm.discoverer.KvmServerDiscoverer]
(catalina-exec-9:null)  can't setup agent, due to java.io.IOException:
There was a problem while connecting to 192.168.0.167:22 - There was a
problem while connecting to 192.168.0.167:22
```

以下のようなログが出力される場合は、
ManagementServer登録時に正しいIPアドレスが設定されておらず、
kvm01.localの追加するホストが管理サーバに接続をしようとしていません。

```sh:/var/log/cloud/agent/agent.log
2013-04-19 17:55:45,606 INFO  [utils.nio.NioClient]
(Agent-Selector:null) Connecting to localhost:8250
2013-04-19 17:55:45,607 ERROR [utils.nio.NioConnection]
(Agent-Selector:null) Unable to connect to remote
```

GlobalSettingのhost が localhostになっているのを確認しましょう。
管理サーバの適正なIPアドレスを入力して、管理サーバを再起動する。

```sh:/var/log/cloud/agent/agent.log
$ /etc/init.d/cloud-management restart
Stopping cloud-management:                                 [  OK  ]
Starting cloud-management:                                 [  OK  ]
```

セットアップで躓いたら、他にも以下のログを参照すること。
/var/log/cloud/agent/agent.log
/var/log/cloud/agent/setup.log

### 参考資料
* [Apache CloudStack 4.0.1-incubating](http://cloudstack.apache.org/docs/en-US/Apache_CloudStack/4.0.1-incubating/html/Installation_Guide/index.html)
* [Apache CloudStack Downloads](http://cloudstack.apache.org/downloads.html)
* [Dev cloud installation](http://www.slideshare.net/zero_root/dev-cloud-installation303)