第16回:Eucalyptusとオートスケール


 今回はEucalyptusにおけるオートスケールについて紹介します。

 

Eucalyptusでのオートスケール

 本連載の第1回でも説明しましたが、EucalyptusはAmazon EC2/S3 API互換を目指して開発されており、それ以外のAWSの機能やサービスについては現時点では対象としていないため、Eucalyptus自体にはAWSのようなオートスケールの機能は実装されておりません。

そのためEucalyptus環境でオートスケールを実現する場合は、オートスケール機能を有するサービスを利用するか、オートスケール機能を有するソフトウェアを使用する必要があります。またオートスケールではロードバランサの役割も重要になりますが、前述のとおりEucalyptusにはAWSのElastic Load Balancingのような機能は実装されていません。このように説明すると、よく「Eucalyptusには色々な機能が不足している」という意見を耳にしますが、Eucalyptusは単体でクラウドコンピューティングの様々な機能を実現することを目的としているわけではなく、クラウドコンピューティングを実現する様々なアクターのひとつであると筆者は考えます。

オートスケール機能を有するサービスやソフトウェア

 オートスケール機能を有するサービスで代表的なものと言えば、enStratus Networks LLC.が提供しているenStratusやRightScale, Inc.のRightScaleなどがあります。どちらもクラウドを効率的に管理するためのサービスであり、そのなかのひとつの機能としてオートスケール機能が提供されています(enStratusはサービスとしての提供以外にソフトウェアとしても提供されているようです)。

 なお国内では、クリエーションライン株式会社がenStratusの提供を行なっており、株式会社日立ソリューションズがRightScaleの提供を行っています。

 オートスケール機能を有するソフトウェアでEucalyptusに対応しているものとしてScalrがあります。ただし筆者が2011年4月上旬に確認した際には筆者環境ではうまく動作せず、実際の挙動については確認できませんでしたが、筆者環境で動作確認ができ次第、本連載でまた取り上げていく予定です。

 

簡素なオートスケールのサンプル

 実運用でオートスケールを利用する場合は上記のようなサービスやソフトウェアを用いる必要がありますが、今回はインスタンスの増減だけを行なう簡素な方法を紹介します。

 今回紹介する方法では以下の図のように各インスタンスにSNMPでリソース情報(ロードアベレージ)を問い合わせ、全体の平均値が指定時間以上で閾値を超えた場合にインスタンスを増加させ、閾値を下回った場合には最も使われていないインスタンスから停止していきます。

 なるべく簡素にするためにオートスケールの管理役を担当するインスタンスと同じマシンイメージを使ってインスタンスを起動する作りとしています。

サンプルでのリソース監視

 なお、今回紹介するスクリプト類を入れたマシンイメージを例のごとくマシンイメージ工房で配布しています。

◇CentOS 5.6 x86 (32bit版) AutoScaloid イメージ
http://eucalyptus.machine-image.com/index.php/list/centos-002/

 まずは、オートスケール対象とするインスタンス用のマシンイメージに以下のスクリプトを/usr/local/sbin/autoscaloid-snmp.shとして作成します。

#!/bin/bash

nm=`ip addr show eth0 | grep "inet " | awk '{print $2}' | cut -d'/' -f2`
nw=`route -n | egrep -v "^(K|D|169.254|0\.)" | awk '{print $1}'`
fqdn=`hostname -f`
cat </etc/snmp/snmpd.conf
com2sec autoscaloid ${nw}/${nm} public
group MyROGroup v2c autoscaloid
view all included .1 80
access MyROGroup "" any noauth exact all none none
syslocation eucalyptus
syscontact Root
pass .1.3.6.1.4.1.4413.4.1 /usr/bin/ucd5820stat
EOF
service snmpd restart

 なお、SNMPがインストールされていない場合は以下のように実行してインストールします。

yum install net-snmp

 今回の方式のオートスケールで起動されるマシンイメージには上記のスクリプトがあることが必須となります。

 次に、UserDataの情報として以下の内容を記述したファイルを作成します。作成する場所はeuca-run-instancesを実行する環境に作成します。またファイル名は任意で構いませんが、ここではautoscaloid.confという名前にします。

