【问题标题】:Azure Service Fabric Windows Containers - Inter Container CommunicationAzure Service Fabric Windows 容器 - 容器间通信
【发布时间】:2026-01-06 14:00:02
【问题描述】:

我使用“Windows 2016 DataCenter with Containers”操作系统创建了一个 Azure Service Fabric 集群,并在集群的 80 端口上启用了反向代理侦听。我们打算在此集群上部署我们的旧版 ASP.NET MVC 和 WCF 应用程序。

在我们现有的部署模型中,由于聊天通信和低延迟要求,我们将位于同一主机上的服务相互通信。 windows 容器中托管的应用程序是否可以与同一节点上的其他 windows 容器应用程序通信?基本上,我希望在同一个 Service Fabric 节点上的两个 Windows 容器应用程序之间具有节点关联性。

我用一个示例应用程序进行了尝试,看起来唯一的选择是使用动态分配的容器的私有 IP。在 Service Fabric 集群上实例化容器时是否可以传递 --ip-address 参数?

[更新:2017 年 4 月 5 日]

Service Fabric 群集版本:5.5.219.0

节点类型总数:1

节点总数:3

两个容器都部署在所有三个节点上。 Azure Internet 负载均衡器用于公开 Service Fabric 反向代理。所有服务都通过反向代理在内部和外部访问。

高拉夫

【问题讨论】:

    标签: azure azure-service-fabric service-fabric-stateful windows-container service-fabric-actor


    【解决方案1】:

    您现在可以在 v5.5 版本中执行哪些操作,以及下一个版本中将要执行的操作。

    适用于 v5.5 版本 此 GitHub 存储库 https://github.com/Azure-Samples/service-fabric-dotnet-containers 展示了如何在 Windows 容器之间进行通信,您可以使用应用程序清单中的 PortBinding 策略将主机端口映射到容器上的私有端口。

    然后,您可以通过 REST 调用命名服务(这就是本示例所做的)或如您所说的那样更容易与具有 URL 格式的 ReverseProxy 进行通信。如果两个容器都部署在同一台机器上,则通信是通过本地 ReverseProxy 进行的,并且您可以在容器之间进行本地调用。见https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reverseproxy。正如 Mikkel 指出的那样,您必须通过放置约束告诉 Service Fabric 您希望容器位于同一 VM 上。

    注意:要使上述 GitHub 示例在您的本地计算机上运行,您需要更新 C:\Program Files\Microsoft SDKs\Service Fabric\ClusterSetup\ 中的本地开发清单 ClusterManifestTemplate.xml NonSecure\FiveNode 文件夹并将 IPAddressOrFQDN 属性从“localhost”更改为运行它的机器的实际 IP。这是由于上面的 git 存储库中记录的 Windows Server 网络错误。即

    <Node NodeName="_Node_0" IPAddressOrFQDN="ComputerFullName" IsSeedNode="true"  NodeTypeRef="NodeType0" FaultDomain="fd:/0" UpgradeDomain="0" />
    

    变成

    <Node NodeName="_Node_0" IPAddressOrFQDN="192.1.3.50" IsSeedNode="true"  NodeTypeRef="NodeType0" FaultDomain="fd:/0" UpgradeDomain="0" />
    

    即将发布 v5.6 在下一个版本中,我们在命名服务之上添加了一个 DNS 服务器,以便您可以使用 DNS 名称代替反向代理使用的 fabric:/ 名称。这意味着在 Service Fabric 群集中,您可以改为使用 http://[domainname]/path 调用在容器之间进行调用。相同的规则适用于与反向代理相同的机器上的本地容器之间的调用。

    【讨论】:

    • 感谢您的详细回复。我在上面添加了更多环境细节...与您的声明“如果两个容器都部署在同一台机器上,那么通信是通过本地 ReverseProxy 并且您在容器之间获得本地调用”...您如何强制使用本地反向代理?如果容器 A 中的服务 A 正在调用容器 B 中的服务 B,那么它将使用格式为 http://:/ContainerASFAppB/ServiceB 的 URL。负载均衡器会随机选择三个节点中的任何一个上存在的反向代理
    • 我阅读了有关放置约束的信息,但在这种情况下,由于两个容器都存在于所有三个节点上,因此可能没有帮助。我想要实现的是相同节点上的容器通过它们的主机名、IP 地址或通过本地反向代理相互通信。我没有找到在应用程序或服务清单中指定主机名或 IP 地址的方法。这些值由 Service Fabric 随机分配。所以对我来说唯一的方法是使用节点 IP 地址或本地反向代理。由于 Win 2016 WinNAT 限制,我也无法使用主机 IP。
    【解决方案2】:

    【讨论】:

    • 感谢 Mikkel 分享链接。我浏览了文档,但看起来此功能对 Service Fabric 无状态和有状态服务很有用。我找不到任何有关如何将基于容器的应用程序放在服务结构节点上的信息。
    • 如果将容器部署为访客容器,它们基本上是无状态服务。