Schnellstart: Einen öffentlichen Lastenausgleich für den Lastenausgleich bei VMs mithilfe einer ARM-Vorlage erstellen
In dieser Schnellstartanleitung erfahren Sie, wie Sie für den Lastenausgleich virtueller Computer einen Lastenausgleich im Tarif „Standard“ bereitstellen. Der Lastenausgleich verteilt den Datenverkehr auf mehrere VMs in einem Back-End-Pool. Die Vorlage erstellt auch ein virtuelles Netzwerk, Netzwerkschnittstellen, ein NAT-Gateway und eine Azure Bastion-Instanz.
Bei Verwendung einer ARM-Vorlage werden im Vergleich zu anderen Bereitstellungsmethoden weniger Schritte benötigt.
Eine Azure Resource Manager-Vorlage ist eine JSON (JavaScript Object Notation)-Datei, welche die Infrastruktur und die Konfiguration für Ihr Projekt definiert. Die Vorlage verwendet eine deklarative Syntax. Sie beschreiben Ihre geplante Bereitstellung, ohne die Abfolge der Programmierbefehle zum Erstellen der Bereitstellung zu schreiben.
Wenn Ihre Umgebung die Voraussetzungen erfüllt und Sie mit der Verwendung von ARM-Vorlagen vertraut sind, klicken Sie auf die Schaltfläche In Azure bereitstellen. Die Vorlage wird im Azure-Portal geöffnet.
Voraussetzungen
Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
Überprüfen der Vorlage
Die in dieser Schnellstartanleitung verwendete Vorlage stammt von der Seite mit den Azure-Schnellstartvorlagen.
Die Lastenausgleichs-SKU und die SKU für öffentliche IP-Adressen müssen übereinstimmen. Wenn Sie einen Lastenausgleich im Tarif „Standard“ erstellen, müssen Sie auch eine neue öffentliche Standard-IP-Adresse erstellen, die als Front-End für diesen Standard-Lastenausgleich konfiguriert ist. Wenn Sie einen Lastenausgleich im Tarif „Basic“ erstellen möchten, verwenden Sie diese Vorlage. Microsoft empfiehlt für Produktionsworkloads die Verwendung der Standard-SKU.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"metadata": {
"_generator": {
"name": "bicep",
"version": "0.26.54.24096",
"templateHash": "14680538243429534307"
}
},
"parameters": {
"projectName": {
"type": "string",
"metadata": {
"description": "Specifies a project name that is used for generating resource names."
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Specifies the location for all of the resources created by this template."
}
},
"adminUsername": {
"type": "string",
"metadata": {
"description": "Specifies the virtual machine administrator username."
}
},
"adminPassword": {
"type": "securestring",
"metadata": {
"description": "Specifies the virtual machine administrator password."
}
},
"vmSize": {
"type": "string",
"defaultValue": "Standard_D2s_v3",
"metadata": {
"description": "Size of the virtual machine"
}
},
"OSVersion": {
"type": "string",
"defaultValue": "2022-datacenter-azure-edition",
"allowedValues": [
"2016-datacenter-gensecond",
"2016-datacenter-server-core-g2",
"2016-datacenter-server-core-smalldisk-g2",
"2016-datacenter-smalldisk-g2",
"2016-datacenter-with-containers-g2",
"2016-datacenter-zhcn-g2",
"2019-datacenter-core-g2",
"2019-datacenter-core-smalldisk-g2",
"2019-datacenter-core-with-containers-g2",
"2019-datacenter-core-with-containers-smalldisk-g2",
"2019-datacenter-gensecond",
"2019-datacenter-smalldisk-g2",
"2019-datacenter-with-containers-g2",
"2019-datacenter-with-containers-smalldisk-g2",
"2019-datacenter-zhcn-g2",
"2022-datacenter-azure-edition",
"2022-datacenter-azure-edition-core",
"2022-datacenter-azure-edition-core-smalldisk",
"2022-datacenter-azure-edition-smalldisk",
"2022-datacenter-core-g2",
"2022-datacenter-core-smalldisk-g2",
"2022-datacenter-g2",
"2022-datacenter-smalldisk-g2"
],
"metadata": {
"description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version."
}
},
"imageSku": {
"type": "string",
"defaultValue": "vs-2019-ent-latest-win11-n-gen2",
"allowedValues": [
"vs-2019-ent-latest-win11-n-gen2",
"vs-2019-pro-general-win11-m365-gen2",
"vs-2019-comm-latest-win11-n-gen2",
"vs-2019-ent-general-win10-m365-gen2",
"vs-2019-ent-general-win11-m365-gen2",
"vs-2019-pro-general-win10-m365-gen2"
],
"metadata": {
"description": "Linux Sku"
}
},
"securityType": {
"type": "string",
"defaultValue": "TrustedLaunch",
"allowedValues": [
"Standard",
"TrustedLaunch"
],
"metadata": {
"description": "Security Type of the Virtual Machine."
}
}
},
"variables": {
"securityProfileJson": {
"uefiSettings": {
"secureBootEnabled": true,
"vTpmEnabled": true
},
"securityType": "[parameters('securityType')]"
},
"lbName": "[format('{0}-lb', parameters('projectName'))]",
"lbSkuName": "Standard",
"lbPublicIpAddressName": "[format('{0}-lbPublicIP', parameters('projectName'))]",
"lbFrontEndName": "LoadBalancerFrontEnd",
"lbBackendPoolName": "LoadBalancerBackEndPool",
"lbProbeName": "loadBalancerHealthProbe",
"nsgName": "[format('{0}-nsg', parameters('projectName'))]",
"vNetName": "[format('{0}-vnet', parameters('projectName'))]",
"vNetAddressPrefix": "10.0.0.0/16",
"vNetSubnetName": "BackendSubnet",
"vNetSubnetAddressPrefix": "10.0.0.0/24",
"bastionName": "[format('{0}-bastion', parameters('projectName'))]",
"bastionSubnetName": "AzureBastionSubnet",
"vNetBastionSubnetAddressPrefix": "10.0.1.0/24",
"bastionPublicIPAddressName": "[format('{0}-bastionPublicIP', parameters('projectName'))]",
"vmStorageAccountType": "Premium_LRS",
"extensionName": "GuestAttestation",
"extensionPublisher": "Microsoft.Azure.Security.WindowsAttestation",
"extensionVersion": "1.0",
"maaTenantName": "GuestAttestation",
"maaEndpoint": "[substring('emptyString', 0, 0)]",
"ascReportingEndpoint": "[substring('emptystring', 0, 0)]",
"natGatewayName": "[format('{0}-natgateway', parameters('projectName'))]",
"natGatewayPublicIPAddressName": "[format('{0}-natPublicIP', parameters('projectName'))]"
},
"resources": [
{
"copy": {
"name": "project_vm_1_networkInterface",
"count": "[length(range(0, 3))]"
},
"type": "Microsoft.Network/networkInterfaces",
"apiVersion": "2021-08-01",
"name": "[format('{0}-vm{1}-networkInterface', parameters('projectName'), add(range(0, 3)[copyIndex()], 1))]",
"location": "[parameters('location')]",
"properties": {
"ipConfigurations": [
{
"name": "ipconfig1",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"subnet": {
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vNetName'), variables('vNetSubnetName'))]"
},
"loadBalancerBackendAddressPools": [
{
"id": "[resourceId('Microsoft.Network/loadBalancers/backendAddressPools', variables('lbName'), variables('lbBackendPoolName'))]"
}
]
}
}
],
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('nsgName'))]"
}
},
"dependsOn": [
"[resourceId('Microsoft.Network/loadBalancers', variables('lbName'))]",
"[resourceId('Microsoft.Network/networkSecurityGroups', variables('nsgName'))]",
"[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vNetName'), variables('vNetSubnetName'))]"
]
},
{
"copy": {
"name": "project_vm_1_InstallWebServer",
"count": "[length(range(0, 3))]"
},
"type": "Microsoft.Compute/virtualMachines/extensions",
"apiVersion": "2021-11-01",
"name": "[format('{0}-vm{1}/InstallWebServer', parameters('projectName'), add(range(0, 3)[copyIndex()], 1))]",
"location": "[parameters('location')]",
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.10",
"autoUpgradeMinorVersion": true,
"settings": {
"commandToExecute": "powershell.exe Install-WindowsFeature -name Web-Server -IncludeManagementTools && powershell.exe remove-item 'C:\\inetpub\\wwwroot\\iisstart.htm' && powershell.exe Add-Content -Path 'C:\\inetpub\\wwwroot\\iisstart.htm' -Value $('Hello World from ' + $env:computername)"
}
},
"dependsOn": [
"project_vm_1"
]
},
{
"copy": {
"name": "project_vm_1",
"count": "[length(range(1, 3))]"
},
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2021-11-01",
"name": "[format('{0}-vm{1}', parameters('projectName'), range(1, 3)[copyIndex()])]",
"location": "[parameters('location')]",
"zones": [
"[string(range(1, 3)[copyIndex()])]"
],
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('vmSize')]"
},
"storageProfile": {
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "[parameters('OSVersion')]",
"version": "latest"
},
"osDisk": {
"createOption": "FromImage",
"managedDisk": {
"storageAccountType": "[variables('vmStorageAccountType')]"
}
}
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces', format('{0}-vm{1}-networkInterface', parameters('projectName'), range(1, 3)[copyIndex()]))]"
}
]
},
"osProfile": {
"computerName": "[format('{0}-vm{1}', parameters('projectName'), range(1, 3)[copyIndex()])]",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPassword')]",
"windowsConfiguration": {
"enableAutomaticUpdates": true,
"provisionVMAgent": true
}
},
"securityProfile": "[if(equals(parameters('securityType'), 'TrustedLaunch'), variables('securityProfileJson'), null())]"
},
"dependsOn": [
"project_vm_1_networkInterface"
]
},
{
"copy": {
"name": "projectName_vm_1_3_GuestAttestation",
"count": "[length(range(1, 3))]"
},
"condition": "[and(equals(parameters('securityType'), 'TrustedLaunch'), and(equals(variables('securityProfileJson').uefiSettings.secureBootEnabled, true()), equals(variables('securityProfileJson').uefiSettings.vTpmEnabled, true())))]",
"type": "Microsoft.Compute/virtualMachines/extensions",
"apiVersion": "2022-03-01",
"name": "[format('{0}-vm{1}/GuestAttestation', parameters('projectName'), range(1, 3)[copyIndex()])]",
"location": "[parameters('location')]",
"properties": {
"publisher": "[variables('extensionPublisher')]",
"type": "[variables('extensionName')]",
"typeHandlerVersion": "[variables('extensionVersion')]",
"autoUpgradeMinorVersion": true,
"enableAutomaticUpgrade": true,
"settings": {
"AttestationConfig": {
"MaaSettings": {
"maaEndpoint": "[variables('maaEndpoint')]",
"maaTenantName": "[variables('maaTenantName')]"
},
"AscSettings": {
"ascReportingEndpoint": "[variables('ascReportingEndpoint')]",
"ascReportingFrequency": ""
},
"useCustomToken": "false",
"disableAlerts": "false"
}
}
},
"dependsOn": [
"project_vm_1"
]
},
{
"type": "Microsoft.Network/natGateways",
"apiVersion": "2021-05-01",
"name": "[variables('natGatewayName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard"
},
"properties": {
"idleTimeoutInMinutes": 4,
"publicIpAddresses": [
{
"id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('natGatewayPublicIPAddressName'))]"
}
]
},
"dependsOn": [
"[resourceId('Microsoft.Network/publicIPAddresses', variables('natGatewayPublicIPAddressName'))]"
]
},
{
"type": "Microsoft.Network/publicIPAddresses",
"apiVersion": "2021-05-01",
"name": "[variables('natGatewayPublicIPAddressName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard"
},
"properties": {
"publicIPAddressVersion": "IPv4",
"publicIPAllocationMethod": "Static",
"idleTimeoutInMinutes": 4
}
},
{
"type": "Microsoft.Network/virtualNetworks/subnets",
"apiVersion": "2021-08-01",
"name": "[format('{0}/{1}', variables('vNetName'), variables('bastionSubnetName'))]",
"properties": {
"addressPrefix": "[variables('vNetBastionSubnetAddressPrefix')]"
},
"dependsOn": [
"[resourceId('Microsoft.Network/virtualNetworks', variables('vNetName'))]",
"[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vNetName'), variables('vNetSubnetName'))]"
]
},
{
"type": "Microsoft.Network/virtualNetworks/subnets",
"apiVersion": "2021-08-01",
"name": "[format('{0}/{1}', variables('vNetName'), variables('vNetSubnetName'))]",
"properties": {
"addressPrefix": "[variables('vNetSubnetAddressPrefix')]",
"natGateway": {
"id": "[resourceId('Microsoft.Network/natGateways', variables('natGatewayName'))]"
}
},
"dependsOn": [
"[resourceId('Microsoft.Network/natGateways', variables('natGatewayName'))]",
"[resourceId('Microsoft.Network/virtualNetworks', variables('vNetName'))]"
]
},
{
"type": "Microsoft.Network/bastionHosts",
"apiVersion": "2021-08-01",
"name": "[variables('bastionName')]",
"location": "[parameters('location')]",
"properties": {
"ipConfigurations": [
{
"name": "IpConf",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"publicIPAddress": {
"id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('bastionPublicIPAddressName'))]"
},
"subnet": {
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vNetName'), variables('bastionSubnetName'))]"
}
}
}
]
},
"dependsOn": [
"[resourceId('Microsoft.Network/publicIPAddresses', variables('bastionPublicIPAddressName'))]",
"[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vNetName'), variables('bastionSubnetName'))]"
]
},
{
"type": "Microsoft.Network/publicIPAddresses",
"apiVersion": "2021-08-01",
"name": "[variables('bastionPublicIPAddressName')]",
"location": "[parameters('location')]",
"sku": {
"name": "[variables('lbSkuName')]"
},
"properties": {
"publicIPAddressVersion": "IPv4",
"publicIPAllocationMethod": "Static"
}
},
{
"type": "Microsoft.Network/loadBalancers",
"apiVersion": "2021-08-01",
"name": "[variables('lbName')]",
"location": "[parameters('location')]",
"sku": {
"name": "[variables('lbSkuName')]"
},
"properties": {
"frontendIPConfigurations": [
{
"name": "[variables('lbFrontEndName')]",
"properties": {
"publicIPAddress": {
"id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('lbPublicIpAddressName'))]"
}
}
}
],
"backendAddressPools": [
{
"name": "[variables('lbBackendPoolName')]"
}
],
"loadBalancingRules": [
{
"name": "myHTTPRule",
"properties": {
"frontendIPConfiguration": {
"id": "[resourceId('Microsoft.Network/loadBalancers/frontendIPConfigurations', variables('lbName'), variables('lbFrontEndName'))]"
},
"backendAddressPool": {
"id": "[resourceId('Microsoft.Network/loadBalancers/backendAddressPools', variables('lbName'), variables('lbBackendPoolName'))]"
},
"frontendPort": 80,
"backendPort": 80,
"enableFloatingIP": false,
"idleTimeoutInMinutes": 15,
"protocol": "Tcp",
"enableTcpReset": true,
"loadDistribution": "Default",
"disableOutboundSnat": true,
"probe": {
"id": "[resourceId('Microsoft.Network/loadBalancers/probes', variables('lbName'), variables('lbProbeName'))]"
}
}
}
],
"probes": [
{
"name": "[variables('lbProbeName')]",
"properties": {
"protocol": "Tcp",
"port": 80,
"intervalInSeconds": 5,
"numberOfProbes": 2
}
}
],
"outboundRules": []
},
"dependsOn": [
"[resourceId('Microsoft.Network/publicIPAddresses', variables('lbPublicIpAddressName'))]"
]
},
{
"type": "Microsoft.Network/publicIPAddresses",
"apiVersion": "2021-08-01",
"name": "[variables('lbPublicIpAddressName')]",
"location": "[parameters('location')]",
"sku": {
"name": "[variables('lbSkuName')]"
},
"properties": {
"publicIPAddressVersion": "IPv4",
"publicIPAllocationMethod": "Static"
}
},
{
"type": "Microsoft.Network/networkSecurityGroups",
"apiVersion": "2021-08-01",
"name": "[variables('nsgName')]",
"location": "[parameters('location')]",
"properties": {
"securityRules": [
{
"name": "AllowHTTPInbound",
"properties": {
"protocol": "*",
"sourcePortRange": "*",
"destinationPortRange": "80",
"sourceAddressPrefix": "Internet",
"destinationAddressPrefix": "*",
"access": "Allow",
"priority": 100,
"direction": "Inbound"
}
}
]
}
},
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2021-08-01",
"name": "[variables('vNetName')]",
"location": "[parameters('location')]",
"properties": {
"addressSpace": {
"addressPrefixes": [
"[variables('vNetAddressPrefix')]"
]
}
}
}
],
"outputs": {
"location": {
"type": "string",
"value": "[parameters('location')]"
},
"name": {
"type": "string",
"value": "[variables('lbName')]"
},
"resourceGroupName": {
"type": "string",
"value": "[resourceGroup().name]"
},
"resourceId": {
"type": "string",
"value": "[resourceId('Microsoft.Network/loadBalancers', variables('lbName'))]"
}
}
}
In der Vorlage wurden mehrere Azure-Ressourcen definiert:
- Microsoft.Network/loadBalancers
- Microsoft.Network/publicIPAddresses: für den Lastenausgleich, Bastionhost und das NAT-Gateway.
- Microsoft.Network/bastionHosts
- Microsoft.Network/networkSecurityGroups
- Microsoft.Network/virtualNetworks
- Microsoft.Compute/virtualMachines (3).
- Microsoft.Network/networkInterfaces (3).
- Microsoft.Compute/virtualMachine/extensions (3): Für die Konfiguration von IIS (Internet Information Server) und der Webseiten.
- Microsoft.Network/natGateways: für das NAT-Gateway.
Wichtig
Die Stundenpreise gelten ab dem Zeitpunkt der Bereitstellung von Bastion, unabhängig von der Nutzung ausgehender Daten. Weitere Informationen dazu finden Sie unter Preise und SKUs. Wenn Sie Bastion im Rahmen eines Tutorials oder Tests bereitstellen, empfiehlt es sich, diese Ressource zu löschen, nachdem Sie diese benutzt haben.
Weitere Vorlagen zum Azure Load Balancer finden Sie unter Azure-Schnellstartvorlagen.
Bereitstellen der Vorlage
Wählen Sie Try it (Ausprobieren) im folgenden Codeblock aus, um Azure Cloud Shell zu öffnen. Folgen Sie dann den Anweisungen, um sich bei Azure anzumelden.
$projectName = Read-Host -Prompt "Enter a project name with 12 or less letters or numbers that is used to generate Azure resource names" $location = Read-Host -Prompt "Enter the location (i.e. centralus)" $adminUserName = Read-Host -Prompt "Enter the virtual machine administrator account name" $adminPassword = Read-Host -Prompt "Enter the virtual machine administrator password" -AsSecureString $resourceGroupName = "${projectName}rg" $templateUri = "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.network/load-balancer-standard-create/azuredeploy.json" New-AzResourceGroup -Name $resourceGroupName -Location $location New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri $templateUri -Name $projectName -location $location -adminUsername $adminUsername -adminPassword $adminPassword Write-Host "Press [ENTER] to continue."
Warten Sie, bis die Aufforderung in der Konsole angezeigt wird.
Wählen Sie Copy (Kopieren) im vorherigen Codeblock aus, um das PowerShell-Skript zu kopieren.
Klicken Sie mit der rechten Maustaste auf den Shellkonsolenbereich, und wählen Sie Einfügen aus.
Gehen Sie die Werte ein.
Die Vorlagenbereitstellung erstellt drei Verfügbarkeitszonen. Verfügbarkeitszonen werden nur in bestimmten Regionen unterstützt. Verwenden Sie eine der unterstützten Regionen. Wenn Sie nicht sicher sind, geben Sie centralus ein.
Der Ressourcengruppenname ist der Projektname mit dem Zusatz
rg
. Sie benötigen den Ressourcengruppennamen im nächsten Abschnitt.
Das Bereitstellen der Vorlage dauert ungefähr 10 Minuten. Nach Abschluss des Vorgangs sieht die Ausgabe in etwa wie folgt aus:
Azure PowerShell wird verwendet, um die Vorlage bereitzustellen. Sie können auch das Azure-Portal, die Azure CLI und die REST-API verwenden. Informationen zu anderen Bereitstellungsmethoden finden Sie unter Bereitstellen von Vorlagen.
Überprüfen der bereitgestellten Ressourcen
Melden Sie sich beim Azure-Portal an.
Wählen Sie im linken Bereich Ressourcengruppen aus.
Wählen Sie die Ressourcengruppe aus, die Sie im vorherigen Abschnitt erstellt haben. Der Ressourcengruppenname entspricht standardmäßig dem Projektnamen mit dem Zusatz rg.
Wählen Sie den Load Balancer aus. Sein Standardname entspricht dem Projektnamen mit dem Zusatz -lb.
Kopieren Sie nur den IP-Adressteil der öffentlichen IP-Adresse, und fügen Sie ihn in die Adressleiste des Browsers ein.
Der Browser zeigt die Standardseite des Internetinformationsdienste-Webservers (Internet Information Services, IIS) an.
Sie können vom Clientcomputer aus eine erzwungene Aktualisierung Ihres Webbrowsers durchführen, um zu verfolgen, wie der Lastenausgleich den Datenverkehr auf alle drei virtuellen Computer verteilt.
Bereinigen von Ressourcen
Löschen Sie die Ressourcen, wenn Sie sie nicht mehr benötigen:
- Resource group
- Load Balancer
- Verwandte Ressourcen
Wählen Sie im Azure-Portal die Ressourcengruppe aus, die den Lastenausgleich enthält, und wählen Sie anschließend Ressourcengruppe löschen aus.
Nächste Schritte
In dieser Schnellstartanleitung führen Sie die folgenden Schritte aus:
- Erstellen eines virtuellen Netzwerks für Lastenausgleich und virtuelle Computer.
- Erstellen eines Azure-Bastionhosts für die Verwaltung.
- Erstellen eines Lastenausgleichs im Tarif „Standard“ und Anfügen von virtuellen Computern an diesen
- Konfigurieren der Datenverkehrsregel für den Lastenausgleich sowie des Integritätstests
- Testen des Lastenausgleichs
Weitere Informationen zum Lastenausgleich finden Sie in den Tutorials zum Azure Load Balancer.