Подтвердить что ты не робот

Как настроить и включить обратный прокси-сервер Azure Service Fabric для существующего локального кластера?

Является ли обратный прокси-сервер Azure Service Fabric доступным в локальном кластере? Если да, как я могу включить его для существующего кластера?

Обратный прокси-сервер Service Fabric описывается здесь. Он позволяет клиентам, внешним по отношению к кластеру, обращаться к службам приложений по имени со специальным URL-адресом, без необходимости знать точный хост: порт, на котором запущен экземпляр службы (который может меняться, поскольку службы автоматически перемещаются).

По умолчанию обратный прокси-сервер службы Fabric не отображается для моего кластера на предварительном уровне с двумя экземплярами службы без состояния. Я попытался использовать documented порт 19008, но не смог связаться с сервисом, используя рекомендуемый синтаксис URI.

Для этого это работает:

http://fqdn:20001/api/odata/v1/$metadata

но это не так:

http://fqdn:19008/MyApp/MyService/api/odata/v1/$metadata

В разделе NodeTypes ClusterConfig JSON, используемом для настройки моего кластера on-prem, существует свойство "httpGatewayEndpointPort": "19080", но этот порт не работает как обратный прокси (это Служба Конечная точка веб-приложения проводника Fabric). Я предполагаю, что необходимая конфигурация каким-то образом указана в конфигурации кластера JSON. В статье есть инструкции, в которых объясняется, как настроить обратный прокси-сервер в облаке, но не на месте.

Я ищу инструкции по настройке обратного прокси-сервера Service Fabric в локальном кластере с несколькими машинами или dev-кластером.

4b9b3361

Ответ 1

Да, обратный прокси-сервер доступен на месте.

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

Для нового кластера настройте его в конфигурации кластера JSON перед созданием кластера, как описано @Scott Weldon.

@Senj дал ключ (спасибо!), который привел меня к ответу. Недавно я обновил биты служебной ткани в своем блоке dev до 5.1.163.9590. Когда я посмотрел в C:\SfDevCluster\Data\FabricHostSettings.xml, я заметил следующее:

 <Section Name="FabricNode">
    ...
    <Parameter Name="NodeVersion" Value="5.1.163.9590:1.0:0" />
    ...
    <Parameter Name="HttpApplicationGatewayListenAddress" Value="19081" />
    <Parameter Name="HttpApplicationGatewayProtocol" Value="http" />
    ...
  </Section>

Интересно! Когда кластер dev запущен, я просмотрел:

http://localhost:19081/MyApp/MyService/api/odata/v1/$metadata

и вуаля! Мой API возвратил ожидаемые данные. Поэтому @Senj был прав, что он связан с настройками HttpApplicationGateway. Я предполагаю, что в последней версии SDK она предварительно настроена и включена по умолчанию. (Что меня отбросило, все документы относятся к порту 19008, но фактический сконфигурированный порт был 19081!)

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

  • Скопируйте существующий манифест кластера (со вкладки Манифест в Проводнике Fabric), вставьте в новый XML файл, наберите номер версии и измените следующим образом:

В разделе Конечные точки NodeType добавьте:

<NodeTypes>
    <NodeType Name="NodeType0">
      <Endpoints>
        <HttpApplicationGatewayEndpoint Port="19081" Protocol="http" />
        ...
      </Endpoints>
    </NodeType>
</NodeTypes>

и в разделе <FabricSettings> добавьте следующий раздел:

<Section Name="ApplicationGateway/Http">
  <Parameter Name="IsEnabled" Value="true" />
</Section>
  1. Использование служебных команд PowerShell:

    • Скопируйте новую конфигурацию кластера (ранее скопированный файл manifest.xml) в хранилище изображений ткани.
    • Зарегистрируйте конфигурацию нового кластера
    • Скопировать рабочую оболочку службы Runtime кластеров codepackage (доступно здесь - см. примечания к выпуску для ссылки на MSI) в хранилище изображений.
    • Зарегистрировать кластеров codepackage
    • Начало и завершение обновления кластера (я использовал неконтролируемый ручный режим, который делает одну виртуальную машину одновременно, и требует команды ручного возобновления после завершения каждого node)

После завершения обновления кластера я смог запросить мой API-интерфейс, используя синтаксис URL-адреса обратной прокси-сервера и имени приложения/серьевого имени:

http://fqdn:19081/MyApp/MyService/api/odata/v1/$metadata

Ответ 2

Я включил это в автономную версию установщика (5.1.156), добавив следующую строку в файл конфигурации JSON под элементом nodeTypes (я использовал ClusterConfig.Unsecure.MultiMachine.json, но я предполагаю, что любой из файлов JSON будет работать):

"httpApplicationGatewayEndpointPort": "19081"

Итак, окончательный nodeTypes выглядел так:

"nodeTypes": [
    {
        "name": "NodeType0",
        "clientConnectionEndpointPort": "19000",
        "clusterConnectionEndpoint": "19001",
        "httpGatewayEndpointPort": "19080",
        "httpApplicationGatewayEndpointPort": "19081",
        "applicationPorts": {
            "startPort": "20001",
            "endPort": "20031"
        },
        "ephemeralPorts": {
            "startPort": "20032",
            "endPort": "20062"
        },
        "isPrimary": true
    }
]

Ответ 3

Я думаю, что это имеет какое-то отношение к свойству HttpApplicationGatewayEndpoint, см. также мой вопрос о https://github.com/Azure/service-fabric-issues/issues/5 Но это не работает для меня.

Также обратите внимание, что

<Section Name="ApplicationGateway/Http">
            <Parameter Name="IsEnabled" Value="true" />
</Section>

верен для меня.

Edit:

Я заметил, что в моей установке только для Windows HttpApplicationGatewayListenAddress имеет значение 0 в файле FabricHostSettings.xml

<Parameter Name="HttpGatewayListenAddress" Value="19080" />
<Parameter Name="HttpGatewayProtocol" Value="http" />
<Parameter Name="HttpApplicationGatewayListenAddress" Value="0" />
<Parameter Name="HttpApplicationGatewayProtocol" Value="" />