Azure 仮想マシンスケールセット ローリングアップデート

スポンサーリンク

Azureの仮想マシンスケールセットで仮想マシンをアップデートする場合は、全台同時にアップデートするか、1台ずつアップデート(ローリングアップデート)するかを選択できます。このページでは仮想マシンをアップデートする方法についてまとめます。

仮想マシンをアップデートするには正常性監視が設定されている事が前提になっています。正常性監視の方法は「Azure 仮想マシンスケールセット 正常性監視と自動インスタンス修復」を参照ください。

前提

公式ドキュメント

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

事前設定

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

az group create --name MyResourceGroup --location japaneast

仮想マシンスケールセットを作成します。仮想マシンはnginxインストール済かつ5台構成とします。

デフォルト設定のローリングアップデートは20%ずつアップグレードします。言い換えれば、デフォルト設定は5台以上の構成を前提としています(4台未満の構成では1台ロールアウトすると20%以上の台数減となります)。

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

正常性監視を定義します。正常性監視の実装方法は「Azure 仮想マシンスケールセット 正常性監視と自動インスタンス修復」を参照ください。

az vmss extension set \
  --name ApplicationHealthLinux \
  --publisher Microsoft.ManagedServices \
  --version 1.0 \
  --resource-group MyResourceGroup \
  --vmss-name MyScaleSet01 \
  --settings /dev/stdin << EOF
{
  "protocol": "http",
  "port": 80,
  "requestPath": "/index.html"
}
EOF

az vmss update-instances \
  --resource-group MyResourceGroup \
  --name MyScaleSet01 \
  --instance-ids '*'

アップグレードポリシー概要

仮想マシンスケールセットの仮想マシンに対して設定変更をすると、その設定変更反映のタイミングはアップグレードポリシーに従います。アップグレードポリシーは以下3通りの設定が可能です。

アップグレードポリシー 説明
手動 明示的なアップグレード操作が行われたタイミングで更新される
自動 全台同時にアップグレードされる
ローリング 一定台数ずつアップグレードされる

アップグレードポリシーの動作確認

手動

1台ずつのアップグレード

アップグレードポリシーのデフォルト設定は「手動」です。「手動」の場合は、以下のようなコマンドを実行すると、仮想マシン1台をアップグレードできます。詳細な操作方法は「Azure 仮想マシンスケールセット 手動スケール」を参照ください。

az vmss update-instances \
  --resource-group <リソースグループ名> \
  --name <仮想マシンスケールセット名> \
  --instance-ids <インスタンスID>

全台同時のアップグレード

全台同時にアップグレードするには、引数instance-idsに「*」を指定してください。

bashで使用する場合は、ブレース展開されないように’*’と指定します。

az vmss update-instances \
  --resource-group <リソースグループ名> \
  --name <仮想マシンスケールセット名> \
  --instance-ids '*'

自動

アップグレードポリシーを「自動」に変更します。操作例は以下の通りです。

az vmss update \
  --resource-group MyResourceGroup \
  --name MyScaleSet01 \
  --set upgradePolicy.mode=Automatic

動作確認のため、仮想マシンスケールセットの設定を変更します。実践ではアプリケーションのデプロイが多いかと思いますが、ここでは簡単に動作確認できるように、vm-skuの変更を例示します。

az vmss update \
  --resource-group MyResourceGroup \
  --name MyScaleSet01 \
  --vm-sku Standard_DS1_v2

アップグレードポリシーが「手動」の場合はaz vmss update-instancesコマンド等の操作を必要としますが、アップグレードポリシーが「自動」の場合は明示的な操作なしにアップグレードが開始されます。以下のようなコマンドを実行し、仮想マシンのvm-skuが変わった事を確認します。

az vmss list-instances  \
  --resource-group MyResourceGroup \
  --name MyScaleSet01 \
  --query "[].{name:name, sku:sku.name }" \
  --output table
Name            Sku
--------------  ---------------
MyScaleSet01_1  Standard_DS1_v2
MyScaleSet01_2  Standard_DS1_v2
MyScaleSet01_3  Standard_DS1_v2
MyScaleSet01_5  Standard_DS1_v2
MyScaleSet01_6  Standard_DS1_v2

ローリング

アップグレードポリシーを「ローリング」に変更します。操作例は以下の通りです。

ローリングアップデートをするには「正常性監視」が定義されている事が前提です。

az vmss update \
  --resource-group MyResourceGroup \
  --name MyScaleSet01 \
  --set upgradePolicy.mode=Rolling

ローリングアップデートの動作確認をするために、仮想マシンのvm-skuを変更します。

az vmss update \
  --resource-group MyResourceGroup \
  --name MyScaleSet01 \
  --vm-sku Standard_B1s

ポータル(GUI)で、仮想マシンスケールセットの「概要」画面を確認します。すると、「ローリング アップグレードが進行中です。仮想マシン スケール セットを更新するには、アップグレードが完了するまで待つか、アップグレード操作をキャンセルする必要があります」とのメッセージが表示されています。

ローリングアップデートの進捗  01

「インスタンス」画面を見ると、ローリングアップデートの進捗を確認できます。

ローリングアップデートの進捗  02

ローリングアップデートの進捗をazコマンドで確認するには以下のaz vmss rolling-upgrade get-latestコマンドを使用します。

