Aprowizowanie rozszerzeń sekwencji w Virtual Machine Scale Sets

Rozszerzenia maszyn wirtualnych platformy Azure zapewniają możliwości, takie jak konfiguracja po wdrożeniu i zarządzanie, monitorowanie, zabezpieczenia i nie tylko. Wdrożenia produkcyjne zwykle używają kombinacji wielu rozszerzeń skonfigurowanych dla wystąpień maszyn wirtualnych w celu uzyskania pożądanych wyników.

W przypadku korzystania z wielu rozszerzeń na maszynie wirtualnej ważne jest, aby upewnić się, że rozszerzenia wymagające tych samych zasobów systemu operacyjnego nie próbują jednocześnie uzyskać tych zasobów. Niektóre rozszerzenia zależą również od innych rozszerzeń, aby zapewnić wymagane konfiguracje, takie jak ustawienia środowiska i wpisy tajne. Bez poprawnego porządkowania i sekwencjonowania wdrożenia rozszerzeń zależnych mogą zakończyć się niepowodzeniem.

W tym artykule opisano sposób konfigurowania rozszerzeń sekwencji dla wystąpień maszyn wirtualnych w Virtual Machine Scale Sets.

Wymagania wstępne

W tym artykule założono, że znasz następujące elementy:

Kiedy używać sekwencjonowania rozszerzeń

Sekwencjonowanie rozszerzeń nie jest obowiązkowe dla zestawów skalowania i o ile nie określono, rozszerzenia można aprowizować w wystąpieniu zestawu skalowania w dowolnej kolejności.

Jeśli na przykład model zestawu skalowania ma dwa rozszerzenia — ExtensionA i ExtensionB — określone w modelu, może wystąpić jedną z następujących sekwencji aprowizacji:

  • ExtensionA —> ExtensionB
  • ExtensionB —> ExtensionA

Jeśli aplikacja wymaga, aby rozszerzenie A było zawsze aprowizowane przed rozszerzeniem B, należy użyć sekwencjonowania rozszerzeń zgodnie z opisem w tym artykule. W przypadku sekwencjonowania rozszerzeń nastąpi teraz tylko jedna sekwencja:

  • ExtensionA — > ExtensionB

Wszelkie rozszerzenia, które nie zostały określone w zdefiniowanej sekwencji aprowizacji, można aprowizować w dowolnym momencie, w tym przed, po lub podczas zdefiniowanej sekwencji. Sekwencjonowanie rozszerzeń określa tylko, że określone rozszerzenie zostanie zaaprowizowane po innym określonym rozszerzeniu. Nie ma to wpływu na aprowizację żadnego innego rozszerzenia zdefiniowanego w modelu.

Jeśli na przykład model zestawu skalowania ma trzy rozszerzenia — Rozszerzenie A, Rozszerzenie B i Rozszerzenie C — określone w modelu, a rozszerzenie C jest ustawione na aprowizację po rozszerzeniu A, może wystąpić jedną z następujących sekwencji aprowizacji:

  • ExtensionA —> ExtensionC —> ExtensionB
  • ExtensionB —> ExtensionA —> ExtensionC
  • ExtensionA —> ExtensionB —> ExtensionC

Jeśli musisz upewnić się, że żadne inne rozszerzenie nie jest aprowizowane podczas wykonywania zdefiniowanej sekwencji rozszerzeń, zalecamy sekwencjonowanie wszystkich rozszerzeń w modelu zestawu skalowania. W powyższym przykładzie można ustawić obsługę administracyjną rozszerzenia B po rozszerzeniu C, tak aby mogła wystąpić tylko jedna sekwencja:

  • ExtensionA —> ExtensionC —> ExtensionB

Jak używać sekwencjonowania rozszerzeń

Aby sekwencjonować aprowizację rozszerzeń, należy zaktualizować definicję rozszerzenia w modelu zestawu skalowania, aby uwzględnić właściwość "provisionAfterExtensions", która akceptuje tablicę nazw rozszerzeń. Rozszerzenia wymienione w wartości tablicy właściwości muszą być w pełni zdefiniowane w modelu zestawu skalowania.

