Azure Service Fabric 从 Visual Studio 发布升级 - PowerShell 脚本错误

Posted

技术标签:

【中文标题】Azure Service Fabric 从 Visual Studio 发布升级 - PowerShell 脚本错误【英文标题】:Azure Service Fabric publish upgrade from Visual Studio - PowerShell Script Error 【发布时间】:2019-03-16 15:12:09 【问题描述】:

我正在尝试将 Service Fabric 应用程序从 Visual Studio 2017 升级到我们的 Azure Service Fabric 集群。 9 月中旬,我成功地将具有相同 PowerShell 脚本的同一应用程序升级到 SFC,没有任何问题。我现在正试图在下一个版本号升级它,突然收到这个错误。

我在发布期间收到以下与 Powershell 相关的错误。

2>Started executing script 'Deploy-FabricApplication.ps1'.
2>powershell -NonInteractive -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -Command ". 'C:\Users\pj\Source\Workspaces\VDevelopment\trunk\Services\Sources\src\For.Application.ServiceFabric.Sources\Scripts\Deploy-FabricApplication.ps1' -ApplicationPackagePath 'C:\Users\pj\Source\Workspaces\VDevelopment\trunk\Services\Sources\src\For.Application.ServiceFabric.Sources\pkg\Debug' -PublishProfileFile 'C:\Users\pj\Source\Workspaces\VDevelopment\trunk\Services\Sources\src\For.Application.ServiceFabric.Sources\PublishProfiles\Cloud.xml' -DeployOnly:$false -ApplicationParameter:@ -UnregisterUnusedApplicationVersionsAfterUpgrade $false -OverrideUpgradeBehavior 'None' -OverwriteBehavior 'SameAppTypeAndVersion' -SkipPackageValidation:$false -ErrorAction Stop"
2>Copying application package to image store...
2>Upload to Image Store succeeded
2>Registering application type...
2>Register application type started. Use Get-ServiceFabricApplicationType to query for status.
2>Running Image Builder process ...
2>Application package is registered.
2>Start upgrading application...
2>aka.ms/upgrade-defaultservices
2>Start-ServiceFabricApplicationUpgrade : aka.ms/upgrade-defaultservices
2>At C:\Program Files\Microsoft SDKs\Service 
2>Fabric\Tools\PSModule\ServiceFabricSDK\Publish-UpgradedServiceFabricApplication.ps1:317 char:13
2>+             Start-ServiceFabricApplicationUpgrade @UpgradeParameters
2>+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2>    + CategoryInfo          : InvalidOperation: (Microsoft.Servi...usterConnection:ClusterConnection) [Start-ServiceFa 
2>   bricApplicationUpgrade], FabricException
2>    + FullyQualifiedErrorId : UpgradeApplicationErrorId,Microsoft.ServiceFabric.Powershell.StartApplicationUpgrade
2> 
2>Finished executing script 'Deploy-FabricApplication.ps1'.
2>Time elapsed: 00:07:39.0407526
2>The PowerShell script failed to execute.
========== Build: 1 succeeded, 0 failed, 10 up-to-date, 0 skipped ==========
========== Publish: 0 succeeded, 1 failed, 0 skipped ==========

知道这里发生了什么吗?同样,当我在 9 月最后一次发布此内容时,使用相同的脚本,完全没有问题,除了升级 Manifest 版本以将其作为新的升级版本推出之外,我没有对解决方案进行任何更改。

我注意到这个 S/O 线程:Getting error as part of trying to upgrade Service Fabric Application using Start-ServiceFabricApplicationUpgrade 并看到用户的错误类似,但答案不适用于我的问题,因为提供的答案中的所有三个步骤都肯定包含在我的 powershell 部署脚本中。

如果有帮助,我可以添加部署脚本,但由于它很长,我会等到请求时再发布,如果有人认为需要诊断,我只想在此处发布。

【问题讨论】:

【参考方案1】:

您收到此错误是因为您正在更改默认情况下不允许的 DefaultService 中的某些参数。

错误日志中显示的链接aka.ms/upgrade-defaultservices对此进行了解释。

一些在应用程序清单中定义的默认服务参数 也可以作为应用程序升级的一部分进行升级。

