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


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

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

По умолчанию Структура Службы обратного прокси-сервера не появляются, чтобы быть поддержкой для моих локальных кластеров с двумя экземплярами служба без. Я попытался использовать документированный порт 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", но этот порт не используется. по-видимому, работает как обратный прокси-сервер (это конечная точка веб-приложения Service Fabric Explorer). Я предполагаю, что необходимая конфигурация указана каким-то образом в конфигурации кластера JSON. В упомянутой статье есть инструкции, объясняющие, как настроить обратный прокси-сервер в облаке, но не локально.

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

3 14

3 ответа:

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

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

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

@Senj предоставил подсказку (спасибо!) это привело меня к ответу. Я недавно обновил свои биты Service Fabric на своей коробке 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), я сделал следующее (примечание: Я не думаю, что обновление пакета кода кластера было необходимо, но поскольку у меня не было ничего в моем хранилище образов для обновления кластера, а процесс обновления кластера требует пакета кода, я использовал последнюю версию):

  1. скопируйте существующий манифест кластера (с вкладки манифест в Обозревателе Service Fabric Explorer), вставьте его в новый 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 Service Fabric:

    • скопируйте новую конфигурацию кластера (ранее скопированный манифест.xml) в хранилище изображений ткани
    • зарегистрируйте новую конфигурацию кластера
    • скопируйте кодовый пакет кластера среды выполнения Service Fabric (доступный Здесь - см. выпуск Примечания для ссылки на MSI) в хранилище изображений
    • зарегистрировать кластерный кодовый пакет
    • запуск и завершение обновления кластера (я использовал unmonitored manual mode, который делает одну виртуальную машину за раз и требует ручной команды возобновления после завершения каждого узла)

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

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

Я включил это в версии автономного установщика (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
    }
]

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

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

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

Это верно для меня.

Правка:

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

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