CloudStackの仕組みと構築方法

CloudStackとは

CloudStackは、Amazon EC2に相当する機能を備えたオープンソースクラウド基盤ソフトウェア。

なんだか難しいですね。

(プロの方々がまさかりを投げてくると思いますが)ものすごく噛み砕くと、プライベート&パブリッククラウドのIaaS環境を自宅なり会社なりで作れるオープンソースソフトウェアです。

CloudStackと類似しているものにOpenStackというものがあり、よく比較対象にされています。

今回は、CloudStackについて書きたいと思います。

※この記事は、CloudStack4.4をベースに書いています。

CloudStackの仕組み

CloudStackは、主に以下の7つのコンポーネントがあります。

  • 管理サーバー
  • ホスト
  • クラスタ
  • ポッド
  • ゾーン
  • プライマリストレージ
  • セカンダリストレージ

構成図としては、以下のようになっています。

f:id:palloc:20160414100515p:plain

※ここでは、構成図のVMインスタンスと呼んでいます。

次に、CloudStackの各コンポーネントについて詳しく書いていきたいと思います。

管理サーバー

管理サーバーは、ハイパーバイザを管理したり、ユーザーインタフェースを提供します。

以下に主な機能を紹介します。

  • 管理者用、エンドユーザー用などのWebインタフェースを提供する。
  • IPアドレスをアカウントに割り当てる。
  • ホストにインスタンスを割り当て、起動する。
  • 仮想ディスクをインスタンスに割り当てる。

ホスト

ホストは、インスタンスを実行する際のリソースを提供しています。 インスタンスを管理するためのハイパーバイザが各ホストにインストールされています。

CloudStackは様々なハイパーバイザをサポートしていて、XenServerやvSphere、KVMなどがあります。

クラスタ

クラスターは、ホストをグループ化したものです。

1つのクラスター内のホストは、同じハイパーバイザを使用していて、同じサブネット内にいて、同じプライマリストレージ(後ほど説明)を使っています。

ポッド

ポッドは、クラスターをグループ化したものです。

1つ以上のプライマリストレージとクラスターで構成されます。

物理的な話をすると、通常はポッド単位で同一のサーバーラックに収容されていて、同一のL2スイッチに接続されたサーバー群に対応しています。

ゾーン

ゾーンは、CloudStackで一番大きなグループ単位です。

ゾーンは、1つ以上のポッドと、セカンダリストレージで構成されています。

物理的には、一つのデータセンターに相当します。また、ゾーンは遠隔地に分散することができます。

また、静的に構成されているVPNトンネルで別ゾーンのホストにアクセスすることができます。

プライマリストレージ

インスタンスの起動ディスクやインスタンスがつかうデータディスクを格納します。

システム要件

  • ハイパーバイザでサポートされているストレージであること。(NFS,iSCSI,FC SANなど)

  • インスタンスの起動ディスクとデータディスクを格納するだけの十分な容量があること。

セカンダリストレージ

ISO,テンプレート、スナップショットなどを格納するストレージで、ゾーン内のすべてのホストは同じセカンダリストレージを使用します。

NFSストレージが基本的に使用されます。

ISO

OSの起動可能なメディアを含むディスクイメージ。

テンプレート

インスタンスの起動に使用することができるOSイメージ。

スナップショット

仮想ディスクのコピー。

システム要件

  • NFSストレージかLinux NFSサーバーであること。

  • 必要最低限の容量が確保できること。

  • インスタンスと同じゾーンに設置されていること。

システムVM

CloudStackでは、管理サーバーの負荷を減らすために処理をシステムVMに分担しています。

システムVMは、CloudStack4.0ではDebian6.0(Kernel2.6.32)を基にカスタマイズをした仮想マシンで、管理サーバーが自動的に作成します。

Console Proxy VM(CPVM)

CPVMは、各ハイパーバイザからのVNC(RFBプロトコルを用いてリモート操作をするソフトウェア)出力をブラウザにリダイレクトします。

要するにブラウザでVMのコンソールがいじれるようにしてくれます。

アクティブなセッション数を監視して、セッション数に応じてCPVMの数を増減させています。

Secondary Storage VM(SSVM)

SSVMは、ISOやテンプレートイメージをダウンロードしてきたり、スナップショットのバックアップをとったりとストレージに関する処理を主に行います。

仮想ルーター

仮想ルーターは、基本ネットワーク(詳細は後述)ではゾ−ンで最初のインスタンスが作成された時に作成され、拡張ネットワーク(これも詳細は後述)ではアカウント(これも詳細は後述)がインスタンス(VM)を作成する時に作成されます。

