Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menjelaskan cara menggunakan Azure CLI untuk membuat Set Skala Komputer Virtual.
Pastikan Anda telah menginstal Azure CLI terbaru dan masuk ke akun Azure dengan az login.
Luncurkan Azure Cloud Shell
Azure Cloud Shell adalah shell interaktif gratis yang dapat Anda gunakan untuk menjalankan langkah-langkah dalam artikel ini. Shell ini memiliki alat Azure umum yang telah dipasang sebelumnya dan dikonfigurasi untuk digunakan dengan akun Anda.
Untuk membuka Cloud Shell, pilih Buka Cloud Shell dari sudut kanan atas blok kode. Anda juga dapat meluncurkan Cloud Shell di tab browser terpisah dengan membuka https://shell.azure.com/cli. Pilih Salin untuk menyalin blok kode, tempelkan ke Cloud Shell, dan tekan masukkan untuk menjalankannya.
Menentukan variabel lingkungan
Tentukan variabel lingkungan sebagai berikut.
export RANDOM_ID="$(openssl rand -hex 3)"
export MY_RESOURCE_GROUP_NAME="myVMSSResourceGroup$RANDOM_ID"
export REGION=EastUS
export MY_VMSS_NAME="myVMSS$RANDOM_ID"
export MY_USERNAME=azureuser
export MY_VM_IMAGE="Ubuntu2204"
export MY_VNET_NAME="myVNet$RANDOM_ID"
export NETWORK_PREFIX="$(($RANDOM % 254 + 1))"
export MY_VNET_PREFIX="10.$NETWORK_PREFIX.0.0/16"
export MY_VM_SN_NAME="myVMSN$RANDOM_ID"
export MY_VM_SN_PREFIX="10.$NETWORK_PREFIX.0.0/24"
export MY_APPGW_SN_NAME="myAPPGWSN$RANDOM_ID"
export MY_APPGW_SN_PREFIX="10.$NETWORK_PREFIX.1.0/24"
export MY_APPGW_NAME="myAPPGW$RANDOM_ID"
export MY_APPGW_PUBLIC_IP_NAME="myAPPGWPublicIP$RANDOM_ID"
Buat grup sumber daya
Grup sumber daya adalah kontainer logis tempat sumber daya Azure disebarkan dan dikelola. Semua sumber daya harus ditempatkan dalam grup sumber daya. Perintah berikut membuat grup sumber daya dengan parameter $MY_RESOURCE_GROUP_NAME dan $REGION yang ditentukan sebelumnya.
az group create --name $MY_RESOURCE_GROUP_NAME --location $REGION -o JSON
Hasil:
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx",
"location": "eastus",
"managedBy": null,
"name": "myVMSSResourceGroupxxxxxx",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
Membuat sumber daya jaringan
Sekarang Anda akan membuat sumber daya jaringan. Dalam langkah ini Anda akan membuat jaringan virtual, satu subnet 1 untuk Application Gateway, dan satu subnet untuk VM. Anda juga harus memiliki IP publik untuk melampirkan Application Gateway Anda untuk menjangkau aplikasi web Anda dari internet.
Membuat jaringan virtual dan subnet
az network vnet create --name $MY_VNET_NAME --resource-group $MY_RESOURCE_GROUP_NAME --location $REGION --address-prefix $MY_VNET_PREFIX --subnet-name $MY_VM_SN_NAME --subnet-prefix $MY_VM_SN_PREFIX -o JSON
Hasil:
{
"newVNet": {
"addressSpace": {
"addressPrefixes": [
"10.X.0.0/16"
]
},
"enableDdosProtection": false,
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx",
"location": "eastus",
"name": "myVNetxxxxxx",
"provisioningState": "Succeeded",
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"resourceGuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"subnets": [
{
"addressPrefix": "10.X.0.0/24",
"delegations": [],
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx/subnets/myVMSNxxxxxx",
"name": "myVMSNxxxxxx",
"privateEndpointNetworkPolicies": "Disabled",
"privateLinkServiceNetworkPolicies": "Enabled",
"provisioningState": "Succeeded",
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/virtualNetworks/subnets"
}
],
"type": "Microsoft.Network/virtualNetworks",
"virtualNetworkPeerings": []
}
}
Membuat sumber daya Application Gateway
Azure Application Gateway memerlukan subnet khusus dalam jaringan virtual Anda. Perintah berikut membuat subnet bernama $MY_APPGW_SN_NAME dengan awalan alamat tertentu bernama $MY_APPGW_SN_PREFIX di jaringan virtual Anda $MY_VNET_NAME.
az network vnet subnet create --name $MY_APPGW_SN_NAME --resource-group $MY_RESOURCE_GROUP_NAME --vnet-name $MY_VNET_NAME --address-prefix $MY_APPGW_SN_PREFIX -o JSON
Hasil:
{
"addressPrefix": "10.66.1.0/24",
"delegations": [],
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx/subnets/myAPPGWSNxxxxxx",
"name": "myAPPGWSNxxxxxx",
"privateEndpointNetworkPolicies": "Disabled",
"privateLinkServiceNetworkPolicies": "Enabled",
"provisioningState": "Succeeded",
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/virtualNetworks/subnets"
}
Perintah berikut membuat IPv4 publik standar, zona redundan, statis, di grup sumber daya Anda.
az network public-ip create --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_APPGW_PUBLIC_IP_NAME --sku Standard --location $REGION --allocation-method static --version IPv4 --zone 1 2 3 -o JSON
Hasil:
{
"publicIp": {
"ddosSettings": {
"protectionMode": "VirtualNetworkInherited"
},
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/publicIPAddresses//myAPPGWPublicIPxxxxxx",
"idleTimeoutInMinutes": 4,
"ipAddress": "X.X.X.X",
"ipTags": [],
"location": "eastus",
"name": "/myAPPGWPublicIPxxxxxx",
"provisioningState": "Succeeded",
"publicIPAddressVersion": "IPv4",
"publicIPAllocationMethod": "Static",
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"resourceGuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"sku": {
"name": "Standard",
"tier": "Regional"
},
"type": "Microsoft.Network/publicIPAddresses",
"zones": [
"1",
"2",
"3"
]
}
}
Dalam langkah ini, Anda membuat Application Gateway yang akan Anda integrasikan dengan Virtual Machine Scale Set Anda. Contoh ini membuat Application Gateway zona redundan dengan SKU Standard_v2 dan mengaktifkan komunikasi Http untuk Application Gateway. IP publik $MY_APPGW_PUBLIC_IP_NAME yang dibuat pada langkah sebelumnya dilampirkan ke Application Gateway.
az network application-gateway create --name $MY_APPGW_NAME --location $REGION --resource-group $MY_RESOURCE_GROUP_NAME --vnet-name $MY_VNET_NAME --subnet $MY_APPGW_SN_NAME --capacity 2 --zones 1 2 3 --sku Standard_v2 --http-settings-cookie-based-affinity Disabled --frontend-port 80 --http-settings-port 80 --http-settings-protocol Http --public-ip-address $MY_APPGW_PUBLIC_IP_NAME --priority 1001 -o JSON
Penting
Dalam tutorial ini, pertahankan path web pada port 80 secara menyeluruh. Jika Anda menyesuaikan pendengar Application Gateway atau pengaturan HTTP backend untuk menggunakan port yang berbeda (misalnya, 8080), halaman sampel NGINX yang disebarkan nanti dalam tutorial ini tidak akan dimuat kecuali layanan backend juga dikonfigurasi untuk port tersebut.
Untuk memverifikasi bahwa pengaturan HTTP backend Application Gateway masih dikonfigurasi untuk port 80, jalankan:
az network application-gateway http-settings list \
--resource-group $MY_RESOURCE_GROUP_NAME \
--gateway-name $MY_APPGW_NAME \
--query "[].[name,port,protocol]" \
--output table
{
"applicationGateway": {
"backendAddressPools": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/backendAddressPools/appGatewayBackendPool",
"name": "appGatewayBackendPool",
"properties": {
"backendAddresses": [],
"provisioningState": "Succeeded",
"requestRoutingRules": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/requestRoutingRules/rule1",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
]
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/backendAddressPools"
}
],
"backendHttpSettingsCollection": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/backendHttpSettingsCollection/appGatewayBackendHttpSettings",
"name": "appGatewayBackendHttpSettings",
"properties": {
"connectionDraining": {
"drainTimeoutInSec": 1,
"enabled": false
},
"cookieBasedAffinity": "Disabled",
"pickHostNameFromBackendAddress": false,
"port": 80,
"protocol": "Http",
"provisioningState": "Succeeded",
"requestRoutingRules": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/requestRoutingRules/rule1",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"requestTimeout": 30
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/backendHttpSettingsCollection"
}
],
"backendSettingsCollection": [],
"frontendIPConfigurations": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/frontendIPConfigurations/appGatewayFrontendIP",
"name": "appGatewayFrontendIP",
"properties": {
"httpListeners": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/httpListeners/appGatewayHttpListener",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"privateIPAllocationMethod": "Dynamic",
"provisioningState": "Succeeded",
"publicIPAddress": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/publicIPAddresses/myAPPGWPublicIPxxxxxx",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/frontendIPConfigurations"
}
],
"frontendPorts": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/frontendPorts/appGatewayFrontendPort",
"name": "appGatewayFrontendPort",
"properties": {
"httpListeners": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/httpListeners/appGatewayHttpListener",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"port": 80,
"provisioningState": "Succeeded"
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/frontendPorts"
}
],
"gatewayIPConfigurations": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/gatewayIPConfigurations/appGatewayFrontendIP",
"name": "appGatewayFrontendIP",
"properties": {
"provisioningState": "Succeeded",
"subnet": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxxx/subnets/myAPPGWSNxxxxxx",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/gatewayIPConfigurations"
}
],
"httpListeners": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/httpListeners/appGatewayHttpListener",
"name": "appGatewayHttpListener",
"properties": {
"frontendIPConfiguration": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/frontendIPConfigurations/appGatewayFrontendIP",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
},
"frontendPort": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/frontendPorts/appGatewayFrontendPort",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
},
"hostNames": [],
"protocol": "Http",
"provisioningState": "Succeeded",
"requestRoutingRules": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/requestRoutingRules/rule1",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"requireServerNameIndication": false
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/httpListeners"
}
],
"listeners": [],
"loadDistributionPolicies": [],
"operationalState": "Running",
"privateEndpointConnections": [],
"privateLinkConfigurations": [],
"probes": [],
"provisioningState": "Succeeded",
"redirectConfigurations": [],
"requestRoutingRules": [
{
"etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/requestRoutingRules/rule1",
"name": "rule1",
"properties": {
"backendAddressPool": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/backendAddressPools/appGatewayBackendPool",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
},
"backendHttpSettings": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/backendHttpSettingsCollection/appGatewayBackendHttpSettings",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
},
"httpListener": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxxxx/httpListeners/appGatewayHttpListener",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
},
"priority": 1001,
"provisioningState": "Succeeded",
"ruleType": "Basic"
},
"resourceGroup": "myVMSSResourceGroupxxxxxx",
"type": "Microsoft.Network/applicationGateways/requestRoutingRules"
}
],
"resourceGuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"rewriteRuleSets": [],
"routingRules": [],
"sku": {
"capacity": 2,
"family": "Generation_1",
"name": "Standard_v2",
"tier": "Standard_v2"
},
"sslCertificates": [],
"sslProfiles": [],
"trustedClientCertificates": [],
"trustedRootCertificates": [],
"urlPathMaps": []
}
}
Membuat Set Skala Komputer Virtual
Penting
Mulai November 2023, set skala VM yang dibuat menggunakan PowerShell dan Azure CLI akan default ke Mode Orkestrasi Fleksibel jika tidak ada mode orkestrasi yang ditentukan. Untuk informasi selengkapnya tentang perubahan ini dan tindakan yang perlu Anda lakukan, kunjungi Perubahan yang Merusak Kompatibilitas untuk Pelanggan VMSS PowerShell/CLI - Microsoft Community Hub
Sekarang buat Virtual Machine Scale Set dengan az vmss create. Contoh berikut membuat set skala redundan zona dengan jumlah instans 2 dengan IP publik di subnet $MY_VM_SN_NAME dalam grup sumber daya Anda $MY_RESOURCE_GROUP_NAME, mengintegrasikan Application Gateway, dan membuat kunci SSH. Pastikan untuk menyimpan kunci SSH jika Anda perlu masuk ke VM Anda melalui ssh.
az vmss create --name $MY_VMSS_NAME --resource-group $MY_RESOURCE_GROUP_NAME --image $MY_VM_IMAGE --admin-username $MY_USERNAME --generate-ssh-keys --public-ip-per-vm --orchestration-mode Uniform --instance-count 2 --zones 1 2 3 --vnet-name $MY_VNET_NAME --subnet $MY_VM_SN_NAME --vm-sku Standard_DS2_v2 --upgrade-policy-mode Automatic --app-gateway $MY_APPGW_NAME --backend-pool-name appGatewayBackendPool -o JSON
Hasil:
{
"vmss": {
"doNotRunExtensionsOnOverprovisionedVMs": false,
"orchestrationMode": "Uniform",
"overprovision": true,
"platformFaultDomainCount": 1,
"provisioningState": "Succeeded",
"singlePlacementGroup": false,
"timeCreated": "20xx-xx-xxTxx:xx:xx.xxxxxx+00:00",
"uniqueId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"upgradePolicy": {
"mode": "Automatic",
"rollingUpgradePolicy": {
"maxBatchInstancePercent": 20,
"maxSurge": false,
"maxUnhealthyInstancePercent": 20,
"maxUnhealthyUpgradedInstancePercent": 20,
"pauseTimeBetweenBatches": "PT0S",
"rollbackFailedInstancesOnPolicyBreach": false
}
},
"virtualMachineProfile": {
"networkProfile": {
"networkInterfaceConfigurations": [
{
"name": "myvmsa53cNic",
"properties": {
"disableTcpStateTracking": false,
"dnsSettings": {
"dnsServers": []
},
"enableAcceleratedNetworking": false,
"enableIPForwarding": false,
"ipConfigurations": [
{
"name": "myvmsa53cIPConfig",
"properties": {
"applicationGatewayBackendAddressPools": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGW7xxxxx/backendAddressPools/appGatewayBackendPool",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"privateIPAddressVersion": "IPv4",
"publicIPAddressConfiguration": {
"name": "instancepublicip",
"properties": {
"idleTimeoutInMinutes": 10,
"ipTags": [],
"publicIPAddressVersion": "IPv4"
}
},
"subnet": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxx/subnets/myVMSN7xxxxx",
"resourceGroup": "myVMSSResourceGroupxxxxxxx"
}
}
}
],
"primary": true
}
}
]
},
"osProfile": {
"adminUsername": "azureuser",
"allowExtensionOperations": true,
"computerNamePrefix": "myvmsa53c",
"linuxConfiguration": {
"disablePasswordAuthentication": true,
"enableVMAgentPlatformUpdates": false,
"provisionVMAgent": true,
"ssh": {
"publicKeys": [
{
"keyData": "ssh-rsa xxxxxxxx",
"path": "/home/azureuser/.ssh/authorized_keys"
}
]
}
},
"requireGuestProvisionSignal": true,
"secrets": []
},
"storageProfile": {
"diskControllerType": "SCSI",
"imageReference": {
"offer": "0001-com-ubuntu-server-jammy",
"publisher": "Canonical",
"sku": "22_04-lts-gen2",
"version": "latest"
},
"osDisk": {
"caching": "ReadWrite",
"createOption": "FromImage",
"diskSizeGB": 30,
"managedDisk": {
"storageAccountType": "Premium_LRS"
},
"osType": "Linux"
}
},
"timeCreated": "20xx-xx-xxTxx:xx:xx.xxxxxx+00:00"
},
"zoneBalance": false
}
}
Menginstal NGINX dengan ekstensi Virtual Machine Scale Sets
Perintah berikut menggunakan ekstensi kumpulan skala mesin virtual untuk menjalankan skrip kustom yang menginstal NGINX dan menyajikan halaman yang menampilkan nama host mesin virtual yang menerima permintaan HTTP Anda.
az vmss extension set --publisher Microsoft.Azure.Extensions --version 2.0 --name CustomScript --resource-group $MY_RESOURCE_GROUP_NAME --vmss-name $MY_VMSS_NAME --settings '{ "fileUris": ["https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx.sh"], "commandToExecute": "./automate_nginx.sh" }' -o JSON
Hasil:
{
"additionalCapabilities": null,
"automaticRepairsPolicy": null,
"constrainedMaximumCapacity": null,
"doNotRunExtensionsOnOverprovisionedVMs": false,
"extendedLocation": null,
"hostGroup": null,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSSxxxxx",
"identity": null,
"location": "eastus",
"name": "myVMSSxxxx",
"orchestrationMode": "Uniform",
"overprovision": true,
"plan": null,
"platformFaultDomainCount": 1,
"priorityMixPolicy": null,
"provisioningState": "Succeeded",
"proximityPlacementGroup": null,
"resourceGroup": "myVMSSResourceGroupxxxxx",
"scaleInPolicy": null,
"singlePlacementGroup": false,
"sku": {
"capacity": 2,
"name": "Standard_DS2_v2",
"tier": "Standard"
},
"spotRestorePolicy": null,
"tags": {},
"timeCreated": "20xx-xx-xxTxx:xx:xx.xxxxxx+00:00",
"type": "Microsoft.Compute/virtualMachineScaleSets",
"uniqueId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"upgradePolicy": {
"automaticOsUpgradePolicy": null,
"mode": "Automatic",
"rollingUpgradePolicy": {
"enableCrossZoneUpgrade": null,
"maxBatchInstancePercent": 20,
"maxSurge": false,
"maxUnhealthyInstancePercent": 20,
"maxUnhealthyUpgradedInstancePercent": 20,
"pauseTimeBetweenBatches": "PT0S",
"prioritizeUnhealthyInstances": null,
"rollbackFailedInstancesOnPolicyBreach": false
}
},
"virtualMachineProfile": {
"applicationProfile": null,
"billingProfile": null,
"capacityReservation": null,
"diagnosticsProfile": null,
"evictionPolicy": null,
"extensionProfile": {
"extensions": [
{
"autoUpgradeMinorVersion": true,
"enableAutomaticUpgrade": null,
"forceUpdateTag": null,
"id": null,
"name": "CustomScript",
"protectedSettings": null,
"protectedSettingsFromKeyVault": null,
"provisionAfterExtensions": null,
"provisioningState": null,
"publisher": "Microsoft.Azure.Extensions",
"settings": {
"commandToExecute": "./automate_nginx.sh",
"fileUris": [
"https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/automate_nginx.sh"
]
},
"suppressFailures": null,
"type": null,
"typeHandlerVersion": "2.0",
"typePropertiesType": "CustomScript"
}
],
"extensionsTimeBudget": null
},
"hardwareProfile": null,
"licenseType": null,
"networkProfile": {
"healthProbe": null,
"networkApiVersion": null,
"networkInterfaceConfigurations": [
{
"deleteOption": null,
"disableTcpStateTracking": false,
"dnsSettings": {
"dnsServers": []
},
"enableAcceleratedNetworking": false,
"enableFpga": null,
"enableIpForwarding": false,
"ipConfigurations": [
{
"applicationGatewayBackendAddressPools": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/Microsoft.Network/applicationGateways/myAPPGWxxxx/backendAddressPools/appGatewayBackendPool",
"resourceGroup": "myVMSSResourceGroupxxxxxx"
}
],
"applicationSecurityGroups": null,
"loadBalancerBackendAddressPools": null,
"loadBalancerInboundNatPools": null,
"name": "myvmsdxxxIPConfig",
"primary": null,
"privateIpAddressVersion": "IPv4",
"publicIpAddressConfiguration": null,
"subnet": {
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/Microsoft.Network/virtualNetworks/myVNetxxxxx/subnets/myVMSNxxxxx",
"resourceGroup": "myVMSSResourceGroupaxxxxx"
}
}
],
"name": "myvmsxxxxxx",
"networkSecurityGroup": null,
"primary": true
}
]
},
"osProfile": {
"adminPassword": null,
"adminUsername": "azureuser",
"allowExtensionOperations": true,
"computerNamePrefix": "myvmsdxxx",
"customData": null,
"linuxConfiguration": {
"disablePasswordAuthentication": true,
"enableVmAgentPlatformUpdates": false,
"patchSettings": null,
"provisionVmAgent": true,
"ssh": {
"publicKeys": [
{
"keyData": "ssh-rsa xxxxxxxx",
"path": "/home/azureuser/.ssh/authorized_keys"
}
]
}
},
"requireGuestProvisionSignal": true,
"secrets": [],
"windowsConfiguration": null
},
"priority": null,
"scheduledEventsProfile": null,
"securityPostureReference": null,
"securityProfile": null,
"serviceArtifactReference": null,
"storageProfile": {
"dataDisks": null,
"diskControllerType": "SCSI",
"imageReference": {
"communityGalleryImageId": null,
"exactVersion": null,
"id": null,
"offer": "0001-com-ubuntu-server-jammy",
"publisher": "Canonical",
"sharedGalleryImageId": null,
"sku": "22_04-lts-gen2",
"version": "latest"
},
"osDisk": {
"caching": "ReadWrite",
"createOption": "FromImage",
"deleteOption": null,
"diffDiskSettings": null,
"diskSizeGb": 30,
"image": null,
"managedDisk": {
"diskEncryptionSet": null,
"securityProfile": null,
"storageAccountType": "Premium_LRS"
},
"name": null,
"osType": "Linux",
"vhdContainers": null,
"writeAcceleratorEnabled": null
}
},
"userData": null
},
"zoneBalance": false,
"zones": [
"1",
"2",
"3"
]
}
Tentukan profil penskalaan otomatis
Untuk mengaktifkan skala otomatis pada set skala, pertama-tama tentukan profil skala otomatis. Profil ini menentukan kapasitas default, minimum, dan maksimum untuk kumpulan skala. Batas ini memungkinkan Anda mengontrol biaya agar tidak terus-menerus membuat instans VM serta menyeimbangkan kinerja yang dapat diterima dengan jumlah minimum instans yang tetap berjalan selama peristiwa scale-in. Contoh berikut menetapkan kapasitas default, kapasitas minimum dua instans VM, dan kapasitas maksimum 10:
az monitor autoscale create --resource-group $MY_RESOURCE_GROUP_NAME --resource $MY_VMSS_NAME --resource-type Microsoft.Compute/virtualMachineScaleSets --name autoscale --min-count 2 --max-count 10 --count 2
Hasil:
{
"enabled": true,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxx/providers/microsoft.insights/autoscalesettings/autoscale",
"location": "eastus",
"name": "autoscale",
"namePropertiesName": "autoscale",
"notifications": [
{
"email": {
"customEmails": [],
"sendToSubscriptionAdministrator": false,
"sendToSubscriptionCoAdministrators": false
},
"webhooks": []
}
],
"predictiveAutoscalePolicy": {
"scaleLookAheadTime": null,
"scaleMode": "Disabled"
},
"profiles": [
{
"capacity": {
"default": "2",
"maximum": "10",
"minimum": "2"
},
"fixedDate": null,
"name": "default",
"recurrence": null,
"rules": []
}
],
"resourceGroup": "myVMSSResourceGroupxxxxx",
"systemData": null,
"tags": {},
"targetResourceLocation": null,
"targetResourceUri": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSSxxxxxx",
"type": "Microsoft.Insights/autoscaleSettings"
}
Buat aturan untuk penskalaan keluar otomatis
Perintah berikut membuat aturan yang meningkatkan jumlah instans VM dalam set skala ketika beban CPU rata-rata lebih besar dari 70% selama periode 5 menit. Saat aturan dipicu, jumlah instans VM bertambah tiga.
az monitor autoscale rule create --resource-group $MY_RESOURCE_GROUP_NAME --autoscale-name autoscale --condition "Percentage CPU > 70 avg 5m" --scale out 3
Hasil:
{
"metricTrigger": {
"dimensions": [],
"dividePerInstance": null,
"metricName": "Percentage CPU",
"metricNamespace": null,
"metricResourceLocation": null,
"metricResourceUri": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSSxxxxxx",
"operator": "GreaterThan",
"statistic": "Average",
"threshold": "70",
"timeAggregation": "Average",
"timeGrain": "PT1M",
"timeWindow": "PT5M"
},
"scaleAction": {
"cooldown": "PT5M",
"direction": "Increase",
"type": "ChangeCount",
"value": "3"
}
}
Buat aturan untuk penskalaan otomatis di
Buat aturan lain dengan az monitor autoscale rule create yang mengurangi jumlah instans VM dalam set skala ketika beban CPU rata-rata kemudian turun di bawah 30% selama periode 5 menit. Contoh berikut mendefinisikan aturan untuk mengurangi jumlah instans VM sebanyak satu.
az monitor autoscale rule create --resource-group $MY_RESOURCE_GROUP_NAME --autoscale-name autoscale --condition "Percentage CPU < 30 avg 5m" --scale in 1
Hasil:
{
"metricTrigger": {
"dimensions": [],
"dividePerInstance": null,
"metricName": "Percentage CPU",
"metricNamespace": null,
"metricResourceLocation": null,
"metricResourceUri": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myVMSSResourceGroupxxxxxx/providers/Microsoft.Compute/virtualMachineScaleSets/myVMSSxxxxxx",
"operator": "LessThan",
"statistic": "Average",
"threshold": "30",
"timeAggregation": "Average",
"timeGrain": "PT1M",
"timeWindow": "PT5M"
},
"scaleAction": {
"cooldown": "PT5M",
"direction": "Decrease",
"type": "ChangeCount",
"value": "1"
}
}
Menguji halaman
Perintah berikut menunjukkan IP publik Application Gateway Anda. Tempelkan alamat IP ke halaman browser untuk pengujian.
az network public-ip show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_APPGW_PUBLIC_IP_NAME --query [ipAddress] --output tsv
Jika halaman tidak dimuat, validasi item berikut sebelum melanjutkan:
- Pendengar frontend Application Gateway dan pengaturan HTTP backend keduanya diatur ke port 80.
- Status provisi ekstensi kumpulan skala VM adalah
Succeeded.
az vmss extension list \
--resource-group $MY_RESOURCE_GROUP_NAME \
--vmss-name $MY_VMSS_NAME \
--query "[].[name,provisioningState]" \
--output table
- NSG apa pun yang terkait dengan subnet VM memungkinkan lalu lintas HTTP dari subnet Application Gateway.
Membersihkan sumber daya (opsional)
Untuk menghindari biaya Azure, Anda harus membersihkan sumber daya yang tidak diperlukan. Saat Anda tidak lagi memerlukan set skala dan sumber daya lainnya, hapus grup sumber daya dan semua sumber dayanya dengan az group delete. Parameter --no-wait mengembalikan kontrol ke permintaan tanpa menunggu operasi selesai. Parameter --yes mengonfirmasi bahwa Anda ingin menghapus sumber daya tanpa permintaan lain untuk melakukannya. Tutorial ini akan membersihkan sumber daya untuk Anda.