单个 Azure Cloude 服务上具有不同域名的多个虚拟机?

单个 Azure Cloude 服务上具有不同域名的多个虚拟机?

假设我必须在 Azure 上部署 200 多个虚拟机。每个虚拟机都托管一个网站,并且每个虚拟机都必须具有唯一的域/IP 地址。

我可以将每个虚拟机部署到单独的云端服务(并具有不同的 IP),但每个订阅的云端服务限制为 200,因此这样我只能使用 200 个虚拟机(网站)。

但是,如果我在一个云服务中部署多个虚拟机(每个云服务限制为 50 个虚拟机),该怎么办?这样,每个云服务就可以有 50 个虚拟机 * 每个订阅有 200 个云服务!

问题是虚拟机必须具有不同的域/ip,并且当我将多个虚拟机部署到一个云计算服务时,所有虚拟机都具有相同的域和 ip。

  1. 如何在单一云服务中为多个虚拟机设置不同的域/ip?

  2. 每个云服务有多个 VIP 可以实现这一点吗? https://azure.microsoft.com/en-us/documentation/articles/load-balancer-multivip/

  3. 这可以通过保留 IP 地址来实现吗? https://azure.microsoft.com/en-us/blog/reserved-ip-addresses/

  4. 这可以通过新的资源管理器模型实现吗?

我当前用来将多个虚拟机部署到单个云服务的代码:

private async Task CreateVirtualMachine()
    {
        DeploymentGetResponse deploymentResponse = await _computeManagementClient.Deployments.GetBySlotAsync("myservicename", DeploymentSlot.Production);

        if (deploymentResponse == null)
        {
            var parameters = new VirtualMachineCreateDeploymentParameters
            {
                DeploymentSlot = DeploymentSlot.Production,
                Name = "mservicename",
                Label = "myservicename"
            };

            parameters.Roles.Add(new Role
            {
                OSVirtualHardDisk = new OSVirtualHardDisk
                {
                    HostCaching = VirtualHardDiskHostCaching.ReadWrite,
                    SourceImageName = "imagename"
                },

                RoleName = "vmname",
                RoleType = VirtualMachineRoleType.PersistentVMRole.ToString(),
                RoleSize = VirtualMachineRoleSize.Small,
                ProvisionGuestAgent = true
            });

            parameters.Roles[0].ConfigurationSets.Add(new ConfigurationSet
            {
                ComputerName = "vmname",
                ConfigurationSetType = ConfigurationSetTypes.LinuxProvisioningConfiguration,
                HostName = "vmname",
                AdminUserName = "adminusername",
                AdminPassword = "adminpass",
                UserName = "username",
                UserPassword = "userpass",
                DisableSshPasswordAuthentication = false,

            });

            parameters.Roles[0].ConfigurationSets.Add(new ConfigurationSet
            {
                ConfigurationSetType = ConfigurationSetTypes.NetworkConfiguration,
                InputEndpoints = new List<InputEndpoint>()
                {
                    new InputEndpoint()
                    {
                        Name = "HTTP",
                        Protocol = InputEndpointTransportProtocol.Tcp,
                        LocalPort =  80,
                        Port = 80
                    }
                }
            });

            var response = await _computeManagementClient.VirtualMachines.CreateDeploymentAsync("mservicename", parameters);

        }
        else
        {
            var createParameters = new VirtualMachineCreateParameters
            {
                OSVirtualHardDisk = new OSVirtualHardDisk
                {
                    HostCaching = VirtualHardDiskHostCaching.ReadWrite,
                    SourceImageName = "imagename"
                },

                RoleName = "vmname",
                RoleSize = VirtualMachineRoleSize.Small,
                ProvisionGuestAgent = true,

                ConfigurationSets = new List<ConfigurationSet>
            {
                new ConfigurationSet
                {

                    ComputerName = "vmname",
                    ConfigurationSetType = ConfigurationSetTypes.LinuxProvisioningConfiguration,
                    HostName = "vmname",
                    AdminUserName = "adminusername",
                    AdminPassword = "adminpass",
                    UserName = "username",
                    UserPassword = "userpass",
                    DisableSshPasswordAuthentication = false
                },
                new ConfigurationSet
                {
                    ConfigurationSetType = ConfigurationSetTypes.NetworkConfiguration,
                    InputEndpoints = new List<InputEndpoint>()
                    {
                        new InputEndpoint()
                        {
                            Name = "HTTP",
                            Protocol = InputEndpointTransportProtocol.Tcp,
                            LocalPort =  81,
                            Port = 81
                        }
                    }
                }
            }
            };

            var responseCreate = await _computeManagementClient.VirtualMachines.CreateAsync("mservicename", deploymentResponse.Name, createParameters);

        }
    }

答案1

如果你希望云服务中的每个虚拟机都有自己的 IP,那么你需要查看实例级公共 IP,这些是分配给每个 VM 的单独 IP,而不是云服务。

不过,我建议你也考虑放弃使用云服务,并考虑使用新的基于资源管理器的堆栈而是。如果您不知道,Azure 的所有 V2 资源都脱离了云服务模型,而是使用新的资源管理器格式。这种新格式对于您正在做的事情有一些显著的优势:

  • 将网络接口和负载均衡器拆分为单独的项目,每个项目可以拥有单独的公有 IP 和私有 IP
  • 基于声明模板的资源创建
  • 并行创建资源,如果您需要同时创建大量虚拟机,这一点尤其重要

云服务仍然存在,并且还没有关于将其删除的公告,但是 ARM 模型似乎更适合您正在尝试做的事情。

相关内容