以下のようなネットワークサービスを提供します。

CloudStackのネットワークモデル

CloudStackでは、基本ネットワークと拡張ネットワークの2種類のネットワークモデルを提供します。1ゾーンにつきどちらかのネットワークモデルを選択し、使用します。

基本ネットワーク

基本ネットワーク設定では、単一の共有ネットワークを提供します。

以下のようなモデルとなっています。

f:id:palloc:20160414151158p:plain

セキュリティグループというのでレイヤー3レベルのネットワーク分離が行えます。(発信元IPアドレスのフィルタリングをすることによって分離させる技術)

拡張ネットワーク

拡張ネットワーク設定では、使う人ごと等にVLANでくぎり、仮想ルータを用いて対外接続ができるネットワークを提供します。

以下のようなモデルとなっています。

f:id:palloc:20160416154221p:plain

VLANのサポートがあり、柔軟にゲストネットワークを作成したりややこしいネットワークトポロジにも対応することができます。

ちなみに、仮想ルーターVMと仮想ルータ間のゲストネットワーク、システムと接続するためのリンクローカルネットワーク、そしてパブリックネットワークに基本的に接続されます。(3インタフェース!)

ユーザー管理

CloudStack環境では、ユーザー管理を「ユーザー」「アカウント」「ドメイン」という構成で行います。

ユーザー

ユーザーはその名の通り、システムを使用するユーザーの事ですw

ユーザーは、後述するドメイン内で一意でなければいけません。(他人のアカウントと被っちゃうといろいろ問題起こる)

アカウント

アカウントは、複数のユーザーをグループ化したものです。組織の中の部署ごととかで1アカウントみたいな運用をするみたいです。

ドメイン

ドメインは、複数のアカウントをグループ化したもので、例えば組織ごとに1ドメインなどのような運用をするみたいです。

とりあえず理論はこのような形になっています。

紹介していない機能はまだまだたくさんありますが、さらにややこしくなってしまうのと僕自身使ったことないものが多いのもあり、これくらいで理論のお話は終わりたいと思います。(次の記事にご期待ください...)

ClaudStack構築方法

では、PC1台でCloudStackを構築してみたいと思います。(1台だけで構築するのをall in oneとかよく言います)

僕はMacの上にCentOS仮想マシンを作ってその上で構築しました。とりあえず基本的な情報を以下に書いておきます。

  • VMware fusion8
  • メモリ:4GB(本当は8GBは欲しかった)
  • ストレージ:50GB
  • CentOS6.7 minimal
  • CloudStack4.4

こんな感じです。本当にメモリがつらいので構築した後結構使う予定のある人はもっとたくさん割り当ててあげてください。

では始めたいと思います。

環境の準備

まず、VMware系でCentOS6.7minimalのisoをダウンロードしてきて仮想マシンを立てます。

ネットワークはブリッジでも問題はないのかなと思いますが僕はNATにしました。

また、メモリとプロセッサの設定から、VT-xを有効にしてください。(ホストのハイパーバイザが動かない)

最初僕はVirtualboxで構築していたのですが、VT-xを有効化できないことを知らず1日消耗してしまいました。

構築

CentOSの設定編

[1]

rootで仮想マシンにログインできたら、おそらくeth0が落ちているので確認してください。

まず、それを直すためもあり、/etc/sysconfig/network-scripts/ifcfg-eth0 ファイルを編集します。(emacsはデフォで入ってないのでviを使いました)

ファイルを開いたら、設定を以下のように変更してください。

DEVICE=eth0
HWADDR=52:54:00:B9:A6:C0 ←これは人それぞれの値になってるはず。(変更不要)
NM_CONTROLLED=no
ONBOOT=yes
BOOTPROTO=dhcp

あまりCloudStackと関係がありませんが一応説明をしておくと、NM_CONTROLLEDがネットワークマネージャを使うかどうかで、ONBOOTが自動で起動するかどうか、BOOTPROTOがdhcpを使うかIP直打ちするかなどの設定です。

直打ちが望ましいのですが、dhcpでも僕の環境では影響がなかったため変更していません。pingが届かない〜〜とか後になってトラブルシューティングをする展開になった時は直打ちを検討してみる価値はありますw(けどVMware使ってるならIP降ってくるので直打ちじゃない方がいいのかも)

ファイルを変更し終えたら、以下のコマンドで次回から自動起動するように設定し、networkを起動してください。

#chkconfig network on

#service network start

[2]

#hostname --fqdn というコマンドを打ってみてください。

