使用 PowerShell 在 Azure 虛擬網路中部署 IPv6 雙重堆疊應用程式

本文說明如何在 Azure 中使用標準 Load Balancer 部署雙堆棧 (IPv4 + IPv6) 應用程式,其中包含雙堆棧虛擬網路和子網、具有雙重 (IPv4 + IPv6) 前端設定的標準 Load Balancer、具有具有雙重 IP 組態、網路安全組和公用 IP 的 NIC 的 VM。

Azure Cloud Shell

Azure Cloud Shell 是裝載於 Azure 中的互動式殼層環境,可在瀏覽器中使用。 您可以使用 Bash 或 PowerShell 搭配 Cloud Shell,與 Azure 服務共同使用。 您可以使用 Cloud Shell 預先安裝的命令,執行本文提到的程式碼,而不必在本機環境上安裝任何工具。

要啟動 Azure Cloud Shell:

選項 範例/連結
選取程式碼或命令區塊右上角的 [試試看]。 選取 [試試看] 並不會自動將程式碼或命令複製到 Cloud Shell 中。 Screenshot that shows an example of Try It for Azure Cloud Shell.
請前往 https://shell.azure.com,或選取 [啟動 Cloud Shell] 按鈕,在瀏覽器中開啟 Cloud Shell。 Button to launch Azure Cloud Shell.
選取 Azure 入口網站右上方功能表列上的 [Cloud Shell] 按鈕。 Screenshot that shows the Cloud Shell button in the Azure portal

若要使用 Azure Cloud Shell:

  1. 啟動 Cloud Shell。

  2. 選取程式碼區塊 (或命令區塊) 上的 [複製] 按鈕以複製程式碼或命令。

  3. 透過在 Windows 和 Linux 上選取 Ctrl+Shift+V;或在 macOS 上選取 Cmd+Shift+V,將程式碼或命令貼到 Cloud Shell 工作階段中。

  4. 選取 Enter 鍵執行程式碼或命令。

如果您選擇在本機安裝和使用 PowerShell,本文會要求使用 Azure PowerShell 模組 6.9.0 版或更新版本。 執行 Get-Module -ListAvailable Az 以尋找安裝的版本。 如果您需要升級,請參閱安裝 Azure PowerShell 模組。 如果正在本機執行 PowerShell,也需要執行 Connect-AzAccount,以建立與 Azure 的連線。

建立資源群組

您必須使用 New-AzResourceGroup 建立資源群組,才能建立雙重堆疊虛擬網路。 下列範例會在我們東部位置建立名為 myRGDualStack 的資源群組:

   $rg = New-AzResourceGroup `
  -ResourceGroupName "dsRG1"  `
  -Location "east us"

建立 IPv4 和 IPv6 公用 IP 位址

若要從因特網存取虛擬機,您需要負載平衡器的 IPv4 和 IPv6 公用 IP 位址。 使用 New-AzPublicIpAddress 建立公用 IP 位址。 下列範例會在 dsRG1 資源群組中建立名為 dsPublicIP_v4 和 dsPublicIP_v6IPv4 和 IPv6 公用 IP 位址:

$PublicIP_v4 = New-AzPublicIpAddress `
  -Name "dsPublicIP_v4" `
  -ResourceGroupName $rg.ResourceGroupName `
  -Location $rg.Location  `
  -AllocationMethod Static `
  -IpAddressVersion IPv4 `
  -Sku Standard
  
$PublicIP_v6 = New-AzPublicIpAddress `
  -Name "dsPublicIP_v6" `
  -ResourceGroupName $rg.ResourceGroupName `
  -Location $rg.Location  `
  -AllocationMethod Static `
  -IpAddressVersion IPv6 `
  -Sku Standard

若要使用 RDP 連線存取虛擬機,請使用 New-AzPublicIpAddress 為虛擬機建立 IPV4 公用 IP 位址。

  $RdpPublicIP_1 = New-AzPublicIpAddress `
  -Name "RdpPublicIP_1" `
  -ResourceGroupName $rg.ResourceGroupName `
  -Location $rg.Location  `
  -AllocationMethod Static `
  -Sku Standard `
  -IpAddressVersion IPv4
  
  $RdpPublicIP_2 = New-AzPublicIpAddress `
   -Name "RdpPublicIP_2" `
   -ResourceGroupName $rg.ResourceGroupName `
   -Location $rg.Location  `
   -AllocationMethod Static `
   -Sku Standard `
   -IpAddressVersion IPv4

建立標準負載平衡器

在本節中,您會設定負載平衡器的雙重前端 IP (IPv4 和 IPv6) 和後端位址集區,然後建立 Standard Load Balancer。

