如何为现有的本地集群配置和启用 Azure Service Fabric 反向代理?

Posted

技术标签:

【中文标题】如何为现有的本地集群配置和启用 Azure Service Fabric 反向代理?【英文标题】:How to configure and enable Azure Service Fabric Reverse Proxy for an existing on-premises cluster? 【发布时间】:2016-12-17 06:54:26 【问题描述】:

Azure Service Fabric 反向代理是否在本地集群中可用?如果是这样,如何为现有集群启用它?

Service Fabric 反向代理描述为here。它允许集群外部的客户端使用特殊的 URL 按名称访问应用程序服务,而无需知道服务实例正在运行的确切主机:端口(可能会随着服务的自动移动而改变)。

默认情况下,Service Fabric 反向代理似乎没有为具有两个无状态服务实例的本地集群启用。我尝试使用 documented 端口 19008,但无法使用推荐的 URI 语法访问服务。

也就是说,这是可行的:

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

但这不是:

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

在用于设置我的本地集群的 ClusterConfig JSON 的 NodeTypes 部分中,有一个属性“httpGatewayEndpointPort”:“19080”,但该端口似乎不能用作反向代理(它是服务Fabric Explorer Web 应用程序端点)。我猜想在集群配置 JSON 中以某种方式指定了所需的配置。 referenced article 中有说明如何在云端配置反向代理,而不是在本地配置。

我正在寻找有关如何在本地多机集群或开发集群中设置 Service Fabric 反向代理的说明。

【问题讨论】:

【参考方案1】:

我认为这与 HttpApplicationGatewayEndpoint 属性有关,另请参阅我在https://github.com/Azure/service-fabric-issues/issues/5 上的问题 但这对我不起作用..

还要注意

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

对我来说是真的。

编辑:

我注意到在我的仅限 Windows 的安装中,HttpApplicationGatewayListenAddress 在 FabricHostSettings.xml 中的值为 0

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

【讨论】:

感谢您提供此线索。我在 5.1.156.9590 上运行的本地仅 Windows SF 集群中看到相同的值。【参考方案2】:

是的,反向代理在本地可用。

要使其适用于现有集群,必须在集群配置 XML 中对其进行配置和启用,然后必须部署新配置,如下所述。

对于新集群,请在创建集群之前在集群配置 JSON 中进行设置,如 @Scott Weldon 所述。

@Senj 提供了引导我找到答案的线索(谢谢!)。我最近将开发盒上的 Service Fabric 位更新为 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>

有趣!随着开发集群启动,我浏览到:

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

瞧!我的 API 返回了预期的数据。所以@Senj 是正确的,它与 HttpApplicationGateway 设置有关。我猜在最新的 SDK 版本中,它默认是预先配置和启用的。 (让我失望的是所有文档都引用了 19008 端口,但实际配置的端口是 19081!)

为了让反向代理在“真正的”多机 (VM) 集群上工作,我做了以下操作(注意:我不认为升级集群代码包是必要的,但因为我没有我的镜像仓库用于集群升级,集群升级过程需要代码包,我用的是最新版本):

    复制现有群集清单(从 Service Fabric Explorer 的清单选项卡中),粘贴到新的 XML 文件中,增加版本号并进行如下修改:

在 NodeType Endpoints 部分添加:

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

&lt;FabricSettings&gt; 下,添加以下部分:

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

    使用 Service Fabric PowerShell 命令:

    将新的集群配置(之前复制的 manifest.xml)复制到结构映像存储中 注册新的集群配置 将 Service Fabric 运行时群集代码包(here 可用 - 请参阅 release notes 以获取 MSI 的链接)到映像存储区 注册集群代码包 启动并完成集群升级(我使用了不受监控的手动模式,一次只做一个虚拟机,每个节点完成后需要手动恢复命令)

集群升级完成后,我可以使用反向代理端点和 appname/servicename URL 语法查询我的服务 API:

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

【讨论】:

适用于我使用 OWIN 托管的无状态服务,但不适用于 Asp.Net Core。你使用什么类型的编程模型? 我们还使用由 OWIN/Katana 和在 .NET 4.6 上运行的 WebAPI 托管的无状态服务。 (Microsoft.AspNet.WebApi.* 版本 5.2.3)还没有尝试过 .NET Core。 @Cyber​​Monk 在 SF 中使用 Windows 容器时,这似乎不起作用。有办法吗?我正在尝试将一个简单的 IIS 应用程序放在 Windows 容器中并发布公开的端口,但我似乎无法通过 19081(这是我的配置 XML 中的内容)到达它。 我按照上述步骤升级集群以添加 RP 支持:Connect-ServiceFabricCluster -ConnectionEndpoint mycluster:19000 ; Copy-ServiceFabricClusterPackage -ClusterManifestPath UpgradeClusterConfig.XML -Config -ImageStoreConnectionString "fabric:ImageStore" ; Register-ServiceFabricClusterPackage -ClusterManifestPath UpgradeClusterConfig.XML -Config ; Start-ServiceFabricClusterUpgrade -ClusterManifestVersion 5 -Config -UnmonitoredAuto ;部署到 1 或 2 台服务器,然后回滚。 详细错误是:详细:System.Fabric.FabricTransientException:操作已取消。 ---> System.Runtime.InteropServices.COMException: System.Fabric.Interop.NativeClient.IFabricClusterManagementClient7.EndGetFabricUpgradeProgress(IFabricAsyncOperationContext context) 在 System.Fabric.FabricClient.ClusterManagementClient 的操作中止(来自 HRESULT 的异常:0x80004004 (E_ABORT))。 GetFabricUpgradeProgressEndWrapper(IFabricAsyncOperationContext 上下文)【参考方案3】:

我在独立安装程序版本 (5.1.156) 中启用了此功能,方法是将以下行添加到 nodeTypes 元素下的 JSON 配置文件中(我使用了 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
    
]

【讨论】:

这是在创建新集群时启用反向代理的正确方法。所选答案与在现有集群中启用反向代理有关。我会调整问题以反映这一点。 此参数在 GA (5.3.204) 版本中已重命名为:“reverseProxyEndpointPort”。

以上是关于如何为现有的本地集群配置和启用 Azure Service Fabric 反向代理?的主要内容,如果未能解决你的问题,请参考以下文章

如何为现有的 WCF 服务原生启用 JSONP?

如何在本地收集 SF 反向代理日志

如何为 Azure 上的 Node.js Api 应用启用 BLOB 日志记录?

如何为Docker Compose配置dns条目

如何使用证书将 gitlab 连接到现有的 kubernetes 集群

如何为现有的动态网站制作android应用