localhostみたいな感じで正常にホスト名が表示されればそのままで大丈夫です。

もし出てこないようであれば、/etc/hostsファイルを編集し、127.0.0.1localhostのようなホスト名であるように変更してください。

[3]

SELinuxをpermissiveに設定します。

以下のコマンドを打ってください。

#setenforce 0

さらに、/etc/selinux/configを編集します。以下のように設定ファイルの該当する部分を変更してください。

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

[4]

NTPを導入します。以下のコマンドを全て打ってください。

#yum -y install ntp

#chkconfig ntpd on

#service ntpd start

management導入編

[1]

いよいよCloudStackを入れます!

まず、yumで入れられるように /etc/yum.repos.d/ディレクトリにcloudstack.repoファイルを追加します。

/etc/yum.repos.d/cloudstack.repoに、以下の設定を書き加えます。

[cloudstack]
name=cloudstack
baseurl=http://cloudstack.apt-get.eu/rhel/4.4/
enabled=1
gpgcheck=0

[2]

nfsを使用するためnfs-utilsを入れます。

#yum -y install nfs-utils

そして、プライマリストレージとセカンダリストレージを準備します。

mkdir /primary

mkdir /secondary

次に、権限を付与するため、/etc/exportsファイルに以下の設定を加えます。

/secondary *(rw,async,no_root_squash,no_subtree_check)
/primary *(rw,async,no_root_squash,no_subtree_check)

nfsの設定を変更します。/etc/sysconfig/nfsファイルをviで開き、以下の設定のコメントアウトを外してください。

LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
RQUOTAD_PORT=875
STATD_PORT=662
STATD_OUTGOING_PORT=2020

↑感のいい方は、上で指定したポートとかを開けなきゃいけないのかなと思うかもしれません。

その通りです。

ということで,iptablesの設定を変えます。/etc/sysconfig/iptablesを開いて以下の設定を書き加えてください。

-A INPUT -s 172.16.10.0/24 -m state --state NEW -p udp --dport 111 -j ACCEPT
-A INPUT -s 172.16.10.0/24 -m state --state NEW -p tcp --dport 111 -j ACCEPT
-A INPUT -s 172.16.10.0/24 -m state --state NEW -p tcp --dport 2049 -j ACCEPT
-A INPUT -s 172.16.10.0/24 -m state --state NEW -p tcp --dport 32803 -j ACCEPT
-A INPUT -s 172.16.10.0/24 -m state --state NEW -p udp --dport 32769 -j ACCEPT
-A INPUT -s 172.16.10.0/24 -m state --state NEW -p tcp --dport 892 -j ACCEPT
-A INPUT -s 172.16.10.0/24 -m state --state NEW -p udp --dport 892 -j ACCEPT
-A INPUT -s 172.16.10.0/24 -m state --state NEW -p tcp --dport 875 -j ACCEPT
-A INPUT -s 172.16.10.0/24 -m state --state NEW -p udp --dport 875 -j ACCEPT
-A INPUT -s 172.16.10.0/24 -m state --state NEW -p tcp --dport 662 -j ACCEPT
-A INPUT -s 172.16.10.0/24 -m state --state NEW -p udp --dport 662 -j ACCEPT

変更したら、iptablesを再起動し、rpcbindというやつとnfs自動起動設定し、スタートさせます。

#service iptables restart
#service rpcbind start
#service nfs start
#chkconfig rpcbind on
#chkconfig nfs on

ちなみにrpcbindというのは、ポートマッピング機能を提供してくれるものです。

[3]

mysqlサーバを入れます。

#yum -y install mysql-server

設定ファイルをすこしいじります。/etc/my.cnfをひらいて、以下のように設定されているかを確認してください。(されていない場合は変更してください)

innodb_rollback_on_timeout=1
innodb_lock_wait_timeout=600
max_connections=350
log-bin=mysql-bin
binlog-format = 'ROW'

変更したら、muysqldをスタートさせ、自動起動するようにしておきます。

#service mysqld start
#chkconfig mysqld on

[4]

CloudStackの管理サーバを入れます。

#yum -y install cloudstack-management

ここで、complete!みたいな文字がでて終了しないときは、手順[1]の設定を間違えている可能性が大きいです。(僕は導入した時たいぽしてました)

次にデータベースを設定します。all in one で構築するときは基本テストとかでパスワードとか気にしないと思うので、以下のコマンドをそのまま打ってみてください。

#cloudstack-setup-databases cloud:password@localhost --deploy-as=root

続けて、以下のコマンドを入力してください。

