假设我必须在 Azure 上部署 200 多个虚拟机。每个虚拟机都托管一个网站,并且每个虚拟机都必须具有唯一的域/IP 地址。
我可以将每个虚拟机部署到单独的云端服务(并具有不同的 IP),但每个订阅的云端服务限制为 200,因此这样我只能使用 200 个虚拟机(网站)。
但是,如果我在一个云服务中部署多个虚拟机(每个云服务限制为 50 个虚拟机),该怎么办?这样,每个云服务就可以有 50 个虚拟机 * 每个订阅有 200 个云服务!
问题是虚拟机必须具有不同的域/ip,并且当我将多个虚拟机部署到一个云计算服务时,所有虚拟机都具有相同的域和 ip。
如何在单一云服务中为多个虚拟机设置不同的域/ip?
每个云服务有多个 VIP 可以实现这一点吗? https://azure.microsoft.com/en-us/documentation/articles/load-balancer-multivip/
这可以通过保留 IP 地址来实现吗? https://azure.microsoft.com/en-us/blog/reserved-ip-addresses/
这可以通过新的资源管理器模型实现吗?
我当前用来将多个虚拟机部署到单个云服务的代码:
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 模型似乎更适合您正在尝试做的事情。