越来越多的网站开始支持 IPv6,即使是哪些只提供 api 服务的站点也需要支持 IPv6,比如苹果应用商店中的 app 早就强制要求服务器端支持 IPv6 了。
笔者在前文《Azure Load Balancer : 简介》中介绍了通过 Azure 门户站点创建基础的 Azure Load Balancer 配置,本文将接着介绍如何创建支持 IPv6 的 Azure Load Balancer。

关于 IPv6 的一些限制

让我们先来了解一下 Azure Load Balancer 在 IPv6 支持方面的一些限制(完整的限制列表请参考这里):

  • 无法在 Azure 门户中添加 IPv6 负载均衡规则。 只能通过模板、CLI 或 PowerShell 创建规则。
  • 无法将现有 VM 升级为使用 IPv6 地址。 为此必须部署新 VM。
  • 无法将公共 IPv6 地址分配给 VM, 只能分配给负载均衡器。

这三条限制看起来让人很沮丧!其中第一条意味着我们没办法通过 UI 简单的创建支持 IPv6 的 Load Balancer;第二条则让老机器失去了升级的机会;第三条则把 IPv6 的支持完全绑死到了 Load Balancer 上!

换个角度看问题也许能让人心情愉快些:
不支持 UI 操作就是逼着我们写脚本,刚好可以朝着基础架构即代码的方向前进!
不支持现有虚机的升级,可以抛掉历史的包袱轻装上阵!
不支持将公共 IPv6 地址分配给 VM,那就只用在 Load Balancer 上维护 IPv6 的配置!

使用 PowerShell 脚本创建 Load Balancer

既然无法通过 Azure 门户站点上的 UI 创建支持 IPv6 的 Load Balancer,笔者就选择通过 PowerShell 脚本完成这个任务, 我们来创建一个具有两台后端虚机的 Load Balancer,下面是脚本中的主要逻辑。

定义脚本中所需的变量
为了能更好的重用该脚本,笔者把所需的变量都定义到了脚本的开头处,虽然变量的数目很多,但是只要修改 prodNamePrefix、userName、sshPublicKey 和 location 等几个关键变量的值脚本就可以工作了:

  1. # 资源名称的前缀
  2. $prodNamePrefix = "Nick"
  3. $lowerProdNamePrefix = $prodNamePrefix.ToLower()
  4.  
  5. # vm user name
  6. $userName = "nick"
  7. # vm user public key
  8. $sshPublicKey = "xxxxxxxxxx"
  9.  
  10. # resource loacation
  11. $location = "japaneast"
  12. # resource group name
  13. $rgName = $prodNamePrefix + "LBGroup"
  14. ...

创建 Resource Group、虚拟网络及其虚拟子网

  1. # 创建 Resource Group
  2. New-AzureRmResourceGroup -Name $rgName -location $location
  3.  
  4. # 虚拟网络及其虚拟子网
  5. $backendSubnet = New-AzureRmVirtualNetworkSubnetConfig `
  6. -Name $subnetName `
  7. -AddressPrefix $subnetPrefix
  8. $vnet = New-AzureRmvirtualNetwork -Name $vnetName `
  9. -ResourceGroupName $rgName `
  10. -Location $location `
  11. -AddressPrefix $vnetPrefix `
  12. -Subnet $backendSubnet

