2&>1

AWSとかGCPとかGolangとかとか

EC2でLVSを構築した

LVSLinux Virtual Server)を使う用途があったので学習がてらEC2で組んでみました。

構成

LVSインスタンス1台とwebサーバ2台を用意しました

LVSインスタンスにはインターフェイスを2つ持たせています(詳細は後述

f:id:piyojir0:20190520132859j:plain

LVSインスタンスの構築

1.インスタンスの作成

OS:CentOS 7

構築の際ネットワークインターフェイスに2つ目を追加する。

その際、1つ目のインターフェイスとサブネットを分けること

f:id:piyojir0:20190520132921j:plain

infometionで書かれている用にインスタンスに対して複数のインターフェイスがある場合はElasticIPを直接インスタンスに割り当てることができません。なので次。

2.ElasticIPの追加

上の通りなのでElasticIPを追加するには「インスタンス」ではなく「インターフェイス」に対して割り当てます。 f:id:piyojir0:20190520133639j:plain

ここで割り当てるインターフェイス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は外しておく。

以後のSSHLVSサーバからローカルIP経由で行う。

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不可になったり何度か作り直しました。。

以上