建立前端 IP

使用 New-AzLoadBalancerFrontendIpConfig 建立前端 IP。 下列範例會建立名為 dsLbFrontEnd_v4dsLbFrontEnd_v6 的 IPv4 和 IPv6 前端 IP 設定:

$frontendIPv4 = New-AzLoadBalancerFrontendIpConfig `
  -Name "dsLbFrontEnd_v4" `
  -PublicIpAddress $PublicIP_v4

$frontendIPv6 = New-AzLoadBalancerFrontendIpConfig `
  -Name "dsLbFrontEnd_v6" `
  -PublicIpAddress $PublicIP_v6

設定後端位址集區

使用 New-AzLoadBalancerBackendAddressPoolConfig 建立後端位址集區。 在其餘步驟中,VM 會連結至此後端集區。 下列範例會建立名為 dsLbBackEndPool_v4dsLbBackEndPool_v6 的後端位址集區,以包含具有 IPv4 和 IPv6 NIC 設定的 VM:

$backendPoolv4 = New-AzLoadBalancerBackendAddressPoolConfig `
-Name "dsLbBackEndPool_v4"

$backendPoolv6 = New-AzLoadBalancerBackendAddressPoolConfig `
-Name "dsLbBackEndPool_v6"

建立健康狀態探查

使用 Add-AzLoadBalancerProbeConfig 建立健康情況探查,以監視 VM 的健康情況。

$probe = New-AzLoadBalancerProbeConfig -Name MyProbe -Protocol tcp -Port 3389 -IntervalInSeconds 15 -ProbeCount 2

建立負載平衡器規則

負載平衡器規則會用來定義如何將流量分散至 VM。 您要定義連入流量的前端 IP 設定和接收流量的後端 IP 集區,以及所需的來源和目的地連接埠。 為了確保只有良好 VM 收到流量,您可以選擇定義健全狀態探查。 基本負載平衡器使用 IPv4 探查來評估 VM 上 IPv4 和 IPv6 端點的健康情況。 標準負載平衡器支援明確的 IPv6 健全狀態探查。

使用 Add-AzLoadBalancerRuleConfig 建立負載平衡器規則。 下列範例會建立名為 dsLBrule_v4dsLBrule_v6 的負載平衡器規則,並將 TCP 連接埠 80 上的流量均分至 IPv4 和 IPv6 前端 IP 設定:

$lbrule_v4 = New-AzLoadBalancerRuleConfig `
  -Name "dsLBrule_v4" `
  -FrontendIpConfiguration $frontendIPv4 `
  -BackendAddressPool $backendPoolv4 `
  -Protocol Tcp `
  -FrontendPort 80 `
  -BackendPort 80 `
   -probe $probe

$lbrule_v6 = New-AzLoadBalancerRuleConfig `
  -Name "dsLBrule_v6" `
  -FrontendIpConfiguration $frontendIPv6 `
  -BackendAddressPool $backendPoolv6 `
  -Protocol Tcp `
  -FrontendPort 80 `
  -BackendPort 80 `
   -probe $probe

建立負載平衡器

使用 New-AzLoadBalancer 建立 Standard Load Balancer。 下列範例會使用您在上述步驟中建立的 IPv4 和 IPv6 前端 IP 組態、後端集區和負載平衡規則,建立名為 myLoadBalancer 的公用 Standard Load Balancer:

$lb = New-AzLoadBalancer `
-ResourceGroupName $rg.ResourceGroupName `
-Location $rg.Location  `
-Name "MyLoadBalancer" `
-Sku "Standard" `
-FrontendIpConfiguration $frontendIPv4,$frontendIPv6 `
-BackendAddressPool $backendPoolv4,$backendPoolv6 `
-LoadBalancingRule $lbrule_v4,$lbrule_v6 `
-Probe $probe

建立網路資源

部署一些 VM 並可以測試您的平衡器之前,您必須先建立支援的網路資源 - 可用性設定組、網路安全組、虛擬網路和虛擬 NIC。

建立可用性設定組

若要改善您應用程式的高可用性,請將 VM 放在可用性設定組中。

使用 New-AzAvailabilitySet 建立可用性設定組。 下列範例會建立名為 myAvailabilitySet 的可用性設定組:

$avset = New-AzAvailabilitySet `
  -ResourceGroupName $rg.ResourceGroupName `
  -Location $rg.Location  `
  -Name "dsAVset" `
  -PlatformFaultDomainCount 2 `
  -PlatformUpdateDomainCount 2 `
  -Sku aligned

建立網路安全性群組

為 VNET 中的輸入和輸出通訊控管規則建立網路安全組。

建立連接埠 3389 的網路安全性群組規則

