EucalyptusでLVS-KeepalivedなL4ロードバランサを作る話

By | 2013/07/23

お久しぶりです。
リプレーションのインフラ担当SE、utunです。

今回はEucalyptus上でロードバランサを作った話を適当に書いていこうと思います。
ちょっと今回は実用的な内容も盛り込んでいくよ!
Eucalyptusつってるけど、実際別に普通のサーバでも同じようにできるしね!

あ、ちなみに、うちのプライベートクラウド「SEC」が8月くらいに発売になる予定なんで、
それを買う人は読まなくても最初から使えるイメージ入ってますよ!

ちょっと宣伝もしたところで本題に戻ります。

ともあれ、自前のサーバで負荷分散するってーと、
手軽に立てられるロードバランサってことで、DNSラウンドロビンにする事が多いと思います。
しかし、

えー、マジDNSラウンドロビン!?

キモーイ

DNSラウンドロビンが許されるのは小学生までだよねー

キャハハハハハ

という声が聞こえてきたので、
仕方がないのでちゃんと作ってみる事にしました。

LVSとkeepalivedでのロードバランサ

まぁロードバランサっても色々ある訳で、
特に今回は「HTTP」が出来ればいいだけだったので、
apacheとかnginxとかでL7ロードバランサ作ってみるのもありっちゃありだったんですが、
プライベートクラウドって限られた資源内で、なるべく性能上げたかったんでL4でいきます。

高性能なサーバで作るならF5でも買えよ!

って思うしね。
まぁ今回の環境だと、クラウドコントローラの性能がボトルネックになるから
そもそも高価なアプライアンス買っても無意味だけどね!

とりあえず keepalived のインストール

まずはとりあえずepel使えるようにします。
もはや最近鉄板になっている・・・。
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
新しいのが出てたらそっち使って下さい。

あ、超今更だけどCentOS6です!
まぁサーバにUbuntuとか使ってる人なんて世界中に存在しないと思うけど
FreeBSDとかDebianの人はいるかもしれないからね!
個人的にUbuntuに恨みを持ってるとかって事は全然無いよ!
FreeBSD x ZFSとかちょっと憧れるよね。
皆はFreeBSD派?Indiana派?
僕はGlusterFS派です。

話が逸れましたね。
次にインストールですが、
yum -y install –enablerepo=epel ipvsadm keepalived
で終了です。
簡単だね!

keepalived関連設定

まぁやっかいなのは実はここからで、
ここからがうまくいかなくて断念した人も多いんじゃないかな。
僕も何が何だか覚えてないので、とりあえずこれ打てばおk。

sysctl -w net.ipv4.ip_forward=1 > /dev/null
sed -i ‘/net.ipv4.ip_forward/d’ /etc/sysctl.conf
echo “net.ipv4.ip_forward=1″ >> /etc/sysctl.conf
sysctl -w net.ipv4.conf.eth0.rp_filter=0 > /dev/null
sed -i ‘/net.ipv4.conf.eth0.rp_filter/d’ /etc/sysctl.conf
echo “net.ipv4.conf.eth0.rp_filter=0″ >> /etc/sysctl.conf
sysctl -w net.nf_conntrack_max=20000000 > /dev/null
sed -i ‘/net.nf_conntrack_max/d’ /etc/sysctl.conf
echo “net.nf_conntrack_max=20000000″ >> /etc/sysctl.conf
sysctl -w net.ipv6.conf.all.disable_ipv6=1 > /dev/null
sed -i ‘/net.ipv6.conf.all.disable_ipv6/d’ /etc/sysctl.conf
echo “net.ipv6.conf.all.disable_ipv6=1″ >> /etc/sysctl.conf
sysctl -w net.ipv6.conf.default.disable_ipv6=1 > /dev/null
sed -i ‘/net.ipv6.conf.default.disable_ipv6/d’ /etc/sysctl.conf
echo “net.ipv6.conf.default.disable_ipv6=1″ >> /etc/sysctl.conf

sed -i ‘/AddressFamily/d’ /etc/ssh/sshd_config
echo “AddressFamily inet” >> /etc/ssh/sshd_config
service sshd restart
ethtool -K eth0 tx off tso off gso off

shutdown -r now # 再起動時は諸々ご注意を…

うん。
訳分からんね。
まぁ、シスパラを適当に弄って、sshd設定適当に弄って、NICオフロード適当に弄ってるだけです。
調べれば出てくると思うけど、めんどくさければ別にそのまま打っていいですよ!

あと、keepalived自体の設定も適当に弄る。
ちなみに、keepalived.confはコメントアウトが「!」なので、「#」使ってると嵌るぜ!
てか嵌ったぜ・・・
vi /etc/keepalived/keepalived.conf
# ━━こっから━━━━━━━━━━━━━━━━━━━━━
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id localhost_alert
}

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
<this server’s private ip address>
}
}
virtual_server_group web_servers {
<this server’s private ip address> 80
}

virtual_server group web_servers {
delay_loop   3
lvs_sched    lc
lvs_method   DR
protocol     TCP

! 宛先サーバを増やす場合は、以下を複数作成して下さい.
!  real_server <private ip address> 80 {
!    weight 1
!    inhibit_on_failure
!    HTTP_GET {
!      url {
!        path /health_check.html
!        status_code 200
!      }
!      connect_port 80
!      connect_timeout 3
!    }
!  }
real_server <private ip address> 80 {
weight 1
inhibit_on_failure
HTTP_GET {
url {
path /health_check.html
status_code 200
}
connect_port 80
connect_timeout 3
}
}
}
# ━━ここまで━━━━━━━━━━━━━━━━━━━━━

<this server’s private ip address>、<private ip address>は適当に弄って下さい。

Webサーバ側の設定

もうここまで来たら終わったようなもんだね。
もうWebサーバ側とかは自由に作って下さい!

と言いたい所ですが、一点だけ重要な設定があるのでそこだけ。
iptables -t nat -F
iptables -t nat -A PREROUTING -d <LB server ip> -j REDIRECT
/etc/init.d/iptables save

これやっとかないと、Webサーバ側で

なんじゃこりゃぁあ!!!

ってジーパンデカばりに言われます。

ようは、宛先がロードバランサのパケットが飛んできて、
「はいはい。オレオレ詐欺おつ!」
つって無視されてしまうので、
この設定で、この人は信用していいんだよ!って言ってあげる設定です。

そんな感じで、みんなロードバランサっちゃって下さい!

※ 追記
設定内容をちゃんと見てくれた人は気づいてると思うけど、Webサーバ側にヘルスチェック用のファイルは置いて下さい!
「health_check.html」
別に中身はなんでも構わないんで、
echo “alive” > /var/www/html/health_check.html
とかでもいいですよ~

Elastic Load Balancer

ここまで書いといてなんですが、
EucalyptusにもELBが実装されます。
まぁユーカリプタサーの皆は当然知ってると思うけど。

Eucalyptus 3.3.0から実装されてて、コマンドも使えるようになってるよね。
なってるよね・・・・。
コマンドは・・・・・・・・_| ̄|○

うん。
まぁ動かなかったんだわ。
内部的にELB用と思われる仮想マシンが起動する処までは確認できたんだけど、
どうやっても追加したサーバがaliveな状態にならない。
なんかやり方が悪いのか・・・?
もうよくわからんし、GUIが実装されるであろう3.3.1か3.3.2まで待つことにしました。
3.3.1のロードマップにはAuto ScalingとCloudWatchのGUIしか書かれてなかった気がするけど、
ELBも来るよね・・・?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です