1

我一直在尝试为包含 Web 角色和 Worker 角色(每个角色至少有 2 个实例)的云服务创建 ILB,但我被困住了。 这就是我所处的场景。

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

因此,根据几个基本上陈述相同内容的消息来源(官方文档,我将在评论中添加其他链接,因为我已经达到上限)我最终得到了以下配置文件:

服务定义.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>

服务配置.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 中预配虚拟网络和子网

现在,当我尝试在本地运行解决方案时,天蓝色模拟器停止并出现以下错误:“.cscfg 和 .csdef 不匹配”。部署到 Azure 也会失败。

谁能帮助我并告诉我我做错了什么?

4

2 回答 2

0

好吧,终于幸运的休息了!官方文档中虚拟机的部署模型和经典的云服务有轻微的混淆。每个人需要做的事情不同。

因此,在云服务的情况下,这个精彩的示例项目成功了。

一个人需要做的主要有两件事:

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

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

服务配置.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>

服务定义.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 不匹配的错误。

对于我的具体但并不少见的案例来说,这是一件非常痛苦的事情。

于 2016-08-04T12:31:02.027 回答
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'

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

执行Get-AzureService | Get-AzureInternalLoadBalancer返回以下

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)内。

于 2016-07-20T13:31:16.990 回答