如何在Service Fabric群集上查找特定节点

时间:2018-10-05 15:17:15

标签: azure azure-service-fabric

比方说,我有一个具有5个节点的Service Fabric群集。在这些节点之一上,我运行一个名为Cache的服务:

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

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

我确实发现Hostname节点上有一个<ContainerHostPolicies>属性,因此我可以执行以下操作:

<ContainerHostPolicies CodePackageRef="Code" Hostname="Cache">

现在,从Docker容器中,我可以PING Cache并连接到运行我的服务的容器。这很棒,但是如果我碰巧在同一节点上,它有效。如果我在节点1上并且我的缓存服务在节点3上运行,则此操作无效。

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

另一个想法是使用某种放置约束来说“嘿,我只希望将此服务安装在具有此DNS名称的节点上”或类似的内容,但这似乎很不客气。有建议的方法吗?

1 个答案:

答案 0 :(得分:1)

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

以下是docs中的一个示例:

ApplicationManifest.xml中。

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

如果您的服务使用分区架构,则应遵循this准则以确保它可以正确解决它们。