Azure ロードバランサの基本操作

スポンサーリンク

Azure ロードバランサは基本的な負荷分散機能を提供するマネージドサービスです。類似サービスでAzure アプリケーションゲートウェイもありますが、これはやや高度な負荷分散機能を提供するマネージドサービスです。このページでは「Azure ロードバランサ」の基本的な操作をまとめます。

前提

公式ドキュメント

参考になる公式ドキュメントを以下に示します。

事前設定

以下、リソースグループを作成します。

az group create --name MyResourceGroup --location japaneast

以下、仮想ネットワークを作成します。

az network vnet create \
  --resource-group MyResourceGroup \
  --name MyVnet \
  --address-prefix 172.16.0.0/16

az network vnet subnet create \
  --resource-group MyResourceGroup \
  --name MySubnet \
  --vnet-name MyVnet \
  --address-prefixes 172.16.1.0/24

ロードバランサの作成

パブリックIPアドレスの作成

ロードバランサに付与するパブリックIPアドレスを作成します。IPアドレスが変動するのは不都合ですので、skuはBasicではなくStandardを指定しましょう。

az network public-ip create \
  --resource-group MyResourceGroup \
  --name MyPublicIp \
  --sku Standard \
  --zone 1 2 3

ロードバランサの作成

以下のコマンドでロードバランサを作成します。

az network lb create \
  --resource-group MyResourceGroup \
  --name MyLoadBalancer \
  --sku Standard \
  --public-ip-address MyPublicIp \
  --frontend-ip-name MyFrontEnd \
  --backend-pool-name MyBackEndPool80

正常性プローブの作成

バックエンドに存在するサーバの監視方法を指定します。引数protocolは、tcp, http, httpsの3通りが指定可能です。引数pathはhttp, httpsの場合のみ指定可能です。

az network lb probe create \
  --resource-group MyResourceGroup \
  --lb-name MyLoadBalancer \
  --name MyHealthProbe80 \
  --protocol http \
  --port 80 \
  --path '/'

負荷分散規則の作成

以下の操作で負荷分散規則を作成します。振り分け対象となるサーバは「MyBackEndPool80」という名前で定義し、どのようなメンバー(サーバ)が所属するかは後続の操作で定義します。

az network lb rule create \
  --resource-group MyResourceGroup \
  --lb-name MyLoadBalancer \
  --name MyHttpRule80 \
  --protocol tcp \
  --frontend-port 80 \
  --backend-port 80 \
  --frontend-ip-name MyFrontEnd \
  --backend-pool-name MyBackEndPool80 \
  --probe-name MyHealthProbe80 \
  --idle-timeout 15 \
  --enable-tcp-reset true

疎通確認

ネットワークセキュリティグループの定義

疎通確認用の仮想マシンを作成します。その前に、仮想マシンに関連づけるセキュリティグループを作成します。tcp22(ssh)とtcp80(http)とtcp8000(nginxステータス確認用途)を許可します。

az network nsg create \
  --resource-group MyResourceGroup \
  --name MyNsg

az network nsg rule create \
  --resource-group MyResourceGroup \
  --nsg-name MyNsg \
  --name tcp22 \
  --priority 100 \
  --destination-port-ranges 22 \
  --access Allow \
  --protocol Tcp 

az network nsg rule create \
  --resource-group MyResourceGroup \
  --nsg-name MyNsg \
  --name tcp80 \
  --priority 110 \
  --destination-port-ranges 80 \
  --access Allow \
  --protocol Tcp

az network nsg rule create \
  --resource-group MyResourceGroup \
  --nsg-name MyNsg \
  --name tcp8000 \
  --priority 120 \
  --destination-port-ranges 8000 \
  --access Allow \
  --protocol Tcp

仮想マシンの作成

仮想マシンを作成します。疎通確認しやすいように、nginxをインストールしtcp80とtcp8000でlistenする状態にします。

なお、ロードバランサのメンバとして追加できる仮想マシンは、「パブリックIPアドレスを持たないこと」または「Standard SKUのパブリックIPアドレスを持つこと」のいずれかが前提条件になります。デフォルト設定のBasic SKU パブリックIPアドレスは要件を満たしませんので、パブリックIPアドレスを持たないよう明示的に指定しています。

for i in `seq 10 12`; do
  az vm create \
    --resource-group MyResourceGroup \
    --name linux0${i} \
    --image UbuntuLTS \
    --size Standard_B1s \
    --admin-username azureuser \
    --ssh-key-values ~/.ssh/authorized_keys \
    --vnet-name MyVnet \
    --subnet MySubnet \
    --public-ip-address '' \
    --private-ip-address 172.16.1.${i} \
    --nsg MyNsg \
    --custom-data /dev/stdin << 'EOF'
#!/bin/bash
apt-get -y install nginx
echo "this is ${HOSTNAME}" > /var/www/html/index.html
echo 'server{
    listen 8000 default_server;
    location /nginx_status {
        stub_status on;
    }
}' > /etc/nginx/conf.d/nginx_status.conf
systemctl restart nginx.service 
EOF
done

バックエンドプールへの仮想マシン追加

バックエンドプールに仮想マシンを追加します。追加対象の指定方法は「ネットワークインターフェース」「IPアドレス」のいずれかが可能です。

「ネットワークインターフェース」の方法を採用する場合は、「ネットワークインターフェース名」「IP構成名」の2つを指定します。すべてのサービスから、「ネットワーキング」「ネットワークインターフェース」「ネットワークインターフェース名」「IP構成」の順に画面遷移すると、これらの名前を調査できます。

