Azure ロードバランサは基本的な負荷分散機能を提供するマネージドサービスです。類似サービスでAzure アプリケーションゲートウェイもありますが、これはやや高度な負荷分散機能を提供するマネージドサービスです。このページでは「Azure ロードバランサ」の基本的な操作をまとめます。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
- クイック スタート:Azure CLI を使用して、VM の負荷分散を行うパブリック ロード バランサーを作成する
- チュートリアル: Azure portal を使用して IP ベースのバックエンドを備えたパブリック ロード バランサーを作成する
事前設定
以下、リソースグループを作成します。
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構成名」のデフォルトの名前は操作方法によって異なる事に注意ください。
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 ~ %