【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) の設定 (インライン構成)

サーバ負荷分散入門
サーバ負荷分散入門

posted with amazlet at 19.11.27
みやた ひろし
SBクリエイティブ (2014-10-05)
売り上げランキング: 68,658

前提条件

以下の前提条件で検証を行いました。

  • HW: VirtualBox上の仮想マシン
  • OS(ロードバランサ): vThunder ACOS 4.1.0-P9
  • OS(Webサーバ): CentOS 8.0
  • 以下のページを参考に、運用管理系の設定が事前に行われていること

【A10 Thunder】運用管理系の設定

基本設定

論理構成

システムの論理構成は以下の通りです。

ネットワーク構成

ネットワーク構成は以下の通りです。

  • サービスセグメント(10.0.10.0/24): クライアントとロードバランサの通信に使用
  • サーバセグメント(10.0.20.0/24): ロードバランサとサーバの通信に使用

負荷分散設計

動作概要

負荷分散の動作は、以下の流れで行います。

  1. クライアントは、A10 Thunderの仮想IPアドレス/仮想ポート(10.0.10.10:80)宛にHTTPリクエストを送信する
  2. A10 Thunderは、仮想IPアドレス/仮想ポートに着信したパケットの宛先IPアドレス/宛先ポートを負荷分散対象サーバ宛に書き換え、パケットを転送する
  3. 負荷分散対象サーバは、受信したHTTPリクエストの送信元IPアドレス/ポート番号宛にHTTPレスポンスを送信する
  4. 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: TotalState列が意図的に無効化されたことを示す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: TotalState列が元の状態である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__

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です