【A10 Thunder】L4 負荷分散 (SLB) の設定 (インライン構成)
はじめに
A10ネットワークス社のロードバランサ、ADC (Application Delivery Controller) 製品であるThunderシリーズについて、インライン構成のL4負荷分散設定を紹介します。
本構成は、以下の特徴があります。
- 処理が単純なのでL7負荷分散と比べてパフォーマンスが高い
- 複数のコネクションに渡り状態を保持しない通信向き(静的Web / MTA / DNS / NTP ..etc)
- 負荷分散の条件に使える情報はIPアドレスとポート番号のみ(L7プロトコルの内容は制御不可)
- SourceNATを行わないので、リアルサーバのアクセスログに送信元のクライアントIPアドレスが残せる
[今までのA10 Thunder 設定情報記事]
【A10 Thunder】運用管理系の設定
【A10 Thunder】L2 / L3ネットワーク設定
【A10 Thunder】VRRP-Aによる冗長化設定
【A10 Thunder】L4 負荷分散 (SLB) の設定 (インライン構成)
SBクリエイティブ (2014-10-05)
売り上げランキング: 68,658
前提条件
以下の前提条件で検証を行いました。
- HW: VirtualBox上の仮想マシン
- OS(ロードバランサ): vThunder ACOS 4.1.0-P9
- OS(Webサーバ): CentOS 8.0
- 以下のページを参考に、運用管理系の設定が事前に行われていること
基本設定
論理構成
システムの論理構成は以下の通りです。
ネットワーク構成
ネットワーク構成は以下の通りです。
- サービスセグメント(10.0.10.0/24): クライアントとロードバランサの通信に使用
- サーバセグメント(10.0.20.0/24): ロードバランサとサーバの通信に使用
負荷分散設計
動作概要
負荷分散の動作は、以下の流れで行います。
- クライアントは、A10 Thunderの仮想IPアドレス/仮想ポート(10.0.10.10:80)宛にHTTPリクエストを送信する
- A10 Thunderは、仮想IPアドレス/仮想ポートに着信したパケットの宛先IPアドレス/宛先ポートを負荷分散対象サーバ宛に書き換え、パケットを転送する
- 負荷分散対象サーバは、受信したHTTPリクエストの送信元IPアドレス/ポート番号宛にHTTPレスポンスを送信する
- A10 Thunderは、HTTPレスポンスのパケット送信元IPアドレス/ポート番号を、自身の仮想IPアドレス/仮想ポートに書き換え、クライアントにパケットを転送する
負荷分散対象
負荷分散対象は、サーバセグメントに接続されたweb01(10.0.20.11)およびweb02(10.0.20.12)です。2台のサーバは、TCP/80でHTTPサービスを提供しています。
負荷分散方式
負荷分散方式は、ラウンドロビン(round-robin)を使用します。負荷分散対象サーバに対して、順番に通信を振り分けます。
ヘルスチェック方式
負荷分散対象へのヘルスチェックは、TCP/80に対してL4レベルのポート監視を行います。ヘルスチェックに失敗した場合は、負荷分散対象から該当サーバを除外します。
設定手順
ネットワークの設定
VLANの設定
VLAN10、VLAN20を定義し、それぞれのVLANに物理インターフェースと仮想インターフェースを登録します。
(config)# vlan 10
(config-vlan:10)# untagged ethernet 1
(config-vlan:10)# router-interface ve 10
(config-vlan:10)# exit
(config)# vlan 20
(config-vlan:20)# untagged ethernet 2
(config-vlan:20)# router-interface ve 20
(config-vlan:20)# exit
物理インターフェースの設定
物理インターフェースを有効化します。
(config)# interface ethernet 1
(config-if:ethernet:1)# enable
(config-if:ethernet:1)# exit
(config)#interface ethernet 2
(config-if:ethernet:2)# enable
(config-if:ethernet:2)# exit
仮想インターフェースの設定
仮想インターフェースにIPアドレスをアサインします。
(config)# interface ve 10
(config-if:ve:10)# ip address 10.0.10.1 /24
(config-if:ve:10)# exit
(config)# interface ve 20
(config-if:ve:20)# ip address 10.0.20.1 /24
(config-if:ve:20)# exit
L4負荷分散の設定
リアルサーバの設定
通信の負荷分散先のリアルサーバを設定します。
slb server
には、サーバ名とIPアドレスを指定します。リアルサーバであることがわかるよう、サーバ名にはRS_
を付けると良いでしょう。
port
には、ポート番号とL4プロトコルの種別を指定します。
(config)# slb server RS_web01 10.10.10.11
(config-real server)# port 80 tcp
(config-real server-node port)# exit
(config-real server)# exit
(config)# slb server RS_web02 10.10.10.12
(config-real server)# port 80 tcp
(config-real server-node port)# exit
(config-real server)# exit
リアルサーバを設定すると、デフォルトでICMPによるPingヘルスチェックが動作します。動作パラメータは以下の通りです。
# show health monitor
Idle = Not used by any server In use = Used by server
Monitor Name Interval Retries Timeout Up-Retries Method Status
-------------------------------------------------------------------------
ping 5 3 5 1 ICMP In use
負荷分散先のサーバが、サービス提供ポートのみ通信を許可している場合、ICMP Pingの疎通が取れないため、同ヘルスチェックを無効化する必要があります。
ICMP Pingによるヘルスチェックを無効化しても、リアルサーバに設定したポート番号に対してL4レベルのポート監視が行われるので、サービスの異常検知は可能です。
(config)# slb server RS_web01 10.10.10.11
(config-real server)# health-check-disable
(config-real server)# exit
(config)# slb server RS_web02 10.10.10.12
(config-real server)# health-check-disable
(config-real server)# exit
サービスグループの設定
リアルサーバをグループ化したサービスグループを設定します。
slb service-group
には、サービスグループ名とL4プロトコルの種別を指定します。サービスグループであることがわかるよう、サービスグループ名にはSG_
を付けると良いでしょう。
method
には、負荷分散方式を指定します。よく使う方式は以下の通りです。デフォルト設定のround-robin
(順番に振り分け)を使用する場合は、この1行は無くても問題ありません。
- round-robin: サービスグループメンバのリアルサーバに順番に通信振り分け。特別な要件が無い場合に使用。
- src-ip-only-hash: 送信元IPアドレスを元に通信振り分け。クライアントごとにアクセス先サーバを固定したい場合に使用。
- least-connection: もっともコネクション数が少ないサーバに振り分け。サーバの負荷を均等にしたい場合に使用。
member
には、リアルサーバの設定で指定したサーバ名とポート番号を指定します。
(config)# slb service-group SG_web tcp
(config-slb svc group)# method round-robin
(config-slb svc group)# member RS_web01 80
(config-slb svc group-member:80)# exit
(config-slb svc group)# member RS_web02 80
(config-slb svc group-member:80)# exit
(config-slb svc group)# exit
バーチャルサーバの設定
クライアントからの通信を受け付けるバーチャルサーバを設定します。
slb virtual-server
には、バーチャルサーバ名と、ロードバランサ自身で保持する仮想IPを指定します。バーチャルサーバであることがわかるよう、バーチャルサーバ名にはVS_
を付けると良いでしょう。指定するIPアドレスに制限はありませんが、クライアントから疎通の取れるロードバランサのインターフェースと同じサブネットに所属している必要があります。(今回であれば、10.0.10.0/24のセグメント)
port
には、バーチャルサーバがリッスンするポート番号とL4プロトコルの種別を指定します。このポートは、リアルサーバのポートポート番号と異なる番号を指定することも可能です。
service-group
には、負荷分散先のリアルサーバが所属するサービスグループ名を指定します。
(config)# slb virtual-server VS_web 10.0.10.10
(config-slb vserver)# port 80 http
(config-slb vserver-vport)# service-group SG_web
(config-slb vserver-vport)# exit
(config-slb vserver)# exit
動作確認
設定したバーチャルサーバのIPアドレスに疎通が取れる端末のブラウザで、http://10.0.10.10/
へアクセスします。負荷分散方式にround-robin
を設定しているので、何回か同ページにアクセスしてアクセス先サーバの表示が切り替わることを確認します。
運用手順
負荷分散状態の確認
リアルサーバ
リアルサーバの状態は、以下のコマンドで確認できます。
# show slb server
Total Number of Servers configured: 2
Total Number of Services configured: 2
Current = Current Connections, Total = Total Connections
Fwd-pkt = Forward packets, Rev-pkt = Reverse packets
Service Current Total Fwd-pkt Rev-pkt Peak-conn State
---------------------------------------------------------------------------------------
RS_web01:80/tcp 0 9 156 92 0 Up
RS_web01: Total 0 9 156 92 0 Up
RS_web02:80/tcp 0 4 53 30 0 Up
RS_web02: Total 0 4 53 30 0 Up
コマンドの引数にbindings
を付加すると、各種カウンタの代わりにリアルサーバが所属しているサービスグループ、バーチャルサーバの情報もまとめて表示されます。
# show slb server bindings
Total Number of Servers configured: 2
Total Number of Services configured: 2
Service Port Address State
-------------------------------------------------------------------------------
RS_web01:80/tcp 0 9 156 92 0 Up
RS_web01 80 10.0.20.11
+SG_web All Up
+=>VS_Web 10.0.10.10:80
RS_web02:80/tcp 0 4 53 30 0 Up
RS_web02 80 10.0.20.12
+SG_web All Up
+=>VS_Web 10.0.10.10:80
負荷分散先のサーバに障害が発生すると、State
列にDown
が表示されます。
以下の例では、web01サーバのApacheが停止しているため、HTTP通信向けポートを示すRS_web01:80/tcp
はDown状態、サーバ自体を示すRS_web01: Total
はUp状態となっています。
# show slb server
Total Number of Servers configured: 2
Total Number of Services configured: 2
Current = Current Connections, Total = Total Connections
Fwd-pkt = Forward packets, Rev-pkt = Reverse packets
Service Current Total Fwd-pkt Rev-pkt Peak-conn State
---------------------------------------------------------------------------------------
RS_web01:80/tcp 0 9 156 92 0 Down
RS_web01: Total 0 9 156 92 0 Up
RS_web02:80/tcp 0 4 53 30 0 Up
RS_web02: Total 0 4 53 30 0 Up
サービスグループ
サービスグループの状態は、以下のコマンドで確認できます。
# show slb service-group
Total Number of Service Groups configured: 1
Current = Current Connections, Total = Total Connections
Fwd-p = Forward packets, Rev-p = Reverse packets
Peak-c = Peak connections
Service Group Name
Service Current Total Fwd-p Rev-p Peak-c
-----------------------------------------------------------------------------------
*SG_web State: All Up
RS_web01:80 0 9 156 92 0
RS_web02:80 0 4 53 30 0
コマンドの引数にbrief
を付加すると、各種カウンタの代わりに、リアルサーバの状態の合計値や設定している負荷分散方式が表示されます。
# show slb service-group brief
Total Number of Service Groups configured: 1
slb service-group SG_web tcp
Service group name: SG_web
Type: tcp Distribution: Round Robin
Health Check: None
Servers Up = 2
Servers Down = 0
Servers Disable = 0
Total Servers in Group = 2
負荷分散先のサーバの一部に障害が発生すると、サービスグループ名のCurrent
列がAll Up
からFunctional Up
に変化します。負荷分散先のリアルサーバが全て停止すると、Current
列の表示はDown
になります。
# show slb service-group
Total Number of Service Groups configured: 1
Current = Current Connections, Total = Total Connections
Fwd-p = Forward packets, Rev-p = Reverse packets
Peak-c = Peak connections
Service Group Name
Service Current Total Fwd-p Rev-p Peak-c
-----------------------------------------------------------------------------------
*SG_web State: Functional Up
RS_web01:80 0 9 156 92 0
RS_web02:80 0 4 53 30 0
バーチャルサーバ
バーチャルサーバの状態は、以下のコマンドで確認できます。
# show slb virtual-server
Total Number of Virtual Services configured: 1
Virtual Server Name IP Current Total Request Response Peak
Service-Group Service connection connection packets packets connection
----------------------------------------------------------------------------------------
*VS_Web 10.0.10.10 All Up
port 80 tcp 0 13 209 122 0
SG_web 80/tcp 0 13 209 122 0
Total received conn attempts on this port: 13
コマンドの引数にbind
を付加すると、各種カウンタの代わりに、バーチャルサーバに所属しているサービスグループ、リアルサーバの状態が表示されます。
# show slb virtual-server bind
Total Number of Virtual Services configured: 1
---------------------------------------------------------------------------------
*Virtual Server : VS_Web 10.0.10.10 All Up
+port 80 tcp ====>SG_web State :All Up
+RS_web01:80 10.0.20.11 State : Up
+RS_web02:80 10.0.20.12 State : Up
負荷分散先のサーバの一部に障害が発生すると、バーチャルサーバ名のCurrent
列がAll Up
からFunctional Up
に変化します。負荷分散先のリアルサーバが全て停止すると、Current
列の表示はDown
になります。
# show slb virtual-server
Total Number of Virtual Services configured: 1
Virtual Server Name IP Current Total Request Response Peak
Service-Group Service connection connection packets packets connection
----------------------------------------------------------------------------------------
*VS_Web 10.0.10.10 Functional Up
port 80 tcp 0 13 209 122 0
SG_web 80/tcp 0 13 209 122 0
Total received conn attempts on this port: 13
リアルサーバのサービスアウト、サービスイン
サービスアウト
メンテナンス等でリアルサーバを一時的に負荷分散対象から切り離す場合、コンフィギュレーションモードからリアルサーバの無効化を行います。
以下の例では、作成済みのRS_web01
を無効化しています。
(config-real)# slb server RS_web01 10.0.20.11
(config-real server)# disable
(config-real server)# exit
リアルサーバの状態を確認すると、RS_web01: Total
のState
列が意図的に無効化されたことを示すDisabled
に変化しています。
# show slb server
Total Number of Servers configured: 2
Total Number of Services configured: 2
Current = Current Connections, Total = Total Connections
Fwd-pkt = Forward packets, Rev-pkt = Reverse packets
Service Current Total Fwd-pkt Rev-pkt Peak-conn State
---------------------------------------------------------------------------------------
RS_web01:80/tcp 0 9 156 92 0 Down
RS_web01: Total 0 9 156 92 0 Disabled
RS_web02:80/tcp 0 4 53 30 0 Up
RS_web02: Total 0 4 53 30 0 Up
ちなみに、(config-real server)#
の階層でポート番号を指定した後にdisable
を設定すると、リアルサーバのポート単位でのサービスアウトが可能です。
サービスイン
サービスアウトしたリアルサーバを再び負荷分散対象に組み込む場合は、コンフィギュレーションモードからリアルサーバの有効化を行います。
以下の例では、作成済みのRS_web01
を有効化しています。
(config-real)# slb server RS_web01 10.0.20.11
(config-real server)# enable
(config-real server)# exit
リアルサーバの状態を確認すると、RS_web01: Total
のState
列が元の状態であるUp
に変化しています。
# show slb server
Total Number of Servers configured: 2
Total Number of Services configured: 2
Current = Current Connections, Total = Total Connections
Fwd-pkt = Forward packets, Rev-pkt = Reverse packets
Service Current Total Fwd-pkt Rev-pkt Peak-conn State
---------------------------------------------------------------------------------------
RS_web01:80/tcp 0 9 156 92 0 Up
RS_web01: Total 0 9 156 92 0 Up
RS_web02:80/tcp 0 4 53 30 0 Up
RS_web02: Total 0 4 53 30 0 Up
参考情報
負荷分散先リアルサーバ(Webサーバ)の構築手順
負荷分散先リアルサーバ(Webサーバ)は以下の手順で構築しました。
firewalldが有効な環境では、http通信を許可設定に加えます。
# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload
Apacheをインストールして起動します。
# yum -y install httpd
# systemctl enable --now httpd
最小限の内容でHTMLファイルを配置します。HTMLのbodyヘッダには、1号機:Server 1
、2号機:Server 2
、を記載し、負荷分散時にどちらのリアルサーバのアクセスしているのかWebブラウザ上から確認できるようにしておきます。
# cat << __EOF__ > /var/www/html/index.html
<html>
<body>
<h1>Server 1</h1>
</body>
</html>
__EOF__