创建 Load Balancer

  1. # 创建 Load Balancer 的公共 IP
  2. $publicIPv4 = New-AzureRmPublicIpAddress `
  3. -Name $publicIpv4Name `
  4. -ResourceGroupName $rgName `
  5. -Location $location `
  6. -AllocationMethod Static `
  7. -IpAddressVersion IPv4 `
  8. -DomainNameLabel $dnsLabelv4
  9. $publicIPv6 = New-AzureRmPublicIpAddress `
  10. -Name $publicIpv6Name `
  11. -ResourceGroupName $rgName `
  12. -Location $location `
  13. -AllocationMethod Dynamic `
  14. -IpAddressVersion IPv6 `
  15. -DomainNameLabel $dnsLabelv6
  16.  
  17. # 创建 Load Balancer 的 Frontend IP
  18. $FEIPConfigv4 = New-AzureRmLoadBalancerFrontendIpConfig `
  19. -Name $frontendV4Name `
  20. -PublicIpAddress $publicIPv4
  21. $FEIPConfigv6 = New-AzureRmLoadBalancerFrontendIpConfig `
  22. -Name $frontendV6Name `
  23. -PublicIpAddress $publicIPv6
  24.  
  25. # 创建 Load Balancer 的 Backend pools
  26. $backendpoolipv4 = New-AzureRmLoadBalancerBackendAddressPoolConfig `
  27. -Name $backendAddressPoolV4Name
  28. $backendpoolipv6 = New-AzureRmLoadBalancerBackendAddressPoolConfig `
  29. -Name $backendAddressPoolV6Name
  30.  
  31. # 创建 Load Balancer 的 Inbound NAT rules
  32. $inboundNATRule1v4 = New-AzureRmLoadBalancerInboundNatRuleConfig `
  33. -Name $natRule1V4Name `
  34. -FrontendIpConfiguration $FEIPConfigv4 `
  35. -Protocol TCP `
  36. -FrontendPort 10022 `
  37. -BackendPort 22
  38. $inboundNATRule2v4 = New-AzureRmLoadBalancerInboundNatRuleConfig `
  39. -Name $natRule2V4Name `
  40. -FrontendIpConfiguration $FEIPConfigv4 `
  41. -Protocol TCP `
  42. -FrontendPort 20022 `
  43. -BackendPort 22
  44.  
  45. # 创建 Load Balancer 的 Health probes
  46. $healthProbe = New-AzureRmLoadBalancerProbeConfig -Name $probeV4V6Name `
  47. -Protocol Tcp `
  48. -Port 22 `
  49. -IntervalInSeconds 15 `
  50. -ProbeCount 2
  51.  
  52. # 创建 Load Balancer 的 Load balancing rules
  53. $lbrule1v4http = New-AzureRmLoadBalancerRuleConfig `
  54. -Name $lbRule1V4HTTPName `
  55. -FrontendIpConfiguration $FEIPConfigv4 `
  56. -BackendAddressPool $backendpoolipv4 `
  57. -Probe $healthProbe `
  58. -Protocol Tcp `
  59. -FrontendPort 80 `
  60. -BackendPort 80
  61. $lbrule1v6http = New-AzureRmLoadBalancerRuleConfig `
  62. -Name $lbRule1V6HTTPName `
  63. -FrontendIpConfiguration $FEIPConfigv6 `
  64. -BackendAddressPool $backendpoolipv6 `
  65. -Probe $healthProbe `
  66. -Protocol Tcp `
  67. -FrontendPort 80 `
  68. -BackendPort 80
  69. $lbrule1v4https = New-AzureRmLoadBalancerRuleConfig `
  70. -Name $lbRule1V4HTTPSName `
  71. -FrontendIpConfiguration $FEIPConfigv4 `
  72. -BackendAddressPool $backendpoolipv4 `
  73. -Probe $healthProbe `
  74. -Protocol Tcp `
  75. -FrontendPort 443 `
  76. -BackendPort 443
  77. $lbrule1v6https = New-AzureRmLoadBalancerRuleConfig `
  78. -Name $lbRule1V6HTTPSName `
  79. -FrontendIpConfiguration $FEIPConfigv6 `
  80. -BackendAddressPool $backendpoolipv6 `
  81. -Probe $healthProbe `
  82. -Protocol Tcp `
  83. -FrontendPort 443 `
  84. -BackendPort 443
  85.  
  86. # 创建 Load Balancer
  87. $loadbalancer = New-AzureRmLoadBalancer `
  88. -ResourceGroupName $rgName `
  89. -Name $lbName `
  90. -Location $location `
  91. -FrontendIpConfiguration $FEIPConfigv4,$FEIPConfigv6 `
  92. -InboundNatRule $inboundNATRule2v4,$inboundNATRule1v4 `
  93. -BackendAddressPool $backendpoolipv4,$backendpoolipv6 `
  94. -Probe $healthProbe `
  95. -LoadBalancingRule $lbrule1v4http,$lbrule1v6http,`
  96. $lbrule1v4https,$lbrule1v6https

创建两个虚拟网卡

  1. # 重新获得虚拟网络及其虚拟子网的实例,
  2. # 否则创建网卡时会提示没有指定虚拟子网
  3. $vnet = Get-AzureRmVirtualNetwork -Name $vnetName `
  4. -ResourceGroupName $rgName
  5. $backendSubnet = Get-AzureRmVirtualNetworkSubnetConfig `
  6. -Name $subnetName `
  7. -VirtualNetwork $vnet
  8.  
  9. $nic1IPv4 = New-AzureRmNetworkInterfaceIpConfig `
  10. -Name "IPv4IPConfig" `
  11. -PrivateIpAddressVersion "IPv4" `
  12. -Subnet $backendSubnet `
  13. -LoadBalancerBackendAddressPool $backendpoolipv4 `
  14. -LoadBalancerInboundNatRule $inboundNATRule1v4
  15. $nic1IPv6 = New-AzureRmNetworkInterfaceIpConfig `
  16. -Name "IPv6IPConfig" `
  17. -PrivateIpAddressVersion "IPv6" `
  18. -LoadBalancerBackendAddressPool $backendpoolipv6
  19. $nic1 = New-AzureRmNetworkInterface `
  20. -Name $nic1Name `
  21. -IpConfiguration $nic1IPv4,$nic1IPv6 `
  22. -ResourceGroupName $rgName `
  23. -Location $location
  24.  
  25. $nic2IPv4 = New-AzureRmNetworkInterfaceIpConfig `
  26. -Name "IPv4IPConfig" `
  27. -PrivateIpAddressVersion "IPv4" `
  28. -Subnet $backendSubnet `
  29. -LoadBalancerBackendAddressPool $backendpoolipv4 `
  30. -LoadBalancerInboundNatRule $inboundNATRule2v4
  31. $nic2IPv6 = New-AzureRmNetworkInterfaceIpConfig `
  32. -Name "IPv6IPConfig" `
  33. -PrivateIpAddressVersion "IPv6" `
  34. -LoadBalancerBackendAddressPool $backendpoolipv6
  35. $nic2 = New-AzureRmNetworkInterface `
  36. -Name $nic2Name `
  37. -IpConfiguration $nic2IPv4,$nic2IPv6 `
  38. -ResourceGroupName $rgName `
  39. -Location $location

