如何在 Service Fabric 群集上查找特定节点
How to find a specific node on a Service Fabric cluster
假设我有一个包含 5 个节点的 Service Fabric 集群。在其中一个节点上,我 运行 一个名为缓存的服务:
<Service Name="Cache" ServicePackageActivationMode="ExclusiveProcess">
<StatelessService ServiceTypeName="CacheType" InstanceCount="1">
<SingletonPartition />
</StatelessService>
</Service>
CacheType 是一些 Docker 容器,它公开端口 8080 并为我的应用程序提供一些内部服务。在这种情况下,我只想要其中之一,所以我将 InstanceCount 设置为 1。当我将我的应用程序部署到集群时,App Fabric 将选择一个节点安装 "Cache"。我的问题是我的应用程序如何找出哪个节点以便连接到它?
我确实发现 <ContainerHostPolicies>
节点上有一个 Hostname
属性,所以我可以这样做:
<ContainerHostPolicies CodePackageRef="Code" Hostname="Cache">
现在,我可以从 Docker 容器中 PING Cache
连接到容器 运行 我的服务。这很好,但是如果我碰巧在同一节点上,它 只有 有效。如果我在节点 1 上并且我的缓存服务在节点 3 上 运行ning,则这不起作用。
有一个示例 here,它是一个 Voting Booth 应用程序,它可以满足我的需求。他们所做的是设置一个单独的负载平衡器池,将一些 public IP 地址映射到后端投票服务池。然后,应用程序可以连接到那个 public IP 地址。但是,在我的例子中,我需要这是一个完全内部的东西,在集群的虚拟网络之外的任何地方都无法访问我的缓存服务。我也宁愿避免负载平衡器的开销。
另一个想法是使用某种放置约束来表示 "Hey I only want this service installed on a node with this DNS name" 或其他内容,但这似乎很老套。有推荐的方法吗?
您可以为该服务设置一个 DNS 名称。
这是来自 docs 的示例:
在ApplicationManifest.xml
.
<Service Name="Stateless1" ServiceDnsName="service1.application1">
<StatelessService ServiceTypeName="Stateless1Type" InstanceCount="[Stateless1_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
如果您的服务使用分区架构,那么您应该遵循 this 指南以确保它能够正确解析它们。
假设我有一个包含 5 个节点的 Service Fabric 集群。在其中一个节点上,我 运行 一个名为缓存的服务:
<Service Name="Cache" ServicePackageActivationMode="ExclusiveProcess">
<StatelessService ServiceTypeName="CacheType" InstanceCount="1">
<SingletonPartition />
</StatelessService>
</Service>
CacheType 是一些 Docker 容器,它公开端口 8080 并为我的应用程序提供一些内部服务。在这种情况下,我只想要其中之一,所以我将 InstanceCount 设置为 1。当我将我的应用程序部署到集群时,App Fabric 将选择一个节点安装 "Cache"。我的问题是我的应用程序如何找出哪个节点以便连接到它?
我确实发现 <ContainerHostPolicies>
节点上有一个 Hostname
属性,所以我可以这样做:
<ContainerHostPolicies CodePackageRef="Code" Hostname="Cache">
现在,我可以从 Docker 容器中 PING Cache
连接到容器 运行 我的服务。这很好,但是如果我碰巧在同一节点上,它 只有 有效。如果我在节点 1 上并且我的缓存服务在节点 3 上 运行ning,则这不起作用。
有一个示例 here,它是一个 Voting Booth 应用程序,它可以满足我的需求。他们所做的是设置一个单独的负载平衡器池,将一些 public IP 地址映射到后端投票服务池。然后,应用程序可以连接到那个 public IP 地址。但是,在我的例子中,我需要这是一个完全内部的东西,在集群的虚拟网络之外的任何地方都无法访问我的缓存服务。我也宁愿避免负载平衡器的开销。
另一个想法是使用某种放置约束来表示 "Hey I only want this service installed on a node with this DNS name" 或其他内容,但这似乎很老套。有推荐的方法吗?
您可以为该服务设置一个 DNS 名称。
这是来自 docs 的示例:
在ApplicationManifest.xml
.
<Service Name="Stateless1" ServiceDnsName="service1.application1">
<StatelessService ServiceTypeName="Stateless1Type" InstanceCount="[Stateless1_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
如果您的服务使用分区架构,那么您应该遵循 this 指南以确保它能够正确解析它们。