【发布时间】: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 会选择一个节点来安装“缓存”。我的问题是我的应用程序如何找出是哪个节点以便连接到它?
我确实发现<ContainerHostPolicies> 节点上有一个Hostname 属性,所以我可以这样做:
<ContainerHostPolicies CodePackageRef="Code" Hostname="Cache">
现在,我可以在 Docker 容器中PING Cache 并连接到运行我的服务的容器。这很好,但是它只有在我碰巧在同一个节点上时才有效。如果我在节点 1 上并且我的缓存服务在节点 3 上运行,这将不起作用。
有一个例子here,它是一个投票亭应用程序,它可以满足我的需求。他们所做的是设置一个单独的负载平衡器池,将一些公共 IP 地址映射到投票服务的后端池。然后,该应用程序可以连接到该单个公共 IP 地址。但是,在我的情况下,我需要这是一个完全内部的东西,在集群虚拟网络之外的任何地方都无法访问我的缓存服务。我也宁愿避免负载平衡器的开销。
另一个想法是使用某种放置约束来表示“嘿,我只希望将此服务安装在具有此 DNS 名称的节点上”或其他内容,但这似乎有点 hacky。有推荐的方法吗?
【问题讨论】:
-
@OlegKarasik 嘿,这行得通!如果你把它写成答案,我会接受。如果该服务有多个实例,我有点好奇它会做什么。它会解析为随机的吗?它是否设置了内部负载平衡器?
-
是的。对于无状态服务,它会解析一个随机实例,而对于有状态服务,它总是解析主副本。
标签: azure azure-service-fabric