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

How do I create an Internal Load Balancer in Azure for a Cloud Service (classic)?

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

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

因此,根据几个基本上陈述相同内容的来源(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 模拟器停止并出现以下错误:“.cscfg 和 .csdef 不匹配”。部署到 Azure 也失败了。

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

我今天遇到了同样的错误。 您遇到的错误消息可能还包含: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'

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

执行Get-AzureService | Get-AzureInternalLoadBalancerreturns以下

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

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

好的,终于幸运了! 官方文档中VMs和经典云服务的部署模型有点混淆。每个人需要做的事情不同。

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

需要做两件主要的事情:

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

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

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>

另请注意,当 运行 解决方案在模拟器本地时,请务必创建一个 ServiceDefinition.Local.csdef 带有删除输入端点的 xdt 转换。这消除了指出 .cscfg 和 .csdef 不匹配的错误。

对于我的特定但并不少见的案例来说,要做到这一点非常痛苦。