cloudstack-setup-management

[5]

セカンダリストレージに、システムVMのテンプレートをダウンロードしてデプロイします。以下のコマンドを打ってください。(長いです)

/usr/share/cloudstack-common/scripts/storage/secondary/cloud-install-sys-tmplt -m /secondary -u http://cloudstack.apt-get.eu/systemvm/4.4/systemvm64template-4.4.1-7-kvm.qcow2.bz2 -h kvm -F

agent導入編

[1]

kvmをハイパーバイザとして使います。

まず、agentをyumで入れます。

#yum -y install cloudstack-agent

[2]

kvm-qemuの設定をします。/etc/libvirt/qemu.confを開き、以下の設定のコメントアウトを外してください。

vnc_listen=0.0.0.0

[3]

libvirtを設定します。/etc/libvirt/libvirtd.confを開いて、以下の設定のコメントアウトを外して修正してください。

listen_tls = 0
listen_tcp = 1
tcp_port = "16059"
auth_tcp = "none"
mdns_adv = 0

さらに、/etc/sysconfig/libvirtdを開き、以下の設定をコメントアウトを外し、修正してください。

#LIBVIRTD_ARGS="--listen"

ちなみに、libvirt仮想マシンの管理用APIを提供してくれるものです。

最後に再起動します。

#service libvirtd restart

[4]

以上でKVMに関しては設定終わりなので、以下のコマンドをうってkvmがあるか確認してください。

#lsmod | grep kvm
kvm_intel              55496  0
kvm                   337772  1 kvm_intel

もし何も表示されていない場合、VT-xが有効化されていない可能性があります。VMwareの設定を確認してください。

CUIでの設定完了!

とりあえずこれでCloudStackはうごきました。

GUI

CentOSipアドレスを調べ、http://IPアドレス:8080/clientにアクセスしてみてください。(結構レスポンス遅いです)

ログイン画面が出てくるので、name:admin password:passwordでログインしてみてください。

f:id:palloc:20160416215438p:plain

ログインしたら、初期設定を手伝いましょうか?みたいな画面が出てきますが断ってくださいw

GUI画面に入ったら、まずはゾーン、ポッド、クラスター、ホストを作成します。

以下の画面からゾーンの作成(add zone)を押してください。

f:id:palloc:20160416220018p:plain

ちなみに僕のはすでに一つゾーンがありますが気にしないでください。

あとは、基本ネットワークか拡張ネットワークか、IPアドレスは何かなど順番に聞かれるので、設定したい値を入れて行ってください。

ちなみにポッドのネットワークで注意して欲しいのが、デフォルトゲートウェイは間違えるとテンプレートのISOがダウンロードできない事態に陥ります。

不安な方はCentOSroute -nでデフォゲのIPアドレス調べたほうがいいです。(僕はこれが原因で何時間も消耗させられました)

そして、最後に作成すると、ゾーンやネットワークやポッドなどを自動で作ってくれます。

ここで注意すべきなのが、hostだけはなぜか1回目(僕の場合1回じゃすまなかった)は失敗してしまいます。

もう一度やってダメなら、キャンセルしてください。(ここまでで作成されたゾーン、ポッド、クラスターは消えません)

次に、CentOSへ戻り、以下のコマンドを順に入力してみてください。

#service cloudstack-agent stop
#service libvirtd restart
#service cloudstack-agent start

これで、もう一度ホストを作成してみてください。

これでダメなら、managementサーバを再起動してみてください。

#service cloudstack-management restart

これでもだめなら、どこか手順がおかしくなっている可能性があります。いろいろ設定があってるか確認してみてください。

次に、プライマリストレージとセカンダリストレージを作成します。

ゾーンと同じ感覚で作成してください。

ServerのIPアドレスは自分自身で、ディレクトリはそれぞれ/primary /secondaryです。

そして、しばらく待っているとSystemVMが2つ起動すると思います。(CPVMとSSVM)

起動したら、インスタンスが作成できると思うので、サイドメニューのInstanceを押し、作成してみてください。(いろいろ聞かれますが、全部一番上で大丈夫です。)

ここら辺で、エラーが起こったりした場合、#service cloudstack-management restartを実行すると直ることが多々有ります。

無事インスタンスがたてば、CloudStack構築完了です!

お疲れ様でした!

自分で導入してみた感想

微妙な設定の違いで無限に時間を消耗させられたので辛かったです。しかも文献が少ないor古い。

このブログを書くにあたって参考にした書籍、サイトを書かせていただきます。本当にお世話になりました。