LVSをVPC上に構築してみた
こみや@ISAO
※主に部内向けの説明資料です
1.なぜLVSか






⇒重みづけしたかった
⇒Haproxyよりパフォーマンスがいいらしい
⇒オンプレとAWS以外のクラウドで運用に慣れてる
⇒smallスタートでコスト削減
2.ELBvsLVS比較表
内容

ELB

LVS

重みづけ

できない

できる

お値段

維持費と従量課金

インスタンス代実費

スケーリング

自動

手動

運用コスト

低い

拡張時と壊れたときに高い

・実は案外お値段は変わらないといううわさも。
3.最初の設計
VPC

IGW

Global Segment

Mail

DEV

ADM

Private Segment

LVS
LVS
Mng

NAT

WEB
WEB

LVS
IMG

DB
DB

Ca
Ca
NFS
NFS

・LVSと実サーバとクライアントのセグメントが分離してるとそもそもDSR (Direct
Server Return)できない
・初期設計担当者は既に離職していて設計意図が謎でした(未検証だった風)
4.やってみてできた構成
VPC

IGW

Global Segment
EIP

EIP

EIP

Mail

DEV
EIP

ADM

EIP

LVS
LVS

WEB
WEB

EIP

Mng

NAT

LVS
IMG

EIP

DB
DB

Ca
Ca

EIP

NFS
NFS

・しょうがないからフラットにしたところDBのみDSRに成功
・WEBはNAT分散しかできない(クライアントがGlobal側だとENIとIPが合わないパ
ケットが破棄されるため)
・NAT分散だと実サーバのDefaultGWをLVSにしなければならない
5.結果的にこうなった構成
VPC

IGW

Global Segment

EIP

Private Segment

EIP

Mail

DEV
EIP

ADM

ELB

EIP

Mng

WEB
WEB

DB
DB

Ca
Ca

EIP

NAT
NAT

LVS
LVS

LVS
IMG

NFS
NFS

・DBの分散は重みづけしたいのでLVSでDSR、WEBの分散はELBでSSLも管理に。
・顧客にフラットセグメントに仕様変更になった理由を説明するのが困難だという話と、
ELBを用いたほうが運用が楽だしベストプラクティスになるということでこうなりました。
※0.0.0.0/0は送信元anyのデフォルトGWがNATに向いてるということです。
6.最初の構成があり得なかった訳1


DSRはフラットな構成でなければならないがLVSだけが
フロントセグメントに分離していた

http://ultramonkey.sourceforge.jp/papers/lvs_tutorial/html/
6.最初の構成があり得なかった訳2




GWルータでENIとIPが合わないパケットが破棄されるためク
ライアントがグローバル側にいるWEB等はDSRは不可能で
NAT方式で分散する他ない
NAT方式分散だとGWをLVSに向ける必要があるためサブ
ネット丸ごとRouterTableでNATインスタンスをGWにするの
は利用不可

http://www.slideshare.net/kentayasukawa/ec2-20334037
NATインスタンスの仕組み解説






通常のLinuxRouterの機能でカーネルパラメータで
forwardingを許可するのとiptablesでマスカレード設定
をする必要がある
Source/Dest CheckをDisableにする必要あり
VPCの機能のRouterTableを制御する必要がある
⇒NATインスタンスをデフォルトGWとするルートを登録
したテーブルを作り、Privateサブネットまるごと追加する
(Linux的に個々のデフォルトGWをNATインスタンスに
向ける必要はない)
そのた








NATインスタンスではなくLinuxサーバNATの場合、EIPつけ
ないホストのデフォルトGWを他のEC2インスタンスにすると
APIから帰ってくるメタデータがデフォルトGWのインスタンス
のものしかとれなくなる
HAのためにEIPやPrivateIPを移動させる場合もAPIサーバ
との通信が必須。AWS的な制御なしにPrivateIPをつけて
ローカルホストで認識したとしても外部からの通信はできない。
固定EIPつけない起動時に動的EIP付与だと起動時にAPI
サーバとの通信が困難でheartbeatのリソースが起動してこ
なかったりする
普通はデフォルトGWは複数設定することはできないし異なる
サブネットを指定することはできない
ELB化の際に引っ掛かったこと





Private側のインスタンスに対して負荷分散したい場合
でも、ELBが所属するセグメントはIGWにせっしている
GlobalSegmentである必要がある。
セキュリティグループで縛っていない限り1つのVPC内
(10.0.0.0/16等)は自由に通信が可能である。
ELBをPrivateセグメントに置きEIPをつけるということは
不可能。
おわり


ご覧いただきまして、ありがとうございました。

詳細は以下URLをどうぞ。
http://devlab.isao.co.jp/vpc_heartbeat3_lvs/

Lvsをvpc上に構築してみた話