Как создать внутренний балансировщик нагрузки в Azure для облачной службы (классический)?

Я пытался обернуться вокруг создания ILB для облачной службы, содержащей веб-роль и рабочую роль (по крайней мере, с двумя экземплярами каждой), и я застрял. Это мой сценарий.

Дело в том, что я не хочу использовать powershell, потому что он не подходит для моего случая, и исследование рабочего примера файла Service Definition и ServiceConfiguration для облачного проекта ни к чему не привело.

Итак, согласно нескольким источникам, которые в основном утверждают одно и то же (официальная документация, другие ссылки добавлю в комментариях, раз уж добрался до шапки) В итоге я получил следующие файлы конфигурации:

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.

Кто-нибудь может мне помочь и сказать, что я делаю не так, пожалуйста?


person Emil Craciun    schedule 14.07.2016    source источник
comment
(как только я смогу добавить несколько ссылок на исходный пост, я удалю это) документация на github, сообщение в блоге о новом SDK (перейдите в раздел Облачные службы: новые сетевые возможности в разделе Модель службы), cscfg schema, схема csdef   -  person Emil Craciun    schedule 14.07.2016


Ответы (2)


Сегодня я столкнулся с той же ошибкой. Сообщение об ошибке, с которым вы столкнулись, вероятно, также содержит: 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

Облачный сервис теперь отображает два IP-адреса в разделе Public IP adresses. Один - внутренний в диапазоне 100.64.0.0/10. Как ни странно, это не входит в указанный мной диапазон IP-адресов ILB (192.168.0.0/16).

person Marvin Dickhaus    schedule 20.07.2016
comment
Действительно, удаление двух атрибутов сделало возможным развертывание Azure, но развертывание локального эмулятора по-прежнему не удается с той же ошибкой. К сожалению, я не вижу созданных ILB на новом или старом портале, даже когда я пытаюсь использовать powershell: Get-AzureInternalLoadBalancer или Get-AzureRmLoadBalancer. Как именно ваш был подготовлен? Спасибо! - person Emil Craciun; 25.07.2016
comment
Это странно. Я действительно вижу балансировщик нагрузки, использующий Get-AzureInternalLoadBalancer с этой службой. Я обновлю свой пост соответственно. - person Marvin Dickhaus; 25.07.2016
comment
Хорошо, это действительно странно. Приходилось ли вам настраивать или выделять что-либо, помимо развертывания облачной службы в Azure? С веб-портала или с помощью сценариев PowerShell? Из всего, что я нашел до сих пор, ничто не указывает на необходимость чего-либо, кроме написания элементов конфигурации. - person Emil Craciun; 25.07.2016
comment
Мне пришлось подготовить балансировщик нагрузки (вероятно, Classic, но я не могу вспомнить), на который я затем ссылался по имени (в вашем случае TestILB) в файлах csdef и cscfg. - person Marvin Dickhaus; 25.07.2016

Итак, наконец-то удача! В официальной документации есть небольшая путаница между моделью развертывания виртуальных машин и классическими облачными сервисами. Что нужно сделать для каждого, отличается.

Итак, в случае облачных сервисов этот замечательный пример проекта сделали свое дело.

Нужно сделать две основные вещи:

  1. Подготовьте виртуальную сеть с подсетями (у вас есть страница документации в качестве связанного ресурса по ссылке выше - раздел предварительных условий). В итоге получился сценарий PowerShell, который в основном проверяет, существует ли vnet, а если нет, то просто использует следующий командлет:

    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 не совпадают.

Было довольно сложно сделать это правильно для моего конкретного, но не редкого случая.

person Emil Craciun    schedule 04.08.2016