NATインスタンス 冗長化の深淵な話 AWS Casual Talks#1 2013-11-01 ひろせまさあき @hirose31 大剣使い
Jun 27, 2015
NATインスタンス冗長化の深淵な話
AWS Casual Talks#12013-11-01
ひろせまさあき@hirose31大剣使い
VPCにおけるNAT冗長化の話
VPC 10.0.0.0/16
Subnet 10.0.0.0/24
VPC Router
Internet GW
EC2 w/ EIP NAT w/ EIP
EC2 w/o EIP
ここ!
NATの冗長化といえば
安心のCDP/Ninja of Threeクオリティ
糸冬了
…とはいかない深淵な理由が…
(再掲)
VPC 10.0.0.0/16
Subnet 10.0.0.0/24
VPC Router
Internet GW
EC2 w/ EIP NAT w/ EIP
EC2 w/o EIP
(再掲)
VPC 10.0.0.0/16
Subnet 10.0.0.0/24
VPC Router
Internet GW
EC2 w/ EIP NAT w/ EIP
EC2 w/o EIP
(再掲)VPC 10.0.0.0/16
Subnet 10.0.0.0/24
VPC Router
Internet GW
EC2 w/ EIP NAT w/ EIP
EC2 w/o EIP
_人人人人人人_> publicサブ <> ネットのみ < ̄^Y^Y^Y^Y^Y^ ̄
_人人人人人人_> まさに <> 公私混同 <> パターン < ̄^Y^Y^Y^Y^Y^ ̄
@Yuryu(C)
第二部唯一つの
サブネットを胸に
どうしてpublic, private、2つのサブネットを切らなかったのか?
深淵な理由↓
深淵な理由↓
めんどくさそうだったから /⌒ ⌒\
/( ●) (●)\ /::::::⌒(__人__)⌒::::: \ <で? | mj |ー'´ | \ 〈__ノ / ノ ノ
NATインスタンスってただのNATしてるLinuxサーバーだしぃサブネットひとつの方がシンプルだしぃオンプレでもPublic/Privateなんかでサブネットわけてないしぃ
深淵な理由↓
ない! /⌒ ⌒\ /( ●) (●)\ /::::::⌒(__人__)⌒::::: \ <ふ〜ん | mj |ー'´ | \ 〈__ノ / ノ ノ
第二部唯一つの
サブネットを胸に
1.構成・設定は?2.どやってフェイル オーバーすんの?3.なにを異常とみなすか?
構成図
NATActive
Private IP ! : 10.0.0.21Secondary IP!: 10.0.0.254
EIP ! : 54.X.X.31
NATStandby
Private IP ! : 10.0.0.22
default GW ! : 10.0.0.1 default GW ! : 10.0.0.254
Private IP ! : 10.0.0.101default GW ! : 10.0.0.254
w/oEIP
VPC Router ! : 10.0.0.1
Subnet 10.0.0.0/24
VPC 10.0.0.0/16
設定Source / Dest Check OFF (standby, too)Secondary Private IP: $NAT_VIP (=10.0.0.254)Elastic IP Associate with $NAT_VIP (≠Primary Private IP) Allow Reassociation
sysctl -w net.ipv4.ip_forward=1sysctl -w net.netfilter.nf_conntrack_max=262144
iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -o eth0 -j SNAT --to-source $NAT_VIP
ip addr add $NAT_VIP dev eth0 label eth0:natip route add default via 10.0.0.1 dev eth0 src $NAT_VIP
AWS
Linux, sysctl
Linux, iptables
ちなみにAWS側の2nd IP設定せずにLinux側だけでIP Aliasした場合、arp解決ができなくて疎通できません
フェイルオーバーの流れiptables -t nat -F POSTROUTINGiptables -t nat -A POSTROUTING -s 10.0.0.0/16 -o eth0
-j SNAT --to-source $NAT_VIPip addr add $NAT_VIP/24 dev eth0 label eth0:natip route del defaultip route add default via $I_GW dev eth0 src $NAT_VIP
iptables -t nat -F POSTROUTINGip addr del $NAT_VIP/24 dev eth0 label eth0:natip route del defaultip route add default via $NAT_VIP dev eth0
新Active
aws ec2 assign-private-ip-addresses--network_interface_id $ENI_ID_of_NEW_ACTIVE--private_ip_addresses $NAT_VIP--allow-reassignment
AWS API
旧Active (if possible)
フェイルオーバー没案
1. VIP使わずに、NATが切り替わったらEIPなしインスタンスのデフォゲを必死で変えてまわる
_人人人人人人_> ありえ <> ない < ̄^Y^Y^Y^Y^Y^ ̄
2. ENIをも1こつけて、それをVIP的に移動させ
る
Secondary IP+IP Aliasでいけたしあんま調べてないけど、EIPをeth1にヒモ付けた場合、自分が外へ出ていけなかった(ような気がする)ポリシールーティングとか駆使すればいけるのかも
なにを異常とみなすか?
•異常とは?
•NATサーバーが生きてるかどうか、ではない
•フリーズしてSSHで入れなくてもパケット転送ができてればいい
•☛非EIPインスタンスが外部へ疎通できないのが異常である
なにを異常とみなすか?
• 外部の疎通対象をどうするか?
• 自由に気兼ねなくping打っていいホストがあればいいのだけど…
• 一応ある
• ping.mesh.ad.jp
JANOG28 到達性確認手段共有BoF
http://tools.bgp4.jp/index.php?janog28
• とりあえず にpingを…
なにを異常とみなすか?
• が落ちたら?
•間隔置いて何回かリトライする
• はわりと一時的に不通になるにょ
•それでもダメなら別のところにセカンダリーチェックする
なにを異常とみなすか?
•監視元の非EIPインスタンスが落ちたら?
•複数インスタンスから外部への疎通監視する
なにを異常とみなすか?
•誤検知したら?
•監視(非EIPインスタンス)に加えて調停役を立てて投票制(quorum)にする
•調停役がAWSのAPIを叩くなどしてF/Oする
•なので調停役はEIP付インスタンスで動かす必要がある←意外とワナい
なにを異常とみなすか?•監視ノードのお仕事
•調停役にステータスを送る
•起動時: JOINを送る
•定期的に: pingの結果を送る OK/NG
•終了時: LEAVEを送る
•送信データ=ステータス、自ホスト名、時刻
• 3台ぐらい立ててる
•msgpack RPCで送ってる
なにを異常とみなすか?• 調停役ノードのお仕事
• 監視ノードからデータが来たら
• 内部的に持ってる情報を更新
• 数秒間隔で定期的に
• 突然死した監視ノードがいないかチェック
• 最終更新時刻をみてしばらく更新されてないやつはLEAVE(投票数にはカウントしない)とみなす
• 上記でステータスがNG or LEAVEのがいたら
• ステータスが全部NG(外部疎通できるやつがいない)かつ、稼働中の監視ノード数が定足数以上なら、フェイルオーバー発動!!!
• PerlのAnyEvent::MPRPC::Serverで実装
• 今ならSerf http://www.serfdom.io/ でサクッと実現できるかもですね
まとめ
サブネット分けてCDPのように
VPC Routerの設定を変えてフェイルオーバー
深淵な理由でサブネット切ってない場合は…
今回紹介したNAT VIPの移動
ではなく!
_人人人人人人_
>全インスタンスに<
> EIPを付ける!!<
 ̄^Y^Y^Y^Y^Y^ ̄
ご清聴ありがとうございました