Wdrażanie szablonu

W poniższym przykładzie zdefiniowano szablon, w którym zestaw skalowania ma trzy rozszerzenia — ExtensionA, ExtensionB i ExtensionC — takie jak rozszerzenia są aprowizowane w kolejności:

  • ExtensionA —> ExtensionB —> ExtensionC
"virtualMachineProfile": {
  "extensionProfile": {
    "extensions": [
      {
        "name": "ExtensionA",
        "properties": {
          "publisher": "ExtensionA.Publisher",
          "settings": {},
          "typeHandlerVersion": "1.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionA"
        }
      },
      {
        "name": "ExtensionB",
        "properties": {
          "provisionAfterExtensions": [
            "ExtensionA"
          ],
          "publisher": "ExtensionB.Publisher",
          "settings": {},
          "typeHandlerVersion": "2.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionB"
        }
      }, 
      {
        "name": "ExtensionC",
        "properties": {
          "provisionAfterExtensions": [
            "ExtensionB"
          ],
          "publisher": "ExtensionC.Publisher",
          "settings": {},
          "typeHandlerVersion": "3.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionC"                   
        }
      }
    ]
  }
}

Ponieważ właściwość "provisionAfterExtensions" akceptuje tablicę nazw rozszerzeń, powyższy przykład można zmodyfikować w taki sposób, że rozszerzenieC jest aprowizowane po extensionA i ExtensionB, ale nie jest wymagane zamówienie między ExtensionA i ExtensionB. Do osiągnięcia tego scenariusza można użyć następującego szablonu:

"virtualMachineProfile": {
  "extensionProfile": {
    "extensions": [
      {
        "name": "ExtensionA",
        "properties": {
          "publisher": "ExtensionA.Publisher",
          "settings": {},
          "typeHandlerVersion": "1.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionA"
        }
      },
      {
        "name": "ExtensionB",
        "properties": {
          "publisher": "ExtensionB.Publisher",
          "settings": {},
          "typeHandlerVersion": "2.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionB"
        }
      }, 
      {
        "name": "ExtensionC",
        "properties": {
          "provisionAfterExtensions": [
            "ExtensionA","ExtensionB"
          ],
          "publisher": "ExtensionC.Publisher",
          "settings": {},
          "typeHandlerVersion": "3.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionC"                   
        }
      }
    ]
  }
}

Interfejs API REST

Poniższy przykład dodaje nowe rozszerzenie o nazwie ExtensionC do modelu zestawu skalowania. RozszerzenieC ma zależności od rozszerzenia ExtensionA i ExtensionB, które zostały już zdefiniowane w modelu zestawu skalowania.

PUT on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/extensions/ExtensionC?api-version=2018-10-01`
{ 
  "name": "ExtensionC",
  "properties": {
    "provisionAfterExtensions": [
      "ExtensionA","ExtensionB"
    ],
    "publisher": "ExtensionC.Publisher",
    "settings": {},
    "typeHandlerVersion": "3.0",
    "autoUpgradeMinorVersion": true,
    "type": "ExtensionC" 
  }                  
}

Jeśli rozszerzenie ExtensionC zostało zdefiniowane wcześniej w modelu zestawu skalowania i chcesz teraz dodać jego zależności, możesz wykonać polecenie PATCH , aby edytować już wdrożone właściwości rozszerzenia.

PATCH on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/extensions/ExtensionC?api-version=2018-10-01`
{ 
  "properties": {
    "provisionAfterExtensions": [
      "ExtensionA","ExtensionB"
    ]
  }                  
}

Zmiany istniejących wystąpień zestawu skalowania są stosowane w następnym uaktualnieniu.

Azure PowerShell