只有支持被改变的服务参数 Update-ServiceFabricService 可以作为升级的一部分进行更改。这 在应用程序升级期间更改默认服务的行为如下 如下:

    在新应用程序清单中创建集群中尚不存在的默认服务。 旧应用程序清单和新应用程序清单中都存在的默认服务已更新。默认参数 新应用程序清单中的服务覆盖参数 现有的服务。应用升级将回滚 如果更新默认服务失败,则自动更新。 如果集群中存在新应用程序清单中不存在的默认服务,则将其删除。请注意,删除默认 service 将导致删除该服务的所有状态,并且不能 撤消。

此外,还有关于同一件事的其他 SO 问题:Default service descriptions can not be modified as part of upgrade set EnableDefaultServicesUpgrade to true

上面的第 1 项是一种常见的方法,将新服务添加到解决方案中,然后在升级过程中无错误地创建,第 2 项和第 3 项是需要EnableDefaultServicesUpgrade 的受限方法。

第 2 项,就像您添加的答案中所述,您在手动更新期间将 MinReplicaSizeTargetReplicaSize 更改为 1,当 SF 验证您的服务状态以进行升级时,它确定了差异并阻止升级继续,如果您将集群设置 EnableDefaultServicesUpgrade 设置为 true,它将继续并覆盖默认值。

第 3 项,当您删除服务并再次添加时会出现,您更改或拼写错误名称,SF 默认设置会阻止删除此服务。

关于您找到的解决方案(删除并重新创建),并不理想, 在生产中运行有状态服务的场景中,应用会有风险,因为您必须备份状态、重新部署服务并恢复备份,在某些情况下,取决于这些更改是什么,您会' 无法恢复备份,因为它们必须与原始服务定义(分区类型、编号和子项)匹配。您还将失去滚动更新的好处,如果这些备份很大,您的服务可能会下降一段时间。

【讨论】:

您好,Diego - 我将在这里开始称呼您为 Service Fabric 专家。我发现了问题:请看我的回答。 大声笑,我远非专家,SF太复杂,什么都知道,我在这里闲逛学习其他问题,当我知道答案时,我会尽力提供帮助!跨度> 关于您的回答,问题在技术上就是我上面所说的,TargetReplicasizes 是默认限制更改的值之一,在部署之外更改使其与更新参数保持一致并避免问题。 Diego - 我明白 - 我认为我的回答也很有帮助,因为它可以帮助读者理解,如果他们在 SF Explorer 中进行任何手动更改,可能会导致下一次部署出现问题 - 我的问题与我通过研究发现的节点不匹配有关。无论如何,如果您想以某种方式将我的一些细节纳入您的答案中,我很乐意将您的问题标记为答案(例如,也许添加到您的答案中“正如 OP 在他的回答中提到的那样,问题是由.. ....这是受限制的值之一),或类似的东西。【参考方案2】:

这个问题与我们试图推出具有不匹配节点实例的应用程序有关。我们在这个应用程序下运行了一个有状态的服务,它应该将 MinReplicaSize 和 TargetReplicaSize 设置为 3。昨天,由于一个问题,我们在 SF Explorer 中删除并重新创建了这个服务。执行此操作后,它将副本大小参数重置回 1。因此我们使用 Powershell 脚本将它们更改回 3,但该脚本没有包含使服务恢复到之前的确切状态所需的所有命令我们删除了它。所以今天我们去升级应用程序时,SFC 中的应用程序不会接受从 VS 部署升级,因为解决方案的参数与我们的 SFC 中的参数不匹配。为了解决这个问题,我们先重新删除了这些服务,然后从 VS 部署,不再报错。

【讨论】:

您是否尝试使用Update-ServiceFabricService cmdlet 更新副本计数,然后再次执行升级? @OlegKarasik Update-ServiceFabricService 正是我用来更改副本大小参数的方法。根据 Diego 的回答,当我们一开始就删除服务时,问题才真正开始,因为它是一个有状态的服务。那时,尝试通过资源管理器重新添加服务而不是从源代码重新部署是徒劳的。

以上是关于Azure Service Fabric 从 Visual Studio 发布升级 - PowerShell 脚本错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure 中收集 Service Fabric 群集日志

Azure Service Fabric 与 Azure Service Fabric Mesh

aZURE Service Fabric

在 Azure Service Fabric (API) 中从一个微服务向另一个微服务发送消息

Azure Service Fabric:无法运行本地 Service Fabric 群集

从 Azure Service Fabric 中的不同应用程序与无状态 Web Api 服务通信