Поделиться через


Руководство по изменению масштабируемого набора виртуальных машин с помощью Azure CLI

На протяжении всего жизненного цикла приложений может потребоваться изменить или обновить масштабируемый набор виртуальных машин. Эти обновления могут включать в себя процедуры по обновлению конфигурации масштабируемого набора, или изменению конфигурации приложения. В этой статье описывается изменение существующего масштабируемого набора с помощью Azure CLI.

Ниже мы объявляем переменные среды, которые будут использоваться в этом документе. Случайный суффикс добавляется к именам ресурсов, которые должны быть уникальными для каждого развертывания. Для REGION этого задано значение WestUS2.

Настройка группы ресурсов

Прежде чем продолжить, убедитесь, что группа ресурсов существует. Этот шаг создает группу ресурсов, если она еще не существует.

export RANDOM_SUFFIX=$(openssl rand -hex 3)
export MY_RESOURCE_GROUP_NAME="myResourceGroup$RANDOM_SUFFIX"
export REGION="WestUS2"
az group create --name $MY_RESOURCE_GROUP_NAME --location $REGION
{
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx",
  "location": "WestUS2",
  "managedBy": null,
  "name": "myResourceGroupxxx",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

Создание масштабируемого набора виртуальных машин

Чтобы убедиться, что последующие команды обновления и запроса имеют допустимый ресурс для работы, создайте масштабируемый набор виртуальных машин. На этом шаге мы развернем базовый масштабируемый набор с использованием допустимого образа (Ubuntu2204) и установим количество экземпляров равным 5, чтобы обновления конкретных экземпляров могли быть направлены на существующий идентификатор экземпляра.

export SCALE_SET_NAME="myScaleSet$RANDOM_SUFFIX"
az vmss create \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --image Ubuntu2204 \
  --upgrade-policy-mode manual \
  --instance-count 5 \
  --admin-username azureuser \
  --generate-ssh-keys
{
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
  "location": "WestUS2",
  "name": "myScaleSetxxx",
  "provisioningState": "Succeeded"
}

Обновление модели масштабируемого набора

Масштабируемый набор содержит модель, которая фиксирует требуемое состояние набора в целом. Чтобы запросить модель для масштабируемого набора, можно использовать az vmss show:

az vmss show --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME

Точное представление выходных данных зависит от параметров, введенных в команде. Ниже показан сокращенный пример выходных данных Azure CLI.

{
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
  "location": "WestUS2",
  "name": "myScaleSetxxx",
  "orchestrationMode": "Flexible",
  "platformFaultDomainCount": 1,
  "resourceGroup": "myResourceGroupxxx",
  "sku": {
    "capacity": 5,
    "name": "Standard_DS1_v2",
    "tier": "Standard"
  },
  "timeCreated": "2022-11-29T22:16:43.250912+00:00",
  "type": "Microsoft.Compute/virtualMachineScaleSets",
  "networkProfile": {
    "networkApiVersion": "2020-11-01",
    "networkInterfaceConfigurations": [
      {
        "deleteOption": "Delete",
        "disableTcpStateTracking": false,
        "dnsSettings": {
          "dnsServers": []
        },
        "enableIpForwarding": false,
        "ipConfigurations": [
          {
            "applicationGatewayBackendAddressPools": [],
            "applicationSecurityGroups": [],
            "loadBalancerBackendAddressPools": [
              {
                "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/loadBalancers/myScaleSetLB/backendAddressPools/myScaleSetLBBEPool",
                "resourceGroup": "myResourceGroupxxx"
              }
            ],
            "name": "mysca2215IPConfig",
            "privateIpAddressVersion": "IPv4",
            "subnet": {
              "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/virtualNetworks/myScaleSetVNET/subnets/myScaleSetSubnet",
              "resourceGroup": "myResourceGroupxxx"
            }
          }
        ],
        "name": "mysca2215Nic",
        "networkSecurityGroup": {
          "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/networkSecurityGroups/myScaleSetNSG",
          "resourceGroup": "myResourceGroupxxx"
        },
        "primary": true
      }
    ]
  },
  "osProfile": {
    "allowExtensionOperations": true,
    "computerNamePrefix": "myScaleS",
    "linuxConfiguration": {
      "disablePasswordAuthentication": true,
      "enableVmAgentPlatformUpdates": false,
      "patchSettings": {
        "assessmentMode": "ImageDefault",
        "patchMode": "ImageDefault"
      },
      "provisionVmAgent": true
    }
  },
  "storageProfile": {
    "imageReference": {
      "offer": "UbuntuServer",
      "publisher": "Canonical",
      "sku": "22_04-lts",
      "version": "latest"
    },
    "osDisk": {
      "caching": "ReadWrite",
      "createOption": "FromImage",
      "deleteOption": "Delete",
      "diskSizeGb": 30,
      "managedDisk": {
        "storageAccountType": "Premium_LRS"
      },
      "osType": "Linux"
    }
  }
}

Вы можете использовать az vmss update для обновления различных свойств масштабируемого набора. Например, обновите тип лицензии или политику защиты экземпляров виртуальной машины. Обратите внимание, что значение допустимого типа лицензии RHEL_BYOS , а не Windows_Server.

az vmss update --name $SCALE_SET_NAME --resource-group $MY_RESOURCE_GROUP_NAME --license-type RHEL_BYOS
export INSTANCE_ID=$(az vmss list-instances \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --query "[0].instanceId" \
  -o tsv)

az vmss update \
  --name $SCALE_SET_NAME \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --instance-id "$INSTANCE_ID" \
  --protect-from-scale-set-actions False \
  --protect-from-scale-in

Кроме того, если вы ранее развернули масштабируемый набор с az vmss create помощью команды, можно снова запустить az vmss create команду, чтобы обновить масштабируемый набор. Убедитесь, что все свойства в команде az vmss create остаются такими же, как и раньше, за исключением тех, которые вы хотите изменить. Например, ниже мы увеличиваем число экземпляров до пяти.

Это важно

Начиная с ноября 2023 года масштабируемые наборы виртуальных машин, созданные с помощью PowerShell и Azure CLI, по умолчанию будут использоваться в режиме гибкой оркестрации, если режим оркестрации не указан. Дополнительные сведения об этом изменении и о действиях, которые необходимо предпринять, см. в руководстве по критическим изменениям для клиентов VmSS PowerShell/CLI — Microsoft Community Hub

az vmss create \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --orchestration-mode flexible \
  --image RHELRaw8LVMGen2 \
  --admin-username azureuser \
  --generate-ssh-keys \
  --instance-count 5 \
  --os-disk-size-gb 64

Обновление отдельных экземпляров виртуальных машин в масштабируемом наборе

Как у масштабируемого набора есть представление модели, так и каждый экземпляр виртуальной машины в наборе имеет собственное представление модели. Чтобы запросить представление модели для конкретного экземпляра виртуальной машины в масштабируемом наборе, можно использовать az vm show.

export INSTANCE_NAME=$(az vmss list-instances \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --query "[0].name" \
  -o tsv)

az vm show --resource-group $MY_RESOURCE_GROUP_NAME --name $INSTANCE_NAME

Точное представление выходных данных зависит от параметров, введенных в команде. Ниже показан сокращенный пример выходных данных Azure CLI.

{
  "hardwareProfile": {
    "vmSize": "Standard_DS1_v2"
  },
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachines/myScaleSet_Instance1",
  "location": "WestUS2",
  "name": "myScaleSet_Instance1",
  "networkProfile": {
    "networkInterfaces": [
      {
        "deleteOption": "Delete",
        "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/networkInterfaces/mysca2215Nic-5cf164f7",
        "primary": true,
        "resourceGroup": "myResourceGroupxxx"
      }
    ]
  },
  "osProfile": {
    "allowExtensionOperations": true,
    "computerName": "myScaleset_Computer1",
    "linuxConfiguration": {
      "disablePasswordAuthentication": true,
      "enableVmAgentPlatformUpdates": false,
      "patchSettings": {
        "assessmentMode": "ImageDefault",
        "patchMode": "ImageDefault"
      },
      "provisionVmAgent": true
    }
  },
  "provisioningState": "Succeeded",
  "resourceGroup": "myResourceGroupxxx",
  "storageProfile": {
    "dataDisks": [],
    "imageReference": {
      "exactVersion": "22.04.202204200",
      "offer": "0001-com-ubuntu-server-jammy",
      "publisher": "Canonical",
      "sku": "22_04-lts",
      "version": "latest"
    },
    "osDisk": {
      "caching": "ReadWrite",
      "createOption": "FromImage",
      "deleteOption": "Delete",
      "diskSizeGb": 30,
      "managedDisk": {
        "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/disks/myScaleSet_Instance1_disk1_xxx",
        "resourceGroup": "myResourceGroupxxx",
        "storageAccountType": "Premium_LRS"
      },
      "name": "myScaleSet_Instance1_disk1_xxx",
      "osType": "Linux"
    }
  },
  "timeCreated": "2022-11-29T22:16:44.500895+00:00",
  "type": "Microsoft.Compute/virtualMachines",
  "virtualMachineScaleSet": {
    "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSetxxx",
    "resourceGroup": "myResourceGroupxxx"
  }
}

Эти свойства описывают конфигурацию экземпляра виртуальной машины в масштабируемом наборе, а не конфигурацию масштабируемого набора в целом.

Вы можете выполнять обновления отдельных экземпляров виртуальных машин в группе масштабирования так же, как и для автономной виртуальной машины. Например, присоединение нового диска данных к экземпляру 1:

az vm disk attach --resource-group $MY_RESOURCE_GROUP_NAME --vm-name $INSTANCE_NAME --name disk_name1 --new

При запуске az vm show еще раз мы увидим, что экземпляр виртуальной машины подключен к новому диску.

{
  "storageProfile": {
    "dataDisks": [
      {
        "caching": "None",
        "createOption": "Empty",
        "deleteOption": "Detach",
        "diskSizeGb": 1023,
        "lun": 0,
        "managedDisk": {
          "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/disks/disk_name1",
          "resourceGroup": "myResourceGroupxxx",
          "storageAccountType": "Premium_LRS"
        },
        "name": "disk_name1",
        "toBeDetached": false
      }
    ]
  }
}

Добавьте экземпляр в масштабируемый набор

Иногда может потребоваться добавить новую виртуальную машину в масштабируемый набор, но вам нужны разные параметры конфигурации, отличные от перечисленных в модели масштабируемого набора. Виртуальные машины можно добавить в масштабируемый набор во время создания с помощью команды az vm create и указания имени масштабируемого набора, к которому нужно добавить экземпляр.

export NEW_INSTANCE_NAME="myNewInstance$RANDOM_SUFFIX"
az vm create --name $NEW_INSTANCE_NAME --resource-group $MY_RESOURCE_GROUP_NAME --vmss $SCALE_SET_NAME --image RHELRaw8LVMGen2
{
  "fqdns": "",
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Compute/virtualMachines/myNewInstancexxx",
  "location": "WestUS2",
  "macAddress": "60-45-BD-D7-13-DD",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.6",
  "publicIpAddress": "20.172.144.96",
  "resourceGroup": "myResourceGroupxxx",
  "zones": ""
}

Если мы затем проверим масштабируемый набор, то увидим, что добавился новый экземпляр.

az vm list --resource-group $MY_RESOURCE_GROUP_NAME --output table
Name                  ResourceGroup      Location
--------------------  ---------------    ----------
myNewInstancexxx      myResourceGroupxxx WestUS2
myScaleSet_Instance1  myResourceGroupxxx WestUS2
myScaleSet_Instance1  myResourceGroupxxx WestUS2

Обновите виртуальные машины up-to-date с помощью последней модели масштабируемого набора

Замечание

В настоящее время режимы обновления не поддерживаются в масштабируемых наборах виртуальных машин, использующих гибкий режим оркестрации.

Масштабируемые наборы имеют "политику обновления", которая определяет, как виртуальные машины будут доставлены up-to-date с последней моделью масштабируемого набора. Три режима политики обновления:

  • Автоматический – В этом режиме масштабируемый набор не гарантирует порядок отключения виртуальных машин. Масштабируемый набор может одновременно отключить все виртуальные машины.
  • Пошаговый — в этом режиме набор масштабирования развертывает обновление поэтапно, с необязательной паузой между этапами.
  • Вручную - В этом режиме при обновлении модели масштабируемого набора ничего не происходит с существующими виртуальными машинами, пока обновление не будет запущено вручную.

Если для масштабируемого набора настроено ручное обновление, вы можете запустить его вручную, используя az vmss update.

az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME

Замечание

Кластеры Service Fabric могут использовать только автоматический режим, но обновление обрабатывается иначе. Дополнительные сведения см. в разделе Обновление приложения Service Fabric.

Повторное создание масштабируемого набора

Масштабируемые наборы виртуальных машин создаст уникальное имя для каждой виртуальной машины в масштабируемом наборе. Соглашение об именовании отличается режимом оркестрации:

  • Режим гибкой оркестрации: {scale-set-name}_{8-char-guid}
  • Универсальный режим оркестрации: {scale-set-name}_{instance-id}

В случаях, когда необходимо повторно создать образ конкретного экземпляра, используйте az vmss reimage и укажите идентификатор экземпляра. Другой вариант — использовать az vm deployment для повторного создания образа виртуальной машины напрямую. Эта команда полезна, если требуется повторно создать образ виртуальной машины без указания идентификатора экземпляра.

# Get the VM name first
VM_NAME=$(az vmss list-instances \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $SCALE_SET_NAME \
  --query "[0].name" \
  -o tsv)

# Reimage the VM directly
az vm redeploy \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $VM_NAME

Обновление образа ОС масштабируемого набора

У вас может быть масштабируемый набор, который запускает старую версию Ubuntu. Вы хотите обновить до более новой версии Ubuntu, например последнюю версию. Свойство эталонной версии образа не является частью списка, поэтому вы можете напрямую изменить эти свойства с помощью az vmss update.

az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --set virtualMachineProfile.storageProfile.imageReference.version=latest

Также может потребоваться изменить образ, используемый масштабируемым набором. Например, может потребоваться обновить или изменить пользовательский образ, используемый масштабируемым набором. Чтобы изменить образ, используемый масштабируемым набором, измените свойство идентификатора эталонного изображения. Свойство идентификатора ссылки на образ не является частью списка, поэтому вы можете напрямую изменить это свойство с помощью az vmss update.

При использовании образов платформы Azure их можно обновить, изменив imageReference (дополнительные сведения см. в документации по REST API).

Замечание

Для образов платформы обычно указывается последняя версия в качестве эталонной версии образа. При создании, масштабировании и пересоздании виртуальные машины создаются с использованием последней доступной версии. Тем не менее это не означает, что образ ОС будет автоматически обновляться по мере выпуска новых версий. За автоматическое обновление ОС отвечает отдельная функция. Дополнительные сведения см. в документации по автоматическому обновлению ОС.

При использовании настроенных образов, вы можете обновить образ, обновив идентификатор imageReference (подробности см. в документации по REST API).

Обновить балансировщик нагрузки для вашего набора масштабирования

Предположим, у вас есть набор масштабов с Azure Load Balancer, и вы хотите заменить Azure Load Balancer на Azure Application Gateway. Свойства подсистемы балансировки нагрузки и шлюза приложений для масштабируемого набора являются частью списка, поэтому можно использовать команды для удаления или добавления элементов списка вместо непосредственного изменения свойств.

# Remove the load balancer backend pool from the scale set model
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --remove virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].loadBalancerBackendAddressPools 0