IP構成名の確認

「ネットワークインターフェース名」「IP構成名」を指定して、バックエンドプールに振り分け対象となる仮想マシンを追加します。

操作方法によっては「ネットワークインターフェース名」「IP構成名」を明示指定せずデフォルトの名前を使う事もあります。「ネットワークインターフェース名」「IP構成名」のデフォルトの名前は操作方法によって異なる事に注意ください。

array=(linux010 linux011 linux012)
for h in "${array[@]}"
do
  az network nic ip-config address-pool add \
    --address-pool MyBackendPool80 \
    --ip-config-name ipconfig${h} \
    --nic-name ${h}VMNic \
    --resource-group MyResourceGroup \
    --lb-name MyLoadBalancer
done

疎通確認

ロードバランサに付与されたパブリックIPアドレスを確認します。

$ az network public-ip show \
  --resource-group MyResourceGroup \
  --name MyPublicIp \
  --query "ipAddress"
"20.78.248.153"

3台の仮想マシンへ負荷分散される事を確認します。

admin@mac19 ~ % curl 20.78.248.153
this is linux012
admin@mac19 ~ % 
admin@mac19 ~ % 
admin@mac19 ~ % curl 20.78.248.153
this is linux011
admin@mac19 ~ % 
admin@mac19 ~ % 
admin@mac19 ~ % curl 20.78.248.153
this is linux010
admin@mac19 ~ % 

補足

IPアドレスを指定したバックエンドプール

バックエンドプールの作成

バックエンドプールのメンバーは「ネットワークインターフェース」ではなく「IPアドレス」を指定する事もできます。それでは「IPアドレス」を指定する方法の動作確認をします。

バックエンドプールは「ネットワークインターフェース指定」と「IPアドレス指定」を混在させる事はできませんので、「IPアドレス指定のバックエンドプール」を新規作成します。

az network lb address-pool create \
  --resource-group MyResourceGroup \
  --lb-name MyLoadBalancer \
  --name MyBackEndPool8000

新規作成されたバックエンドプールにIPアドレスを追加します。

for i in `seq 10 12`; do
  az network lb address-pool address add \
    --resource-group MyResourceGroup \
    --name 172-16-1-${i} \
    --vnet MyVnet \
    --pool-name MyBackendPool8000 \
    --lb-name MyLoadBalancer \
    --ip-address 172.16.1.${i}
done

負荷分散規則などの作成

前述の操作で作成したバックエンドプールに対して、負荷分散規則や正常性プローブを紐づけます。

az network lb probe create \
  --resource-group MyResourceGroup \
  --lb-name MyLoadBalancer \
  --name MyHealthProbe8000 \
  --protocol tcp \
  --port 8000

az network lb rule create \
  --resource-group MyResourceGroup \
  --lb-name MyLoadBalancer \
  --name MyHttpRule8000 \
  --protocol tcp \
  --frontend-port 8000 \
  --backend-port 8000 \
  --frontend-ip-name MyFrontEnd \
  --backend-pool-name MyBackEndPool8000 \
  --probe-name MyHealthProbe8000 \
  --idle-timeout 15 \
  --enable-tcp-reset true

疎通確認

tcp8000に対して疎通可能である事を確認します。

admin@mac19 ~ % curl http://20.78.248.153:8000/nginx_status
Active connections: 3 
server accepts handled requests
 27 27 51 
Reading: 0 Writing: 1 Waiting: 2 
admin@mac19 ~ % 

仮想マシンスケールセットに対する設定

仮想マシンスケールセットの作成

特段の引数を指定しない場合、仮想マシンスケールセットを作成すると同時にロードバランサも作成されます。ここではデフォルト設定に頼らず、ロードバランサを明示的に作成する方法を紹介します。

以下のように仮想マシンスケールセット作成時に、引数load-balancerと引数backend-pool-nameを与える事によって作成済のロードバランサを指定する事ができます。なお、引数backend-pool-nameはバックエンドプールが1つしかない場合は省略可能です。

No inbound nat pool was configured on ‘MyLoadBalancer’との警告メッセージが表示されます。警告の対応方法は「Azure インバウンドNAT規則」を参照ください。

az vmss create \
  --resource-group MyResourceGroup \
  --name MyScaleSet01 \
  --image UbuntuLTS \
  --vm-sku Standard_B1s \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/authorized_keys \
  --load-balancer MyLoadBalancer \
  --backend-pool-name MyBackEndPool80 \
  --nsg MyNsg \
  --custom-data /dev/stdin << 'EOF'
#!/bin/bash
apt-get -y install nginx
echo "this is ${HOSTNAME}" > /var/www/html/index.html
EOF

疎通確認

疎通確認を複数回実施し、仮想マシンスケールセットにも負荷分散されている事を確認します。

admin@mac19 ~ % curl 20.78.248.153
this is linux012
admin@mac19 ~ % 
admin@mac19 ~ % 
admin@mac19 ~ % curl 20.78.248.153
this is myscae302000001
admin@mac19 ~ % 
admin@mac19 ~ % 
admin@mac19 ~ % curl 20.78.248.153
this is linux011
admin@mac19 ~ % 
admin@mac19 ~ % 
admin@mac19 ~ % curl 20.78.248.153
this is myscae302000000
admin@mac19 ~ % 
admin@mac19 ~ % 
admin@mac19 ~ % curl 20.78.248.153
this is linux010
admin@mac19 ~ % 
タイトルとURLをコピーしました