比方说,我有一个具有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名称的节点上”或类似的内容,但这似乎很不客气。有建议的方法吗?
答案 0 :(得分:1)
您可以为服务设置DNS名称。
以下是docs中的一个示例:
在ApplicationManifest.xml
中。
<Service Name="Stateless1" ServiceDnsName="service1.application1">
<StatelessService ServiceTypeName="Stateless1Type" InstanceCount="[Stateless1_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
如果您的服务使用分区架构,则应遵循this准则以确保它可以正确解决它们。