Użyj polecenia cmdlet Add-AzVmssExtension , aby dodać rozszerzenie Application Health do definicji modelu zestawu skalowania. Sekwencjonowanie rozszerzeń wymaga użycia programu PowerShell w wersji 1.2.0 lub nowszej.

W poniższym przykładzie dodano rozszerzenie Application Health do extensionProfile modelu w zestawie skalowania zestawu skalowania opartego na systemie Windows. Rozszerzenie Application Health zostanie aprowizowane po aprowizacji rozszerzenia niestandardowego skryptu, już zdefiniowanego w zestawie skalowania.

# Define the scale set variables
$vmScaleSetName = "myVMScaleSet"
$vmScaleSetResourceGroup = "myVMScaleSetResourceGroup"

# Define the Application Health extension properties
$publicConfig = @{"protocol" = "http"; "port" = 80; "requestPath" = "/healthEndpoint"};
$extensionName = "myHealthExtension"
$extensionType = "ApplicationHealthWindows"
$publisher = "Microsoft.ManagedServices"

# Get the scale set object
$vmScaleSet = Get-AzVmss `
  -ResourceGroupName $vmScaleSetResourceGroup `
  -VMScaleSetName $vmScaleSetName

# Add the Application Health extension to the scale set model
Add-AzVmssExtension -VirtualMachineScaleSet $vmScaleSet `
  -Name $extensionName `
  -Publisher $publisher `
  -Setting $publicConfig `
  -Type $extensionType `
  -TypeHandlerVersion "1.0" `
  -ProvisionAfterExtension "CustomScriptExtension" `
  -AutoUpgradeMinorVersion $True

# Update the scale set
Update-AzVmss -ResourceGroupName $vmScaleSetResourceGroup `
  -Name $vmScaleSetName `
  -VirtualMachineScaleSet $vmScaleSet

Interfejs wiersza polecenia platformy Azure 2.0

Użyj polecenia az vmss extension set , aby dodać rozszerzenie Application Health do definicji modelu zestawu skalowania. Sekwencjonowanie rozszerzeń wymaga użycia interfejsu wiersza polecenia platformy Azure w wersji 2.0.55 lub nowszej.

W poniższym przykładzie dodano rozszerzenie Application Health do modelu zestawu skalowania zestawu skalowania opartego na systemie Windows. Rozszerzenie Application Health zostanie aprowizowane po aprowizacji rozszerzenia niestandardowego skryptu, już zdefiniowanego w zestawie skalowania.

az vmss extension set \
  --name ApplicationHealthWindows \
  --publisher Microsoft.ManagedServices \
  --version 1.0 \
  --resource-group <myVMScaleSetResourceGroup> \
  --vmss-name <myVMScaleSet> \
  --provision-after-extensions CustomScriptExtension \
  --settings ./extension.json

Rozwiązywanie problemów

Nie można dodać rozszerzenia z zależnościami?

  1. Upewnij się, że rozszerzenia określone w parametrze provisionAfterExtensions są zdefiniowane w modelu zestawu skalowania.
  2. Upewnij się, że nie wprowadzono żadnych zależności cyklicznego. Na przykład następująca sekwencja nie jest dozwolona: ExtensionA —> ExtensionB —> ExtensionC —> ExtensionA
  3. Upewnij się, że wszystkie rozszerzenia, od których są potrzebne zależności, mają właściwość "settings" w obszarze rozszerzenia "properties". Jeśli na przykład funkcja ExtentionB musi być aprowizowana po rozszerzeniuA, pole ExtensionA musi mieć pole "settings" w obszarze ExtensionA "properties". Możesz określić pustą właściwość "settings", jeśli rozszerzenie nie nakazuje żadnych wymaganych ustawień.

Nie można usunąć rozszerzeń?

Upewnij się, że usuwane rozszerzenia nie są wymienione w obszarze provisionAfterExtensions dla innych rozszerzeń.

Następne kroki

Dowiedz się, jak wdrożyć aplikację na Virtual Machine Scale Sets.