使用 New-AzNetworkSecurityRuleConfig 建立網路安全性群組規則,以允許透過連接埠 3389 的 RDP 連線。

$rule1 = New-AzNetworkSecurityRuleConfig `
-Name 'myNetworkSecurityGroupRuleRDP' `
-Description 'Allow RDP' `
-Access Allow `
-Protocol Tcp `
-Direction Inbound `
-Priority 100 `
-SourceAddressPrefix * `
-SourcePortRange * `
-DestinationAddressPrefix * `
-DestinationPortRange 3389

建立連接埠 80 的網路安全性群組規則

使用 New-AzNetworkSecurityRuleConfig 建立網路安全性群組規則,以允許通過連接埠 80 的網際網路連線。

$rule2 = New-AzNetworkSecurityRuleConfig `
  -Name 'myNetworkSecurityGroupRuleHTTP' `
  -Description 'Allow HTTP' `
  -Access Allow `
  -Protocol Tcp `
  -Direction Inbound `
  -Priority 200 `
  -SourceAddressPrefix * `
  -SourcePortRange * `
  -DestinationAddressPrefix * `
  -DestinationPortRange 80

建立網路安全性群組

使用 New-AzNetworkSecurityGroup 建立網路安全性群組。

$nsg = New-AzNetworkSecurityGroup `
-ResourceGroupName $rg.ResourceGroupName `
-Location $rg.Location  `
-Name "dsNSG1"  `
-SecurityRules $rule1,$rule2

建立虛擬網路

使用 New-AzVirtualNetwork 建立虛擬網路。 下列範例會使用 mySubnet 建立名為 dsVnet虛擬網路:

# Create dual stack subnet
$subnet = New-AzVirtualNetworkSubnetConfig `
-Name "dsSubnet" `
-AddressPrefix "10.0.0.0/24","fd00:db8:deca:deed::/64"