$ az vmss rolling-upgrade get-latest \
  --resource-group MyResourceGroup \
  --name MyScaleSet01
{
  "error": null,
  "id": null,
  "location": "japaneast",
  "name": null,
  "policy": {
    "enableCrossZoneUpgrade": null,
    "maxBatchInstancePercent": 20,
    "maxUnhealthyInstancePercent": 20,
    "maxUnhealthyUpgradedInstancePercent": 20,
    "pauseTimeBetweenBatches": "PT0S",
    "prioritizeUnhealthyInstances": null
  },
  "progress": {
    "failedInstanceCount": 0,
    "inProgressInstanceCount": 1,
    "pendingInstanceCount": 3,
    "successfulInstanceCount": 1
  },
  "runningStatus": {
    "code": "RollingForward",
    "lastAction": "Start",
    "lastActionTime": "2022-03-26T07:12:48.595262+00:00",
    "startTime": "2022-03-26T07:12:48.735889+00:00"
  },
  "tags": null,
  "type": "Microsoft.Compute/virtualMachineScaleSets/rollingUpgrades"
}

どの仮想マシンがアップデート中かを確認するには、az vmss get-instance-viewの出力を確認します。出力される情報量が多いので、適宜queryで整形してください。

$ az vmss get-instance-view  \
  --resource-group MyResourceGroup \
  --name MyScaleSet01 \
  --instance-id '*' \
  --query "[].{computerName:computerName, status:statuses[0].displayStatus}" \
  --output table
ComputerName     Status
---------------  ----------------------
myscae302000001  Provisioning succeeded
myscae302000002  Updating
myscae302000003  Provisioning succeeded
myscae302000005  Provisioning succeeded
myscae302000006  Provisioning succeeded

ローリングアップデートのパラメタ変更

デフォルト設定は20%ずつアップグレードします。場合によっては、20%ずつではなく40%ずつアップデートして早く完了させたいと思う事もあれば、20%ずつではなく10%ずつのアップデートでより慎重な計画を立てたいと思う事もあるでしょう。

ローリングアップデートは以下パラメタの指定が可能です。

パラメタ デフォルト値 説明
pause-time-between-batches PT0S バッチ間の一時停止間隔
max-batch-instance-percent 20 ローリング アップグレードのバッチ サイズ(%)
max-unhealthy-instance-percent 20 異常状態のインスタンスの最大(%)
max-unhealthy-upgraded-instance-percent 20 アップグレードされた異常状態のインスタンスの最大(%)

動作確認のため、同時にアップグレード可能なパーセントを20%から40%に増やします。5台構成ならば2台同時にアップグレード可能になるように設定変更します。

azコマンドで、引数pause-time-between-batchesを指定する場合はISO 8601という日付と時刻を表す規格で指定する必要があります。0秒間ならば「PT0S」と、1分間ならば「PT1M」のように指定します。

az vmss update \
  --resource-group MyResourceGroup \
  --name MyScaleSet01 \
  --pause-time-between-batches PT0S \
  --max-batch-instance-percent 40 \
  --max-unhealthy-instance-percent 40 \
  --max-unhealthy-upgraded-instance-percent 40

ローリングアップデートの動作確認をするために、仮想マシンのvm-skuを変更します。

az vmss update \
  --resource-group MyResourceGroup \
  --name MyScaleSet01 \
  --vm-sku Standard_DS1_v2

ローリングアップデートの進捗を確認します。40%同時のアップデートを許容したため、アップグレード中のインスタンス数を示すinProgressInstanceCountが1から2に増えた事が分かります。

$ az vmss rolling-upgrade get-latest \
  --resource-group MyResourceGroup \
  --name MyScaleSet01
{
  "error": null,
  "id": null,
  "location": "japaneast",
  "name": null,
  "policy": {
    "enableCrossZoneUpgrade": null,
    "maxBatchInstancePercent": 40,
    "maxUnhealthyInstancePercent": 40,
    "maxUnhealthyUpgradedInstancePercent": 40,
    "pauseTimeBetweenBatches": "PT0S",
    "prioritizeUnhealthyInstances": null
  },
  "progress": {
    "failedInstanceCount": 0,
    "inProgressInstanceCount": 2,
    "pendingInstanceCount": 3,
    "successfulInstanceCount": 0
  },
  "runningStatus": {
    "code": "RollingForward",
    "lastAction": "Start",
    "lastActionTime": "2022-03-26T07:55:02.117741+00:00",
    "startTime": "2022-03-26T07:55:02.195870+00:00"
  },
  "tags": null,
  "type": "Microsoft.Compute/virtualMachineScaleSets/rollingUpgrades"
}

仮想マシンの状態を確認すると以下のようになります。

$ az vmss get-instance-view  \
  --resource-group MyResourceGroup \
  --name MyScaleSet01 \
  --instance-id '*' \
  --query "[].{computerName:computerName, status:statuses[0].displayStatus}" \
ComputerName     Status
---------------  ----------------------
myscae302000001  Provisioning succeeded
myscae302000002  Updating
myscae302000003  Provisioning succeeded
myscae302000005  Provisioning succeeded
myscae302000006  Updating

補足

ローリングアップグレードのキャンセル

本来論で言えばあってはならない事ですが、新バージョンの仮想マシンで何らかの誤りが発覚した場合はローリングアップデートを中断する事もできます。操作方法は以下の通りです。

az vmss rolling-upgrade cancel \
  --resource-group <リソースグループ名> \
  --name <仮想マシンスケールセット名> \

ローリングアップデートのデメリット

初学者の陥りやすい間違えとして「全台同時アップデート」よりも「ローリングアップデート」の方が優れているという誤解があります。「ローリングアップデート」は確かにトラフィックを無停止で負荷分散する事ができますが、これは「新旧のアプリケーションが混在してもデータ不整合などの不具合が発生しない」という前提条件が必要になります。

もし、新旧のアプリケーションが混在する事によって不具合が発生するならば、「全台同時」のアップグレードを計画します。場合によって(例:周辺システムのキャッシュ等)は、「全台同時」のアップグレードではなく計画停止を考えた方が良い事もあります。

タイトルとURLをコピーしました