#!/bin/bash

# オートスケールの設定
# 監視するリソース(ロードアベレージ)のツリー名
export MEASURE='laLoadInt.1'
# リソースの監視間隔(秒)
export PERIOD='60'
# インスタンスを停止させるロードアベレージの閾値
export THRESHOLD_MIN='100'
# インスタンスを増加させるロードアベレージの閾値
export THRESHOLD_MAX='200'
# 閾値を逸脱してから下記の時間(秒)を超過するとインスタンスを増減させる
export BREACH_DURATION='120'
# 閾値を下回っても起動させておくインスタンスの台数
# (0の場合はインスタンスを停止しない)
export INSTANCE_MIN='1'
# 増加させるインスタンス台数の最大値
export INSTANCE_MAX='10'

# eucarcに記述されている値で以下を設定
export EC2_URL=http://CLCのIP:8773/services/Eucalyptus
export EC2_ACCESS_KEY='アクセスキー'
export EC2_SECRET_KEY='シークレットキー'

 次に、管理役インスタンスを以下のように起動します。

euca-run-instances -f autoscaloid.conf -k キーペア イメージID

 起動した管理役のインスタンスに以下のスクリプトを/usr/local/sbin/autoscaloidとして作成します。

#!/bin/bash

initialize() {
   CURL=`which curl`
   USER_DATA_URL="http://169.254.169.254/latest/user-data"
   META_DATA_URL="http://169.254.169.254/latest/meta-data"
   USER_DATA=`${CURL} ${USER_DATA_URL} 2>/dev/null`
   eval "${USER_DATA}"
   EC2_URL=${EC2_URL:?EC2_URL is not set}
   EC2_ACCESS_KEY=${EC2_ACCESS_KEY:?EC2_ACCESS_KEY is not set}
   EC2_SECRET_KEY=${EC2_SECRET_KEY:?EC2_SECRET_KEY is not set}
   INSTANCE_MIN=${INSTANCE_MIN:?INSTANCE_MIN is not set}
   INSTANCE_MAX=${INSTANCE_MAX:?INSTANCE_MAX is not set}
   MEASURE=${MEASURE:?MEASURE is not set}
   PERIOD=${PERIOD:?PERIOD is not set}
   THRESHOLD_MIN=${THRESHOLD_MIN:?THRESHOLD_MIN is not set}
   THRESHOLD_MAX=${THRESHOLD_MAX:?THRESHOLD_MAX is not set}
   BREACH_DURATION=${BREACH_DURATION:?BREACH_DURATION is not set}
   EMI_ID=`${CURL} ${META_DATA_URL}/ami-id 2>/dev/null`
   SELF=`${CURL} ${META_DATA_URL}/local-ipv4 2>/dev/null`
   VM_TYPE=`euca-describe-instances | grep -v "${SELF}" | grep "${EMI_ID}" | awk '{print $9}' | head -n 1`
   KEYPAIR=`euca-describe-instances | grep -v "${SELF}" | grep "${EMI_ID}" | awk '{print $7}' | head -n 1`
}

make_list() {
   INSTANCES=`euca-describe-instances | grep -v "${SELF}" | grep "running" | grep "${EMI_ID}" | awk '{print $5}'`
   UNIT=`echo ${INSTANCES} | wc -w`
}

get_instance_id() {
   echo `euca-describe-instances | grep running | grep $1 | awk '{print $2}'`
}

initialize
make_list