# Create the virtual network
$vnet = New-AzVirtualNetwork `
  -ResourceGroupName $rg.ResourceGroupName `
  -Location $rg.Location  `
  -Name "dsVnet" `
  -AddressPrefix "10.0.0.0/16","fd00:db8:deca::/48"  `
  -Subnet $subnet

建立 NIC

使用 New-AzNetworkInterface 建立虛擬 NIC。 下列範例建立兩個虛擬 NIC,而兩者都有 IPv4 和 IPv6 設定。 (您在下列步驟中針對應用程式建立的每部 VM 都有一個虛擬 NIC)。

  $Ip4Config=New-AzNetworkInterfaceIpConfig `
    -Name dsIp4Config `
    -Subnet $vnet.subnets[0] `
    -PrivateIpAddressVersion IPv4 `
    -LoadBalancerBackendAddressPool $backendPoolv4 `
    -PublicIpAddress  $RdpPublicIP_1
      
  $Ip6Config=New-AzNetworkInterfaceIpConfig `
    -Name dsIp6Config `
    -Subnet $vnet.subnets[0] `
    -PrivateIpAddressVersion IPv6 `
    -LoadBalancerBackendAddressPool $backendPoolv6
    
  $NIC_1 = New-AzNetworkInterface `
    -Name "dsNIC1" `
    -ResourceGroupName $rg.ResourceGroupName `
    -Location $rg.Location  `
    -NetworkSecurityGroupId $nsg.Id `
    -IpConfiguration $Ip4Config,$Ip6Config 
    
  $Ip4Config=New-AzNetworkInterfaceIpConfig `
    -Name dsIp4Config `
    -Subnet $vnet.subnets[0] `
    -PrivateIpAddressVersion IPv4 `
    -LoadBalancerBackendAddressPool $backendPoolv4 `
    -PublicIpAddress  $RdpPublicIP_2  

  $NIC_2 = New-AzNetworkInterface `
    -Name "dsNIC2" `
    -ResourceGroupName $rg.ResourceGroupName `
    -Location $rg.Location  `
    -NetworkSecurityGroupId $nsg.Id `
    -IpConfiguration $Ip4Config,$Ip6Config 

建立虛擬機器

使用 Get-credential 來設定 VM 的系統管理員使用者名稱和密碼:

$cred = get-credential -Message "DUAL STACK VNET SAMPLE:  Please enter the Administrator credential to log into the VMs."

現在您可以使用 New-AzVM 建立 VM。 下列範例會在 VM 不存在時建立兩個 VM 和所需的虛擬網路元件。

$vmsize = "Standard_A2"
$ImagePublisher = "MicrosoftWindowsServer"
$imageOffer = "WindowsServer"
$imageSKU = "2019-Datacenter"

$vmName= "dsVM1"
$VMconfig1 = New-AzVMConfig -VMName $vmName -VMSize $vmsize -AvailabilitySetId $avset.Id 3> $null | Set-AzVMOperatingSystem -Windows -ComputerName $vmName -Credential $cred -ProvisionVMAgent 3> $null | Set-AzVMSourceImage -PublisherName $ImagePublisher -Offer $imageOffer -Skus $imageSKU -Version "latest" 3> $null | Set-AzVMOSDisk -Name "$vmName.vhd" -CreateOption fromImage  3> $null | Add-AzVMNetworkInterface -Id $NIC_1.Id  3> $null 
$VM1 = New-AzVM -ResourceGroupName $rg.ResourceGroupName  -Location $rg.Location  -VM $VMconfig1 

$vmName= "dsVM2"
$VMconfig2 = New-AzVMConfig -VMName $vmName -VMSize $vmsize -AvailabilitySetId $avset.Id 3> $null | Set-AzVMOperatingSystem -Windows -ComputerName $vmName -Credential $cred -ProvisionVMAgent 3> $null | Set-AzVMSourceImage -PublisherName $ImagePublisher -Offer $imageOffer -Skus $imageSKU -Version "latest" 3> $null | Set-AzVMOSDisk -Name "$vmName.vhd" -CreateOption fromImage  3> $null | Add-AzVMNetworkInterface -Id $NIC_2.Id  3> $null 
$VM2 = New-AzVM -ResourceGroupName $rg.ResourceGroupName  -Location $rg.Location  -VM $VMconfig2

判斷 IPv4 和 IPv6 端點的 IP 位址

取得資源群組中的所有網路介面物件,以摘要說明此部署 get-AzNetworkInterface中使用的IP。 此外,使用 get-AzpublicIpAddress取得 IPv4 和 IPv6 端點的負載平衡器前端位址。

$rgName= "dsRG1"
$NICsInRG= get-AzNetworkInterface -resourceGroupName $rgName 
write-host `nSummary of IPs in this Deployment: 
write-host ******************************************
foreach ($NIC in $NICsInRG) {
 
    $VMid= $NIC.virtualmachine.id 
    $VMnamebits= $VMid.split("/") 
    $VMname= $VMnamebits[($VMnamebits.count-1)] 
    write-host `nPrivate IP addresses for $VMname 
    $IPconfigsInNIC= $NIC.IPconfigurations 
    foreach ($IPconfig in $IPconfigsInNIC) {
 
        $IPaddress= $IPconfig.privateipaddress 
        write-host "    "$IPaddress 
        IF ($IPconfig.PublicIpAddress.ID) {
 
            $IDbits= ($IPconfig.PublicIpAddress.ID).split("/")
            $PipName= $IDbits[($IDbits.count-1)]
            $PipObject= get-azPublicIpAddress -name $PipName -resourceGroup $rgName
            write-host "    "RDP address:  $PipObject.IpAddress
                 }
         }
 }
 
 
 
  write-host `nPublic IP addresses on Load Balancer:
 
  (get-AzpublicIpAddress -resourcegroupname $rgName | where { $_.name -notlike "RdpPublicIP*" }).IpAddress

下圖顯示範例輸出,其中列出兩部 VM 的私人 IPv4 和 IPv6 位址,以及 Load Balancer 的前端 IPv4 和 IPv6 IP 位址。

IP summary of dual stack (IPv4/IPv6) application deployment in Azure

在 Azure 入口網站中檢視 IPv6 雙重堆疊虛擬網路

您可以依循下列步驟,在 Azure 入口網站中檢視 IPv6 雙重堆疊虛擬網路:

  1. 在入口網站的搜尋列中,輸入 dsVnet
  2. 當搜尋結果中出現 dsVnet 時加以選取。 這會啟動名為 dsVnet 的雙重堆疊虛擬網路的 [概觀] 頁面。 雙重堆疊虛擬網路顯示兩個 NIC,而其 IPv4 和 IPv6 設定都位於名為 dsSubnet 的雙重堆疊子網路中。

IPv6 dual stack virtual network in Azure

清除資源

當不再需要時,您可以使用 Remove-AzResourceGroup 命令來移除資源群組、VM 及所有相關資源。

Remove-AzResourceGroup -Name dsRG1

下一步

在本文中,您已建立具有雙重前端 IP 設定 (IPv4 和 IPv6) 的 Standard Load Balancer。 您也建立了兩個包含 NIC 的虛擬機器,而 NIC 具有已新增至負載平衡器後端集區的雙重 IP 設定 (IPv4 + IPv6)。 若要深入瞭解 Azure 虛擬網路中的 IPv6 支援,請參閱什麼是 Azure 虛擬網路的 IPv6?