【问题标题】:How to find a specific node on a Service Fabric cluster如何在 Service Fabric 群集上查找特定节点
【发布时间】:2023-04-04 16:48:02
【问题描述】:

假设我有一个包含 5 个节点的 Service Fabric 群集。在其中一个节点上,我运行一个名为 Cache 的服务:

<Service Name="Cache" ServicePackageActivationMode="ExclusiveProcess">
  <StatelessService ServiceTypeName="CacheType" InstanceCount="1">
    <SingletonPartition />
  </StatelessService>
</Service>

CacheType 是一些 Docker 容器,它公开端口 8080 并为我的应用程序提供一些内部服务。在这种情况下,我只想要其中一个,所以我将 InstanceCount 设置为 1。当我将我的应用程序部署到集群时,App Fabric 会选择一个节点来安装“缓存”。我的问题是我的应用程序如何找出是哪个节点以便连接到它?

我确实发现&lt;ContainerHostPolicies&gt; 节点上有一个Hostname 属性,所以我可以这样做:

&lt;ContainerHostPolicies CodePackageRef="Code" Hostname="Cache"&gt;

现在,我可以在 Docker 容器中PING Cache 并连接到运行我的服务的容器。这很好,但是它只有在我碰巧在同一个节点上时才有效。如果我在节点 1 上并且我的缓存服务在节点 3 上运行,这将不起作用。

有一个例子here,它是一个投票亭应用程序,它可以满足我的需求。他们所做的是设置一个单独的负载平衡器池,将一些公共 IP 地址映射到投票服务的后端池。然后,该应用程序可以连接到该单个公共 IP 地址。但是,在我的情况下,我需要这是一个完全内部的东西,在集群虚拟网络之外的任何地方都无法访问我的缓存服务。我也宁愿避免负载平衡器的开销。

另一个想法是使用某种放置约束来表示“嘿,我只希望将此服务安装在具有此 DNS 名称的节点上”或其他内容,但这似乎有点 hacky。有推荐的方法吗?

【问题讨论】:

  • @OlegKarasik 嘿,这行得通!如果你把它写成答案,我会接受。如果该服务有多个实例,我有点好奇它会做什么。它会解析为随机的吗?它是否设置了内部负载平衡器?
  • 是的。对于无状态服务,它会解析一个随机实例,而对于有状态服务,它总是解析主副本。

标签: azure azure-service-fabric


【解决方案1】:

您可以为服务设置 DNS 名称。

这是来自docs 的示例:

ApplicationManifest.xml

<Service Name="Stateless1" ServiceDnsName="service1.application1">
  <StatelessService ServiceTypeName="Stateless1Type" InstanceCount="[Stateless1_InstanceCount]">
    <SingletonPartition />
  </StatelessService>
</Service>

如果您的服务使用分区架构,那么您应该遵循this 指南以确保它能够正确解析它们。

【讨论】:

    猜你喜欢
    • 2017-03-13
    • 2016-09-04
    • 2023-04-05
    • 2017-08-09
    • 2018-07-15
    • 2022-10-18
    • 1970-01-01
    • 2018-07-11
    • 2019-04-07
    相关资源
    最近更新 更多