Azure設計プラクティス1: LoadBalancerによるLinux仮想マシンの冗長構成

そういえばMicrosoft Azureを使っているとはいえPaaSの使い方を勉強していることが多く、クラウドらしくないとふと思いたったのでちゃんとクラウドらしいことをやってみようと思って公式ドキュメントを貪ってみたらあまりよい情報が載っていなかったので続くまで練習がてら書いてみようと思います。

対象はAzureにある程度課金できる人を想定しています。

 

今回の想定は以下のような構成です

インターネットからのアクセスをLoadBalancerで受け取り、VirtualNet内にある2つのVMに負荷分散しながらトラフィックをさばきます。

さらに2つのVMはSecurityGroupによって80番ポートが開放されています。

このような同じVirtualMachineを複数台用意し、負荷分散をすることを冗長構成と呼びます。

もし片方のマシンが障害で止まってしまったとしてもLoadBalancerによってもう片方のマシンにトラフィックを集め、ユーザーからのアクセスに的確に応答します。

今回はこのような冗長性のあるUbuntu Virtual Machineを構成し、ApacheでWebサイトを作ってみます。

ネットワークを構築する

まず、ロードバランサーへのアクセス先となるパブリックIPを一つ作成します。

このIPへのトラフィックがロードバランサーによって分散されることになります。

続いて2台のVMを包むVirtual Netを作成します。

サブネットのアドレス空間は192.168.0.0/24とします。

セキュリティグループを作成します。

このセキュリティグループはファイアウォールのような役割を果たし、特定のポート以外のアクセスを遮断します。

 

仮想マシンを作成する

負荷分散するAzure Virtual Machineを2台作成します。

OSはUbuntuとしてください。

この時、サイズは「負荷分散」のオプションが書いてあるものにしてください。Basicプランなどは負荷分散のオプションがありません。

今回は負荷分散がある中で一番安いA0 Standardとしました。

設定ではVirtual Networkとサブネット、ネットワーク・セキュリティグループは必ず先ほど作成したものを指定してください。

パブリックIPアドレスだけは新規作成してください(なぜなら前に作成したパブリックIPはロードバランサーに紐付けるものだからです)

作成時の設定では可用性セットを設定してください。

可用性セットとは複数のAzure Virtual Machineのグループの・ようなもので同一可用性セット内のVirtual MachineはAzureインフラないで分散配置されます。

分散配置されることによって、Azureのハードウエア的な障害や計画メンテナンスなどがおこなわれたとしても対象となっていないVirtualMachineが稼働し続けることができます。

何番のドメインにVMを配置するかは「障害ドメイン」と「更新ドメイン」の数字を切り替えて設定します。

2台目のVirtualMachineを作成します。同様のA0インスタンスでVirtualNetやネットワーク・セキュリティグループは前に作成したものを、パブリックIPアドレスは新規作成。可用性セットは先ほど作成した可用性セットを指定します。

VMを2つ、同一の可用性セット内に作成することができました。

ロードバランサーを作成する

続いてロードバランサーを作成します。

ロードバランサーとはネットワークのトラフィックを複数の機器に分散する負荷分散機です。

Azureには負荷分散装置として以下の3つがあります。

  • Azure Load Balancer
  • Application Gateway
  • Traffic Manager

それらの違いはこちらのページに書いてあります。

その中でもLoad BarancerはOSI参照モデルのトランスポート層で動作し、負荷分散先としてはAzure Virtual Machine か Cloud Serviceのどちらかとなります。

したがってApp Serviceなどに負荷分散をしたい場合はTraffic Managerを利用するのがよいと思われます。

今回はVirtual Machineに負荷分散するのでLoad Barancerで構築します。

ロードバランサーは作成時に「パブリック」か「内部」かを指定できます。

こちらはどこからくるトラフィックを分散するかという話になるので今回はインターネットからのトラフィックを負荷分散したいため、パブリックとします。

パブリックに指定した場合、Load BarancerにIPアドレスを紐付けなければいけません。

パブリックIPを最初に作成したロードバランサーに紐付けるパブリックIPアドレスを指定してください

ここまでの構成要素

ここまでで負荷分散を行うシステムの要素は揃いました。

ここまでで作成したものはすべて下図のようになります。

続いて構成要素の各種設定をしていきましょう。

ロードバランサーの設定をする

 

作成したロードバランサーを表示し、「バックエンドプール」を見ます。

バックエンドプールとは分散先の機器を登録するプールとなります。

追加を押し、先ほど作成した可用性セットを指定します。

ターゲットネットワークIPは必ず作成した2つのVirtualMachineのIPとします。

2つのターゲット仮想マシンを追加できたらOKです。

続いてロードバランサーの「正常性プローブ」を設定します。

「追加」から80番ポートの正常性プローブを追加します。

さらに「負荷分散規則」を設定します。「追加」から作成しましょう。

セキュリティグループで80番を開放する

今回はHttpリクエストを通したいのでセキュリティグループから80番ポートの受信トラフィックを許可します。

sshの22番ポートも開けておきます。

UbuntuにログインしてApacheを起動する

ロードバランサーにもパブリックIPアドレスは割り当てられていますが個々のVMにもパブリックIPが割り当てられています。

このIPアドレスを使ってsshでログインします。

紐付けられているIPアドレスはVirtualMachineの管理画面から見ることができます。

sshでログインします。

ログインできたら以下のコマンドを入力しLAMP環境を整えます。

今回は負荷分散の動作確認のためにHTMLでIPアドレスを表示してみましょう。

デフォルトのHTMLを削除します。

IPアドレスを表示するPHPのプログラムを書き込みます。

これでVirtualMachineの80番ポートにアクセスするとサーバーのIPアドレスを表示するようになりました。

以上の設定をもうひとつのVirtualMachineにも行いましょう。

アクセスしてみる

最初に作成したロードバランサーに紐付いているIPアドレスにブラウザーからアクセスしてみましょう。

IPアドレスが表示されればOKです。これは先ほど作成したPHPのプログラムの出力結果で、このIPアドレスで動作するVMがアクセスに応答を返していることになります。

では意図的に障害を発生させてみましょう。

表示されたIPアドレスをローカルのIPとして持つVirtualMachineを停止させてみます。

表示されているローカルIPアドレスはVMを包んでいるVirtual Netが管理しているためVirtual NetからたどればどのVMがそのIPかがわかります。

停止させます。

停止できたら再度ブラウザでアクセスしてみましょう。

先ほどと違い、もうひとつのVirtualMachineに紐付いているIPアドレスが表示されました。

以上から、ロードバランサーによって2つのVirtualMachineにトラフィックを分散できていることがわかります。

もし片方のVMが止まったとしてももう片方が動き続けるので可用性が高くなります。