2013年8月29日木曜日

easy_install でopen('/dev/null', 'w')エラーが発生する


easy_install のBugが起因。

現在のところ回避方法はないためpipでのインストールで対応するしかなさそう。

https://bitbucket.org/tarek/distribute/issue/101

#easy_install pip

2013年8月27日火曜日

CloudStack 4.1.1 KVM の基本構築 #cloudstack

ここ一ヶ月ぐらいCloudStack(CS)を触ってみたのでメモしておきます。


環境
今回は私は仮想環境ではなく物理環境で構築しましたが仮想環境でもほとんど変わらないと思います。
  • CloudStack 4.1.1
  • KVM(CentOS 6.4)
  • Catalyst 2960(なくてもいい)
  • VLAN 10個ぐらい(今回はVLAN100~110)
  • ネットワークセグメント 4つ程度
  • NFS(KVM以外のサーバーが望ましいがコントローラーと同じ場所などに構築する)
  • SELinuxは絶対無効にする
  • とりあえずiptablesも無効にする(プロダクションでは設定した方がいいかも)

ネットワーク
CloudStackはネットワーク設計がめっちゃめっちゃ重要になります。
あとで変更するのにはかなり苦労するうえにBugで消せなかったりするのでプロダクションとして構築する場合は注意しましょう。
ethの場合はem1(eth0)、em2(eth1)と読み替えてください。

VLAN  NIC  bridge    Type
100  em2  cloudbr2  guest
101  em1  cloudbr0 public
102  em2  cloudbr3 manage
103  em2  cloudbr1 storage

guest:ゲストOSに割り当てられるIP
public:guestからNATに変換される先のIP(拡張ネットワーク)
manage:ホストOSとシステムVMに割り当てられコントローラーと通信する
storage:ホストOSとストレージとの通信に利用する

storageとmanageは同じセグメントでも可能。
プロダクションだと分けないとSPOFになる。

NICは2つあれば構築しやすいですが1つでも可能です。
仮想マシンでSSHしか使えない環境ですと設定を誤るとSSHが途切れるのでSSHのポートだけ別NICにするか別VLANにするなどCSの影響範囲外に置いてくと無難です。


105~110はコントローラーから拡張ネットワークでゾーンを構築する際にVLANの範囲を指定しますのでその際に105と110を指定してください。

NFS

CSにはプライマリーストレージとセカンダリーストレージの2つの概念がありそれぞれ別々の役割を持っているので必ず構築する必要がある。

VLAN 102のセグメントのIPを割り当て、VLAN 102のセグメントからアクセスできるようにする必要があります。


#yum install nfs-utils

# mkdir -p /export/primary
# mkdir -p /export/secondary

# vi /etc/exports
/export  *(rw,async,no_root_squash)

# exportfs -a

# vi /etc/sysconfig/nfs
Uncomment the following lines:
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
RQUOTAD_PORT=875
STATD_PORT=662
STATD_OUTGOING_PORT=2020


# service rpcbind start
# service nfs start
# chkconfig nfs on
# chkconfig rpcbind on

最後にマウント可能か確認

# mkdir /mnt/primarymount
# mount -t nfs {NFS IP}:/export/primary /mnt/primarymount
# umount /mnt/primarymount

ここでやっているのはポートの固定化とパーミッションの設定です。
基本手動でNFSをマウントする必要はありません。


KVM

#vi /etc/yum.repos.d/cloudstack.repo
[cloudstack]
name=cloudstack
baseurl=http://cloudstack.apt-get.eu/rhel/4.1/
enabled=1
gpgcheck=0


#yum clean all
#yum install cloudstack-agent

FQDNがサーバーについていないとエラーになるのでFQDNをつけておく
#hostname -f

#vi /etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
auth_tcp = "none"
mdns_adv = 0

#vi /etc/sysconfig/libvirtd
LIBVIRTD_ARGS="--listen"

#service libvirtd restart

起動すれば問題ないです。

virbr0は使わないので削除してもあっても問題ないです。
削除する場合
#virsh net-destroy default
#virsh net-autostart default --disable


VLANの設定
私の環境ではスイッチのポートをTrunkにしているのでLinux側でTagginします。
サーバー側が複数NICでアクセスポートにしている場合は以下の設定は不要です。

VLANはifcfg-{nic}.{vlan-id}で指定しvlan=yesを追記すると有効になります。
aliasを利用する場合はifcfg-{nic}.{vlan-id}:{alias-num}で可能かと思います。

VLAN  NIC  bridge    Type
100  em2  cloudbr2  guest
101  em1  cloudbr0 public
102  em2  cloudbr3 manage
103  em2  cloudbr1 storage

この設定をします。

IPADDRやNETMASKの設定が必要な場合はbridge側に設定します。

