Udostępnij za pośrednictwem


Aprowizowanie rozszerzenia sekwencji w zestawach skalowania maszyn wirtualnych

Rozszerzenia maszyn wirtualnych platformy Azure zapewniają funkcje, takie jak konfiguracja i zarządzanie po wdrożeniu, 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 należy 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 prawidłowego 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 zestawach skalowania maszyn wirtualnych.

Wymagania wstępne

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

Kiedy należy 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, mogą 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. Sekwencjonowanie rozszerzeń spowoduje teraz wystąpienie tylko jednej sekwencji:

  • 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 zainicjowane po innym konkretnym 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 zostanie 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 aprowidowane 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 tylko jedna sekwencja mogła wystąpić:

  • ExtensionA — ExtensionC —>> ExtensionB

Jak używać sekwencjonowania rozszerzeń

Aby sekwencjonować aprowizowanie 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 — tak aby rozszerzenia zostały aprowidowane w następującej 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ć, tak aby rozszerzenie ExtensionC było aprowidowane po rozszerzeniach ExtensionA i ExtensionB, ale nie jest wymagana kolejność 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

W poniższym przykładzie dodano nowe rozszerzenie o nazwie ExtensionC do modelu zestawu skalowania. RozszerzenieC ma zależności od rozszerzeńA 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 modułu Az programu PowerShell 1.2.0 lub nowszego.

W poniższym przykładzie dodano rozszerzenie Application Health do extensionProfile modelu zestawu skalowania w zestawie skalowania zestawu skalowania opartego na systemie Windows. Rozszerzenie Application Health zostanie aprowidowane po aprowizacji rozszerzenia niestandardowego skryptu zdefiniowanego już 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 aprowidowane po aprowizacji rozszerzenia niestandardowego skryptu zdefiniowanego już 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ą wymagane zależności, mają właściwość "settings" w obszarze rozszerzenia "properties". Jeśli na przykład funkcja ExtentionB musi zostać aprowizowana po rozszerzeniuA, rozszerzenieA musi mieć pole "settings" w obszarze ExtensionA "properties". Można określić pustą właściwość "settings", jeśli rozszerzenie nie wymaga ż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ę w zestawach skalowania maszyn wirtualnych.