为什么不能在升级中更改放置限制?

Why isn't it possible to change placement constraints in an upgrade?

我的 Azure Service Fabric 集群中有一个无状态 ASP.NET 核心 (RC1) 服务 运行。它具有以下清单:

<ServiceManifest Name="MyServicePkg" Version="1.0.2" ...>
   <ServiceTypes>
      <StatelessServiceType ServiceTypeName="MyServiceType" />
   </ServiceTypes>
   ...
</ServiceManifest>

我的集群配置了放置属性。我有 5 台服务器 "nodeType=Backend" 和 3 台服务器 "nodeType=Frontend".

我想升级我的服务并指定它只能放在 "Backend" 个节点上。这是我更新的清单:

<ServiceManifest Name="MyServicePkg" Version="1.0.3" ...>
   <ServiceTypes>
      <StatelessServiceType ServiceTypeName="MyServiceType">
          <PlacementConstraints>(nodeType==Backend)</PlacementConstraints>
      </StatelessServiceType>
   </ServiceTypes>
   ...
</ServiceManifest>

但是,如果我现在执行升级,我会收到以下错误:

Start-ServiceFabricApplicationUpgrade : Default service descriptions must not be modified as part of upgrade. Modified default service: fabric:/MyApp/MyService

为什么无法通过升级更改限制?

我是否必须删除并重新创建该服务?这对我来说似乎是个大问题,因为它会导致有状态服务的停机和数据丢失。

所以这里的问题实际上与 ApplicationManifest 的 DefaultService 部分有关。当服务作为 DefaultService 的一部分创建时,有些事情您之后无法更改。您也许可以通过 ServiceFabric 资源管理器更改它,但我不确定。

一个建议是让 ApplicationManifest 中的 DefaultServices 为空,而是手动创建您的服务。对于手册,我的意思是通过 powershell、代码或 ServiceFabric Explorer。 这使您以后可以更灵活地更改服务的各个部分。以这种方式完成后,我知道您可以在服务 运行.

后更改诸如放置限制之类的内容

要使用 PowerShell 创建服务,您可以使用 New-ServiceFabricService 命令。 要从代码创建它,您可以使用 FabricClient 来完成它。可以在此处找到其中的示例:

实际上有一种相当简单的方法可以做到这一点,而无需编写一堆代码来手动定义结构集群上的应用程序。

虽然您可以在服务清单中声明放置约束,但您也可以在应用程序清单中声明它们。应用程序清单中声明的​​任何内容都将覆盖服务清单中的内容。通过应用程序清单中的设置,您可以使用参数根据特定部署所需的参数文件更改值。

我刚写完 a blog post that discusses this approach in greater detail。希望对你有帮助。 :)