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:
- Rozszerzenia maszyny wirtualnej platformy Azure
- Modyfikowanie Virtual Machine Scale Sets
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?
- Upewnij się, że rozszerzenia określone w parametrze provisionAfterExtensions są zdefiniowane w modelu zestawu skalowania.
- Upewnij się, że nie wprowadzono żadnych zależności cyklicznego. Na przykład następująca sekwencja nie jest dozwolona: ExtensionA —> ExtensionB —> ExtensionC —> ExtensionA
- 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.