#cd /etc/sysconfig/network-scripts
#vi cloudbr0
DEVICE=cloudbr0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
IPV6INIT=no
IPV6_AUTOCONF=no
DELAY=1

#vi cloudbr1
DEVICE=cloudbr1
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
IPV6INIT=no
IPV6_AUTOCONF=no
DELAY=1

#vi cloudbr2
DEVICE=cloudbr2
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
IPV6INIT=no
IPV6_AUTOCONF=no
DELAY=1

#vi cloudbr3
DEVICE=cloudbr3
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
IPV6INIT=no
IPV6_AUTOCONF=no
DELAY=1

#vi ifcfg-em1
DEVICE="em1"
BOOTPROTO=none
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE="Ethernet"
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="Global Nat"
VLAN=yes
BRIDGE=cloudbr0

#vi ifcfg-em2
DEVICE="em2"
BOOTPROTO=none
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE="Ethernet"
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System em2"

#vi ifcfg-em2.100
DEVICE="em2.100"
BOOTPROTO=none
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE="Ethernet"
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="Private"
VLAN=yes
BRIDGE=cloudbr2

#vi ifcfg-em2.102
DEVICE="em2.102"
BOOTPROTO=none
NM_CONTROLLED="yes"
ONBOOT=yes
DEFROUTE=yes
TYPE="Ethernet"
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="management"
VLAN=yes
BRIDGE=cloudbr3

#vi ifcfg-em2.103
DEVICE="em2.103"
BOOTPROTO=none
NM_CONTROLLED="yes"
ONBOOT=yes
DEFROUTE=yes
TYPE="Ethernet"
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="Storage"
VLAN=yes
BRIDGE=cloudbr1

VLAN 101はコントローラーの制御に入れば動的に作られるようなのでここでは作成しません。
bridgeとNICの結びつきと設定はハマりポイントなので注意して設定してください。

cloudbrという名前は変更しても問題ないです。
これが構築後に設定するKVMのラベル名となります。


コントローラー

コントローラーとはハイパーバイザーなどを管理しWebUIなどを提供するCloudStackそのものです。
パッケージ名だとserverやmanagerなどの名前がついています。私は便宜上コントローラーと呼んでおります。

KVMと同様にFQDNとyumのリポジトリを設定してください。

#yum install cloudstack-management
#yum install mysql-server

#vi /etc/my.cnf に追記
[mysqld]
innodb_rollback_on_timeout=1
innodb_lock_wait_timeout=600
max_connections=350
log-bin=mysql-bin
binlog-format = 'ROW'


#service mysqld start

MySQLでcloudユーザーを作成しrootユーザにパスワードを設定してください。


テーブルの作成
#cloudstack-setup-databases cloud:{cloud_user [email protected] --deploy-as=root:{root_pass}


CSを初期化したい場合はcloudstack-managementを停止した後にcloud、cloud_usage、cloudbridgeのデーターベースを削除し再度cloudstack-setup-databasesを実行すれば初期化できます。


コントローラー側でシステムVMをダウンロードします。
セカンダリーストレージにダウンロードするので予めマウントしておきます。
#/usr/share/cloudstack-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


/usr/sbin/tomcat6: line 30: /usr/share/cloud/management/logs/catalina.out: Permission deniedが発生するのでパーミッションを変更します。

chmod 777 /usr/share/cloud/management/logs/catalina.out

ここまでくるとコントローラーが起動すると思います。

起動後、初期プロビジョニングが実行されるので少し待ってからアクセスしてください。

#service cloudstack-setup-management start
#netstat -nl
8080がListenしていれば問題ありません。

起動してない場合はログを見直しましょう。
/var/log/cloud/management/management-server.log

http://{ip}:8080/client/
ユーザ:admin
パスワード:password
ドメイン:指定なし

IPの部分ですがem1(eth0)側がアップリンクになっている場合は優先的にeth0のIPを優先するようです。eth1でアクセスしたい場合は一時的にeth1をダウンさせましょう。
#ifdown em1(etn0)

ログインできれば、ウィザードにしたがって構築可能です。
詳しい構築方法は後ほど公開します。



2013年8月26日月曜日

これからCloudStackを始める人へ #cloudstack

これからCloudStackを始める人へ

コミュニティに参加する
https://groups.google.com/forum/#!forum/cloudstack-ja

有益な情報が結構流れ来るので参加している方が吉。
また質問もここからできるので本当に困ったときは力になってくれる。

Twitter
https://twitter.com/cloudstackja
https://twitter.com/cloudstack_jpn
https://twitter.com/kimotuki
https://twitter.com/kkitase

こちらも有益な情報やイベント情報が流れてくるのでフォローしておく。

ドキュメント
http://cloudstack.apache.org/docs/en-US/index.html

CloudStackはドキュメントがかなり充実しているのでこれさえあればある程度構築可能。