创建虚拟机并分配新建的 NIC

  1. # 创建 Availability Set
  2. New-AzureRmAvailabilitySet -Name $availabilitySetName `
  3. -Sku Aligned `
  4. -PlatformFaultDomainCount 2 `
  5. -PlatformUpdateDomainCount 5 `
  6. -ResourceGroupName $rgName `
  7. -location $location
  8. $availabilitySet = Get-AzureRmAvailabilitySet `
  9. -Name $availabilitySetName `
  10. -ResourceGroupName $rgName
  11.  
  12. # 创建用户 Credential
  13. $securePassword = ConvertTo-SecureString $userPassword `
  14. -AsPlainText -Force
  15. $userCred = New-Object System.Management.Automation.PSCredential `
  16. ($userName, $securePassword)
  17.  
  18. # 创建第一台虚机,可以以同样的方式创建第二台虚机
  19. $vm1 = New-AzureRmVMConfig -VMName $vm1Name `
  20. -VMSize $vmSize `
  21. -AvailabilitySetId $availabilitySet.Id
  22. $vm1 = Set-AzureRmVMOperatingSystem `
  23. -VM $vm1 `
  24. -Linux `
  25. -ComputerName $vm1ComputerHostName `
  26. -Credential $userCred `
  27. -DisablePasswordAuthentication
  28. $vm1 = Set-AzureRmVMSourceImage `
  29. -VM $vm1 `
  30. -PublisherName Canonical `
  31. -Offer UbuntuServer `
  32. -Skus $vmVersion `
  33. -Version "latest"
  34. $vm1 = Set-AzureRmVMBootDiagnostics `
  35. -VM $vm1 `
  36. -Disable
  37. $vm1 = Add-AzureRmVMNetworkInterface `
  38. -VM $vm1 `
  39. -Id $nic1.Id `
  40. -Primary
  41. $vm1 = Set-AzureRmVMOSDisk `
  42. -VM $vm1 `
  43. -Name $vm1DiskName `
  44. -CreateOption FromImage `
  45. -StorageAccountType $storageAccountTypeName
  46. Add-AzureRmVMSshPublicKey `
  47. -VM $vm1 `
  48. -KeyData $sshPublicKey `
  49. -Path "/home/$userName/.ssh/authorized_keys"
  50. New-AzureRmVM -ResourceGroupName $rgName `
  51. -Location $location `
  52. -VM $vm1

到这里我们的 Load Balancer 已经创建完成了,完整的脚本代码请参考这里

在 Azure 门户上的 Cloud Shell 中执行脚本

假设你已经编辑好了自己的 Load Balancer 创建脚本,并命名为 azureloadbalancer.sp1。让我们先把脚本上传到 Azure 门户上的 Cloud Shell 中,然后在 Cloud Shell 中执行该脚本:

脚本执行完成后,一个支持 IPv6 的 Load Balancer 就部署成功了:

总结

虽然写脚本比 UI 操作的难度要高一些,但是一旦这些脚本写好了今后就可以通过重用这些脚本来提升自动化的程度,绝对是物有所值!在后续的文章中,笔者将介绍如何使用 PowerShell 脚本扩展支持 IPv6 的 Load Balancer 后端的虚机池。

参考:
用 PowerShell 创建支持 IPv6 的 Azure Load Balancer
Powershell load balancer
Azure Load Balancer 对 IPv6 的支持

Azure Load Balancer : 支持 IPv6的更多相关文章

  1. Azure Load Balancer : 动态扩展

    笔者在前文<Azure Load Balancer : 支持 IPv6>中介绍了如何通过 PowerShell 脚本创建支持 IPv6 的 Load Balancer.本文我们接着介绍如何 ...

  2. Azure Load Balancer : 简介

    Azure 提供的负载均衡服务叫 Load Balancer,它工作在 ISO 七层模型的第四层,通过分析 IP 层及传输层(TCP/UDP)的流量实现基于 "IP + 端口" 的 ...

  3. 使用Python SDK管理Azure Load Balancer

    概述 下面将演示如何使用Python SDK管理中国区Azure Load balancer.关于Azure负载均衡器的详细功能介绍,请参考官方文档. Code Sample import os fr ...

  4. Azure Load Balancer(二) 基于内部的负载均衡来转发为访问请求

    一,引言 上一节,我们使用 Azure Load Balancer 类型为外部的,来转发我们的 Web 服务.今天我们看看另一种类型为 “Internal” 的 Azure Load Balancer ...

  5. Azure Load Balancer(一) 为我们的Web项目提供负载均衡

    一,引言 上节,我们讲到使用 Azure Traffic Manager 为我们的 Demo 项目提供负载均衡,以及流量转发的功能.但是Azure 提供类似的功能的服务远远不止这一个,今天我们就来讲一 ...

  6. 使用 Load Balancer,Corosync,Pacemaker 搭建 Linux 高可用集群

    由于网络架构的原因,在一般虚拟机或物理环境中常见的用 VIP 来实现双机高可用方案,无法照搬到 Azure 平台.但利用 Azure 平台提供的负载均衡或者内部负载均衡功能,可以达到类似的效果. 本文 ...

  7. 在Google的GKE上创建支持Internal Load Balancer的Service

    在Google的Kubernetes Engine上发布service,可以采用除On-Promise相同的Cluster IP和NodePort两种方式外,还可以创建LoadBalaner的Serv ...

  8. 配置Internal Load balancer中VM的外网访问

    当在Azure中部署SQL VM时,处于安全考虑,不会配置VM的Public IP,会禁止外网的进出站访问,只允许从内部VNET,或者特定的内部IP访问.特别是当使用Azure Internal Lo ...

  9. NGINX Load Balancing - HTTP Load Balancer

    This chapter describes how to use NGINX and NGINX Plus as a load balancer. Overview Load balancing a ...

随机推荐

  1. Azure 标准与高级托管磁盘存储的相互转换

    托管磁盘提供两种存储选项:高级(基于 SSD)和标准(基于 HDD). 它允许基于性能需求在这两个选项之间轻松切换,并保障最短停机时间. 非托管磁盘不具备此功能. 但可以轻松转换为托管磁盘,以便在这两 ...

  2. python第十五天-原来还差一份作业

    作业 1: 员工信息表程序,实现增删改查操作 可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 select ...

  3. Java的学习路线建议(转)

    https://www.cnblogs.com/huaxingtianxia/p/5724093.html

  4. java针对不同方法的分页

    一.常见的分页实现方式 ①使用List接口中的subList(int startIndex,int endIndex)方法实现分页 ②直接使用数据库SQL语句实现分页 ③使用hibernate等框架实 ...

  5. Linux自制编译内核

    今天我们来自己学习编译内核并使用它.自制内核是个人定制版,定制自己专属的内核环境. 我们先看看编译步骤有哪些: 步骤: 1.# tar xf linux-3.10.37.tar.xz -C /usr/ ...

  6. debian 7.4 安装配置

    改用debian差不多有半年了,之前一直用fedora,大概3年多,虽然软件包都很新,总是不太稳定,有点软件用着用着就自动退出了. 换了debain之后,这半年还真是一直没啥问题,这里总结了一些安装配 ...

  7. 英语初级学习系列-00-Name-介绍自己

    1. 询问名字 常用句子 1. Hi, may I have your name, please? 2. Could you please tell me your name? 3. Will it ...

  8. 个人技术博客——linux服务器配置以及flask框架

    本次的软件工程实践,我负责我们组后台服务的搭建,我选用了bandwagon的服务器,安装的是Debian GNU/Linux,全程在root用户下操作,后端服务是用python的flask框架,数据库 ...

  9. Ubuntu18.04 安装tomcat9

    1.官网下载 2.移动到/usr/local/tomcat 3.解压 4.修改权限,否则在idea中不能正常使用

  10. go标准库的学习-net/rpc/jsonrpc

    参考:https://studygolang.com/pkgdoc 导入方式: import "net/rpc/jsonrpc" jsonrpc包实现了JSON-RPC的Clien ...