# Remove the load balancer backend pool from the scale set model; only necessary if you have NAT pools configured on the scale set
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --remove virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].loadBalancerInboundNatPools 0

# Add the application gateway backend pool to the scale set model
az vmss update --resource-group $MY_RESOURCE_GROUP_NAME --name $SCALE_SET_NAME --add virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].ApplicationGatewayBackendAddressPools '{"id": "/subscriptions/xxxxx/resourceGroups/'$MY_RESOURCE_GROUP_NAME'/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/{applicationGatewayBackendPoolName}"}'

Замечание

Эти команды предполагают наличие только одной конфигурации IP и балансировщика нагрузки в масштабируемом наборе. Если их несколько, может потребоваться использовать индекс списка, отличный от 0.

Дальнейшие шаги

В этом руководстве вы узнали, как изменить различные параметры набора масштабирования и отдельных экземпляров.

  • Обновление модели масштабируемого набора
  • Обновление отдельного экземпляра виртуальной машины в масштабируемом наборе
  • Добавьте экземпляр в ваш масштабируемый набор
  • Обновите виртуальные машины up-to-date с помощью последней модели масштабируемого набора
  • Повторное создание масштабируемого набора
  • Обновление образа ОС масштабируемого набора
  • Обновить балансировщик нагрузки для вашего набора масштабирования