ログのありか
コントローラー側
#/var/log/cloud/management/management-server.log
#/var/log/cloud/management/catalina.out

management-server.logは2013-08-25 00:02:56,327 DEBUG [hogehoge]と出力されるのでこのhogehogeの部分をgrepすると一連の流れがわかる。
このログはよく見るとエラーの内容がわかる。

catalina.outはJavaのExceptionが出力されるのでこれもエラーの原因解明につながる。

ホスト側
#/var/log/cloud/agent/agent.log
#/var/log/messages

基本ホスト側のエラーログよりもコントローラー側のエラーログの方が原因が分かることが多いのだが両方のログを必ず確認してほしい。

書籍

システムVM?pod?クラスター?プライマリーストレージ?と全体の概要を掴まないとなかなか理解できないのでハンドブックとしては大きすぎるが悩んだ時に見ると気付くことが多い。

使うバージョンを決める
4.2系か4.1系か4.0系かを決める。
4.2系は現時点ではRPMがないため自分でビルドする必要があると思う。
後、注意してほしいのがIssuesだ。
常にドキュメントで自分が使うバージョンにどのようなBugあって自身のクラウド環境に影響がないか必ず確認したいところ。
Issuesはリリースノートから確認できる。
4.1だとこちら。
http://cloudstack.apache.org/docs/en-US/Apache_CloudStack/4.1.1/html/Release_Notes/version-4.1.html#issues-fixed-4.1.1

サーバー
物理マシン1台
仮想マシン1台

プロダクションで使うなら
L2スイッチ

VALNを自由に作れるとよりプロダクション環境に近づけるのでいいかも。

Java
書けなくてもいいですがコードを読めるとハマった時気付くことが多い。


最後に

OpenStackもCloudStackも同じことが言えるのだが、それなりに安定させた状態でサービスを開始するにはそれなりに苦労すると思われる。

と初めに凹むような事を書いたが、クラウドと聞くと大きな幻想を抱いている人が多いので予め言っておく。

クラウド基盤の下で動いているものは普通のVMwareだったりKVMだったりするのでハイパーバイザーの機能を超えた何かを特別に持っているわけではない。

クラウド基盤によってエージェントを入れることで、クラウド基盤には重要なライブマイグレーションなどを実現していることがある。

まだまだプライベートクラウドは過渡期な物なのでBugが多く、とても不安定な部分も多くあるため大きな心の余裕を持って挑んでほしい。

ただオープンソースでコミュニティも活発なので自身でモノづくりをしている楽しみを味わえるのがエンジニアだととても楽しいと思う。

サービスで導入することを真剣に考えている場合はシトリックスやRedHat(KVM)+シトリックス、VMware vCenter Serverを視野に入れて比較検討すること推奨する。

VMwareの回し者ではないがVMwareは本当によく出来ているアプリケーションだとプライベートクラウドを構築して素直にそう思った。そしてAWSは凄い。あそこまで安定化させるためには相当なノウハウが必要だ。

ここ最近OpenStackとCloudStackをサポートする企業やこれらのクラウド基盤を下にカスタマイズした自社製クラウド基盤を出しているメーカも多い。

後者の場合サーバーベンダーなどが注力してサーバーとオールインワンで導入しているケースをよく見る。

自分自身の環境にマッチしたクラウド基盤を選定してほしい。


一緒に頑張りましょう!

2013年8月18日日曜日

wgetのFTPが便利

誰もが1度は使ったことであろうwgetコマンド。

このコマンドはWebページ上のファイルを取得するだけでなくWebページを再帰的に辿りまるごと取得もできるすぐれもの。


webページのリンクを辿り再帰的に取得する
 wget -r http://www.example.com/index.html

webページのリンクをが外部リンクでも取得する
 wget -r -H http://www.example.com/index.html

BASIC認証が設定されているファイルを取得する
 wget --http-user=user_name --http-password=pass http://www.example.com/index.html

サイトをまるごとコピーする
 wget -m http://www.example.com/index.html

まるごと取得する階層を指定する
 wget -l 1 http://www.example.com/index.html

BASIC認証が設定されているファイルを取得する
 wget --http-user=user_name --http-password=pass http://www.example.com/index.html

絶対パス(外部リンク)を相対パスに変換する
 wget -k http://www.example.com/index.html

リンク中の画像も取得する
 wget -p http://www.example.com/index.html


ここまでは常用の範囲かと思いますが、実は-rと-mはFTPでも使えちゃうという便利コマンド。
wgetってHTTP/HTTPS意外でも使えるのをmanで初めて知った。

ftpコマンドは再帰的にディレクトリを辿ってダウンロードできないのでまとめてダウンロードする際は不便です。

wgetでFTPをする
wget -m --passive-ftp ftp://user:[email protected]/{dir}

cオプションでレジューム機能も使えます
wget -cm --passive-ftp ftp://user:[email protected]/{dir}