LVS(Linux Virtual Server)を使う用途があったので学習がてらEC2で組んでみました。
構成
LVS用インスタンスにはインターフェイスを2つ持たせています(詳細は後述
LVS用インスタンスの構築
1.インスタンスの作成
OS:CentOS 7
構築の際ネットワークインターフェイスに2つ目を追加する。
その際、1つ目のインターフェイスとサブネットを分けること
infometionで書かれている用にインスタンスに対して複数のインターフェイスがある場合はElasticIPを直接インスタンスに割り当てることができません。なので次。
2.ElasticIPの追加
上の通りなのでElasticIPを追加するには「インスタンス」ではなく「インターフェイス」に対して割り当てます。
ここで割り当てるインターフェイスはLVS用インスタンスのグローバル側インターフェイスです。
3.LVSのインストールと設定もろもろ
yum install -y ipvsadm echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf sysctl -p touch /etc/sysconfig/ipvsadm systemctl enable ipvsadm systemctl start ipvsadm
2行目ではフォワード設定の有効化してる
4.インスタンスネットワーク設定変更
コンソール画面より「EC2」→「ネットワークインターフェイス」
LVS用インスタンスに割り当てているインターフェイス2つとも変更する
送信元/送信先 チェック を 「無効化」
5.追加インターフェイスの有効化
追加したインターフェイスには自動的に有効化されないため、コンフィグを作成する必要があります。
/etc/sysconfig/network-script/ifcfg-ens5をコピーしてens6用を作成しましょう。
cd /etc/sysconfig/network-script/ cp -p ifcfg-ens5 ifcfg-ens6 vi ifcfg-ens6 #MACアドレスとインターフェイス名を変更
systemctl restart network
webサーバの構築
1.インスタンス作成とアプリ設定
LVS用インスタンスのプラベート側インターフェイスと同じサブネットに作成する
適当に作って以下のような感じでうごかす。1台目と2台目でhtmlの記述内容は変更しておくと吉
yum install -y httpd systemctl start httpd touch /var/www/html/index.html echo <html>web1</html> > /var/www/html/index.html
2.GWの設定変更
デフォルトのゲートウェイはサブネットのGWを向いているのでLVSインスタンスへ向ける
route add default gw [LVS用インスタンスのプライベート側インターフェイスIP]
既存のGWを削除
route del default gw [既存のGWIP]
設定後webサーバに割り当てたElasticIPは外しておく。
LVSの設定
ipvsadm -C ipvsadm -A -t 10.0.2.229:80 -s rr ipvsadm -a -t 10.0.2.229:80 -r 10.0.5.183:80 -m ipvsadm -a -t 10.0.2.229:80 -r 10.0.5.186:80 -m
内容
# テーブルをクリア # 仮想サービスを登録 # [ipvsadm -A -t (サービス用IP:ポート) -s (分散方式)] # バックエンドサーバーを登録 # [ipvsadm -a -t (サービス用IP:ポート) -r (実サーバのIP:ポート) -m] (m で masquerading (NAT))
参照
CentOS 7 : LVS インストールと設定 : Server World
設定確認
ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP ip-10-0-2-229.ap-northeast-1 rr -> ip-10-0-5-183.ap-northeast-1 Masq 1 0 0 -> ip-10-0-5-186.ap-northeast-1 Masq 1 0 0
結果
LVSのElasticIPへアクセスするとWEBサーバが表示されます。 (完全にラウンドロビンじゃないのが謎)
正常にいかないパターン
LVSにインターフェイスを一つ、もしくは同一のサブネットにインターフェイスを2つ使用した場合は 正常に動作しません。
具体的には1回目のアクセスだけ表示されてしばらく表示不可となります。
しばらく時間を置くと1回目だけ表示されます。
原因はクライアントからのアクセスがwebへ行ったりLVS自体へ行ったりとしているためです
(設定内容とローカルIPは違ってます)
[root@lvs centos]# tcpdump -nn -i ens5 port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens5, link-type EN10MB (Ethernet), capture size 262144 bytes 00:14:06.557140 IP clientIP.61668 > 10.0.2.252.80: Flags [S], seq 1693283739, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0 00:14:06.557176 IP clientIP.61668 > 10.0.2.198.80: Flags [S], seq 1693283739, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0 00:14:06.809324 IP clientIP.60282 > 10.0.2.252.80: Flags [S], seq 4144917201, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0 00:14:06.809348 IP clientIP.60282 > 10.0.2.198.80: Flags [S], seq 4144917201, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0 00:14:09.557904 IP clientIP.61668 > 10.0.2.252.80: Flags [S], seq 1693283739, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0 00:14:09.557932 IP clientIP.61668 > 10.0.2.198.80: Flags [S], seq 1693283739, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0 00:14:09.809945 IP clientIP.60282 > 10.0.2.252.80: Flags [S], seq 4144917201, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0 00:14:09.809971 IP clientIP.60282 > 10.0.2.198.80: Flags [S], seq 4144917201, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0 00:14:15.557913 IP clientIP.61668 > 10.0.2.252.80: Flags [S], seq 1693283739, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0 00:14:15.557946 IP clientIP.61668 > 10.0.2.198.80: Flags [S], seq 1693283739, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
同じセグメントにあるとループしちゃう??
なので対策としてセグメント分けてます。
まとめ
追加インターフェイスをアップするとこでちょっとつまづきました。 GW追加せずリスタートするとSSH不可になったり何度か作り直しました。。
以上