如何在Azure中为Cloud Service创建内部负载均衡器(经典)?

时间:2016-07-14 12:11:13

标签: azure azure-cloud-services internal-load-balancer

我一直试图围绕为包含Web角色和工作者角色的云服务创建ILB(每个至少有2个实例)并且我被卡住了。 This is the scenario I'm in.

问题是我不想使用PowerShell,因为它不适合我的情况,而对云项目的服务定义和ServiceConfiguration文件的工作示例的研究使我无处可去。

所以,根据几个基本上表示相同内容的来源(official documentation,我会在评论中添加其他链接,因为我已达到上限)我最终得到了以下配置文件:

ServiceDefinition.csdef中

<ServiceDefinition name="Test" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
    <WebRole name="Web" vmsize="small">...</WebRole>
    <WorkerRole name="Worker" vmsize="small">
        ...
        <Endpoints>
            <InputEndpoint name="lbEndpoint1" protocol="tcp" localPort="31010" port="31010" loadBalancer="TestILB" />
        </Endpoints>
    </WorkerRole>
</ServiceDefinition>

ServiceConfiguration.Cloud.cscfg

<ServiceConfiguration serviceName="Test" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="4" osVersion="*" schemaVersion="2015-04.2.6">
    <Role name="Web">...</Role>
    <Role name="Worker">...</Role>
    <NetworkConfiguration>
        <LoadBalancers>
            <LoadBalancer name="TestILB">
                <FrontendIPConfiguration type="private" subnet="Test-ILB-Subnet-Backend" staticVirtualNetworkIPAddress="10.0.0.1" />
            </LoadBalancer>
        </LoadBalancers>
    </NetworkConfiguration>
</ServiceConfiguration>

虚拟网络和子网已在Azure中配置

现在,当我尝试在本地运行解决方案时,azure仿真器会因以下错误而停止:&#34; .cscfg和.csdef不匹配&#34;。部署到Azure也失败了。

任何人都可以帮助我并告诉我,我做错了吗?

2 个答案:

答案 0 :(得分:0)

我今天遇到了同样的错误。 您面临的错误消息可能还包含:If a deployment is not in a virtual network, any load balancer associated with this deployment cannot be in a virtual network. As the current deployment is not to a virtual network, please remove the subnet field for load balancer 'TestILB'

删除subnet文件中的staticVirtualNetworkIPAddress.csdef字段就上传而言起了作用。

执行Get-AzureService | Get-AzureInternalLoadBalancer会返回以下内容

InternalLoadBalancerName : TestLoadBalancer
ServiceName              : Test
DeploymentName           : {GUID}
SubnetName               :
IPAddress                : 100.120.xx.xxx
OperationDescription     : Get-AzureInternalLoadBalancer
OperationId              : {GUID}
OperationStatus          : Succeeded

Cloud Service现在在Public IP adresses部分显示两个IP。一个是100.64.0.0/10范围内的内部。奇怪的是,这不在我指定的ILB IP范围(192.168.0.0/16)中。

答案 1 :(得分:0)

好的,最后幸运的是! 在官方文档中,VM的部署模型与传统云服务之间存在轻微的混淆。需要做的每件事都有所不同。

所以在云服务的情况下,这个精彩的example project就可以了。

有两件事需要做:

  1. 使用子网配置虚拟网络(您在上面的链接中有一个文档页面作为链接资源 - 前提条件部分)。这最终得到了一个powershell脚本,它基本上检查vnet是否存在,如果不存在,它只使用以下cmdlet:

    Set-AzureVNetConfig -ConfigurationPath [path_to_your_vnet_xml_config_file]
    
  2. 确实.cscfg和.csdef需要示例项目中描述的更广泛的更改。作为注释,定义并连接到ILB的输入端点将仅对ILB可见,因此它们不会暴露给外部世界。
  3. ServiceConfiguration.Cloud.cscfg:

    <NetworkConfiguration>
        <!-- Doc: https://azure.microsoft.com/en-us/documentation/articles/virtual-networks-create-vnet-classic-netcfg-ps/ -->
        <VirtualNetworkSite name="VNET_NAME" />
        <AddressAssignments>
            <InstanceAddress roleName="Web">
                <Subnets>
                <Subnet name="Frontend" />
                </Subnets>
            </InstanceAddress>
            <InstanceAddress roleName="Worker">
                <Subnets>
                <Subnet name="Backend" />
                </Subnets>
            </InstanceAddress>
            <ReservedIPs>
                <ReservedIP name="RESERVED_IP" />
            </ReservedIPs>
        </AddressAssignments>
        <!-- Doc: https://github.com/Azure-Samples/cloud-services-dotnet-internal-load-balancer -->
        <LoadBalancers>
            <LoadBalancer name="testilb">
                <FrontendIPConfiguration type="private" subnet="Backend" />
            </LoadBalancer>
        </LoadBalancers>
    </NetworkConfiguration>
    

    ServiceDefinition.csdef中:

    <Endpoints>
          <!-- Doc: https://github.com/Azure-Samples/cloud-services-dotnet-internal-load-balancer -->
          <InputEndpoint name="OdbcEndpoint" protocol="tcp" port="31010" localPort="31010" loadBalancer="testilb" />
          <InputEndpoint name="HttpEndpoint" protocol="http" port="80" localPort="80" loadBalancer="testilb" />
    </Endpoints>
    

    同样作为在模拟器中本地运行解决方案时的重要注意事项,请务必使用xdt转换创建ServiceDefinition.Local.csdef,以删除输入端点。这消除了表明.cscfg和.csdef不匹配的错误。

    对于我的具体但并非罕见的案例来说,这是非常痛苦的。