while true; do
   sleep ${PERIOD}
   TOTAL=0
   IDLE=0
   [[ 0 -eq ${UNIT} ]] && continue

   for INSTANCE in `echo "${INSTANCES}"`; do
      RES=`snmpwalk -v 2c -c public ${INSTANCE} ${MEASURE} | awk '{print $NF}'`
      TOTAL=$(( ${TOTAL} + ${RES} ))
      [[ 0 -eq ${IDLE} ]] && IDLE=${RES}
      if [ ${RES} -le ${IDLE} -a ${RES} -lt ${THRESHOLD_MIN} ]; then
         IDLE_ID=`get_instance_id ${INSTANCE}`
      fi
   done

   if [ $(( ${TOTAL} / ${UNIT} )) -lt ${THRESHOLD_MIN} ]; then
      [[ 0 -eq ${STEP_OVER} ]] && STEP_OVER=`date +'%s'`
      [[ 0 -eq ${INSTANCE_MIN} ]] && continue
      [[ ${UNIT} -le ${INSTANCE_MIN} ]] && continue
      if [ $(( `date +'%s'` - ${STEP_OVER} )) -gt ${BREACH_DURATION} ]; then
         euca-terminate-instances ${IDLE_ID}
         make_list
         STEP_OVER=0
      fi
   elif [ $(( ${TOTAL} / ${UNIT} )) -gt ${THRESHOLD_MAX} ]; then
      [[ 0 -eq ${STEP_OVER} ]] && STEP_OVER=`date +'%s'`
      [[ ${UNIT} -ge ${INSTANCE_MAX} ]] && continue
      if [ $(( `date +'%s'` - ${STEP_OVER} )) -gt ${BREACH_DURATION} ]; then
          INSTANCE_ID=`euca-run-instances -k ${KEYPAIR} -t ${VM_TYPE} ${EMI_ID} | grep ^INSTANCE | awk '{print $2}'`
         STATE='pending'
         until [ 'running' == "${STATE}" ]; do
            sleep ${PERIOD}
STATE=`euca-describe-instances ${INSTANCE_ID} | grep ^INSTANCE | awk '{print $6}'`
         done
          make_list
         STEP_OVER=0
      fi
   fi
done

 スクリプトを作成したのち、以下のようにして起動します。

chmod +x /usr/local/sbin/autoscaloid
/usr/local/sbin/autoscaloid

 以上で対象インスタンスをオートスケールさせることが可能となります。なお、以下のようにstressコマンドを利用することで簡単に動作確認することができます。

# 対象インスタンスにて
wget http://packages.sw.be/stress/stress-1.0.2-1.el5.rf.i386.rpm
rpm -Uvh stress-1.0.2-1.el5.rf.i386.rpm
stress --cpu 2 --io 2

# 管理役インスタンスにて
watch -d euca-describe-instances

 

次回は事例紹介と書籍紹介

 次回はEucalyptusを利用している事例として国立情報学研究所のedubase Cloudについて紹介します。そして筆者達が執筆した「Eucalyptusではじめるプライベートクラウド構築」についても紹介します。

 


羽深 修
Eucalyptus歴はまだ1年ですが、周囲からはEucalyptus中毒と勘違いされているようです。Japan Eucalyptus User Groupの活動に参加し、オープンソースカンファレンスでネタなどを披露しています。度々Eucalyptusへのパッチも書いてます。ちなみに仕事ではCentOS + Xenという環境でEucalyptusを利用していますが、自宅のEucalyptus環境はGentoo Linux + KVMで動かしています。

志田 隆弘
主にEucalyptusやクラウドとはあまり関係のない分野でちょこちょこと活動していました。Eucalyptusはバージョン 1.3の頃からいじり始め、かれこれ2年近くEucalyptusに浸かった生活をしています。Eucalyptus 1.4が出たタイミングで、Tanacasinoという名前のGUIクライアントを作ったりしていました。最新のEucalyptusで動作するので、ぜひ使ってみてください。

田中 智文
志田さんとともに初期の頃からEucalyptusの調査・検証・使用してきました。志田さんの作成したTanacasinoのメンテナンスと機能拡張を行っています。新婚ほやほやなので家でのハック活動時間が少ないですが、Walrus Clientを作ってみたりbotoを使ってEucalyptusを操作して遊んでいます。
関連情報
(羽深 修/志田 隆弘/田中 智文)
2011/5/13 06:00