使用 PowerShell 部署和删除应用程序


打包应用程序类型后,即可部署到 Azure Service Fabric 群集中。 部署涉及以下三个步骤:

  1. 将应用程序包上传到映像存储区。
  2. 使用映像存储区相对路径注册应用程序类型。
  3. 创建应用程序实例。

不再需要部署的应用程序后,可以删除应用程序实例及其应用程序类型。 从群集中完全删除某个应用程序涉及以下步骤:

  1. 删除正在运行的应用程序实例。
  2. 如果不再需要该应用程序类型,则将其取消注册。
  3. 从映像存储区中删除应用程序包。

如果使用 Visual Studio 来部署和调试本地开发群集上的应用程序,则将通过 PowerShell 脚本自动处理上述所有步骤。 可在应用程序项目的 Scripts 文件夹中找到此脚本。 本文提供了有关这些脚本正在执行什么操作的背景,以便可以在 Visual Studio 外部执行相同的操作。

部署应用程序的另一种方法是使用外部预配。 应用程序包可以打包为 sfpkg 并上传到外部存储区。 在这种情况下,不需要上传到映像存储区。 部署需要以下步骤:

  1. sfpkg 上传到外部存储区。 外部存储区可以是公开了 REST http 或 https 终结点的任何存储区。
  2. 使用外部下载 URI 和应用程序类型信息注册应用程序类型。
  3. 创建应用程序实例。

若要清理,请删除应用程序实例并取消注册应用程序类型。 由于已将包复制到映像存储区,因此没有要清理的临时位置。 从外部存储区预配的功能是从 Service Fabric 6.1 版开始提供的。

注意

Visual Studio 目前不支持外部预配。

连接至群集

在运行本文中的任何 PowerShell 命令之前,请始终先使用 Connect-ServiceFabricCluster 连接到 Service Fabric 群集。 若要连接到本地部署群集,请运行以下命令:

Connect-ServiceFabricCluster

有关连接到远程群集或连接到使用 Microsoft Entra ID、X509 证书或 Windows Active Directory 保护的群集的示例,请参阅连接到安全群集

上传应用程序包

上传应用程序包时会将该包放在一个可由内部 Service Fabric 组件访问的位置。 如果要在本地验证应用程序包,请使用 Test-ServiceFabricApplicationPackage cmdlet。

Copy-ServiceFabricApplicationPackage 命令用来将应用程序包上传到群集映像存储。

假设在 Visual Studio 2015 中生成并打包名为 MyApplication 的应用程序。 默认情况下,ApplicationManifest.xml 中列出的应用程序类型名称为“MyApplicationType”。 应用程序包(其中包含必需的应用程序清单、服务清单以及代码/配置/数据包)位于 C:\Users<username>\Documents\Visual Studio 2015\Projects\MyApplication\MyApplication\pkg\Debug 中。

以下命令列出应用程序包的内容:

$path = 'C:\Users\<user\>\Documents\Visual Studio 2015\Projects\MyApplication\MyApplication\pkg\Debug'
tree /f $path
Folder PATH listing for volume OSDisk
Volume serial number is 0459-2393
C:\USERS\USER\DOCUMENTS\VISUAL STUDIO 2015\PROJECTS\MYAPPLICATION\MYAPPLICATION\PKG\DEBUG
│   ApplicationManifest.xml
│
└───Stateless1Pkg
    │   ServiceManifest.xml
    │
    ├───Code
    │       Microsoft.ServiceFabric.Data.dll
    │       Microsoft.ServiceFabric.Data.Interfaces.dll
    │       Microsoft.ServiceFabric.Internal.dll
    │       Microsoft.ServiceFabric.Internal.Strings.dll
    │       Microsoft.ServiceFabric.Services.dll
    │       ServiceFabricServiceModel.dll
    │       Stateless1.exe
    │       Stateless1.exe.config
    │       Stateless1.pdb
    │       System.Fabric.dll
    │       System.Fabric.Strings.dll
    │
    └───Config
            Settings.xml

如果应用程序包很大,并且/或者包含许多文件,可以进行压缩。 压缩可以减小文件大小,减少文件数量。 这样可以更快地注册和注销应用程序类型。 上传时间目前可能会降低,尤其是当包含压缩包的时间时。

若要压缩包,请使用同一 Copy-ServiceFabricApplicationPackage 命令。 可以使用 SkipCopy 标记独立于上传进行压缩,也可以与上传操作配合使用进行压缩。 对压缩包应用压缩不会执行任何操作。 若要解压缩压缩包,请将同一 Copy-ServiceFabricApplicationPackage 命令与 UncompressPackage 切换配合使用。

以下 cmdlet 可压缩包,而不会将包复制到映像存储区。 此包中现在包括 Code 包和 Config 包的压缩文件。 不会压缩应用程序和服务清单,因为许多内部操作均需要使用它们(例如,包共享、应用程序类型名称和某些验证的版本提取)。 压缩清单会使这些操作无效。

Copy-ServiceFabricApplicationPackage -ApplicationPackagePath $path -CompressPackage -SkipCopy
tree /f $path
Folder PATH listing for volume OSDisk
Volume serial number is 0459-2393
C:\USERS\USER\DOCUMENTS\VISUAL STUDIO 2015\PROJECTS\MYAPPLICATION\MYAPPLICATION\PKG\DEBUG
|   ApplicationManifest.xml
|
└───Stateless1Pkg
       Code.zip
       Config.zip
       ServiceManifest.xml

对于大型应用程序包,压缩操作将耗费时间。 为获得最佳结果,请使用快速 SSD 驱动器。 压缩时间和压缩包的大小也会因包内容而有所不同。 例如,以下是某些包的压缩统计信息,其中显示初始大小和压缩包大小,及压缩时间。

初始大小 (MB) 文件计数 压缩时间 压缩包大小 (MB)
100 100 00:00:03.3547592 60
512 100 00:00:16.3850303 307
1024 500 00:00:32.5907950 615
2048 1000 00:01:04.3775554 1231
5012 100 00:02:45.2951288 3074

对包进行压缩后,便可根据需要将其上传到一个或多个 Service Fabric 群集。 压缩包和未压缩包的部署机制相同。 压缩包同样存储在群集映像存储区中。 运行应用程序之前,包在节点上未压缩。

以下示例将包上传到映像存储区中名为“MyApplicationV1”的文件夹中:

Copy-ServiceFabricApplicationPackage -ApplicationPackagePath $path -ApplicationPackagePathInImageStore MyApplicationV1 -TimeoutSec 1800

如果未指定 -ApplicationPackagePathInImageStore 参数,则应用程序包将复制到映像存储中的“Debug”文件夹。

注意

如果 PowerShell 会话已连接到 Service Fabric 群集,Copy-ServiceFabricApplicationPackage 会自动检测相应的映像存储区连接字符串。 对于版本低于 5.6 的 Service Fabric,必须显式提供 -ImageStoreConnectionString 参数。

PS C:\> Copy-ServiceFabricApplicationPackage -ApplicationPackagePath $path -ApplicationPackagePathInImageStore MyApplicationV1 -ImageStoreConnectionString (Get-ImageStoreConnectionStringFromClusterManifest(Get-ServiceFabricClusterManifest)) -TimeoutSec 1800

Service Fabric SDK PowerShell 模块中包含的 Get-ImageStoreConnectionStringFromClusterManifest cmdlet,用于获取映像存储连接字符串。 要导入 SDK 模块,请运行:

Import-Module "$ENV:ProgramFiles\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK\ServiceFabricSDK.psm1"

有关映像存储和映像存储连接字符串的补充信息,请参阅了解映像存储连接字符串

上传包所费时间取决于多种因素。 其中一些因素是包中文件数、包大小和文件大小。 源计算机与 Service Fabric 群集之间的网络速度也会影响上传时间。 默认 Copy-ServiceFabricApplicationPackage 的超时为 30 分钟。 根据上述因素,可能需要增加超时。 如果在复制调用中对包进行压缩,还需要考虑压缩时间。

注册应用程序包

应用程序清单中声明的应用程序类型和版本会在注册应用程序包时可供使用。 系统会读取上一步中上传的程序包,验证此包,处理包的内容,并将已处理的包复制到内部系统位置。

运行 Register-ServiceFabricApplicationType cmdlet 以在群集中注册应用程序类型并使其可用于部署:

注册复制到映像存储区的应用程序包

当包以前已复制到映像存储区时,注册操作会指定映像存储区中的相对路径。

Register-ServiceFabricApplicationType -ApplicationPathInImageStore MyApplicationV1
Register application type succeeded

“MyApplicationV1”是映像存储中应用程序包所在的文件夹。 现在已在群集中注册了名为“MyApplicationType”且版本为“1.0.0”(两者都可以在应用程序清单中找到)的应用程序类型。

注册复制到外部存储区的应用程序包

从 Service Fabric 6.1 版开始,预配支持从外部存储区下载包。 下载 URI 表示 sfpkg 应用程序包的路径,可使用 HTTP 或 HTTPS 协议从该处下载应用程序包。 包必须之前已上传到此外部位置。 该 URI 必须允许读取访问权限,因此 Service Fabric 可以下载该文件。 sfpkg 文件必须具有扩展名“.sfpkg”。 预配操作应包括应用程序类型信息,该信息可在应用程序清单中找到。

Register-ServiceFabricApplicationType -ApplicationPackageDownloadUri "https://sftestresources.blob.core.chinacloudapi.cn:443/sfpkgholder/MyAppPackage.sfpkg" -ApplicationTypeName MyApp -ApplicationTypeVersion V1 -Async

Register-ServiceFabricApplicationType 命令只有在系统成功注册应用程序包后才会返回。 注册花费的时间取决于应用程序包的大小和内容。 如果需要, -TimeoutSec 参数可用于提供更长的超时(默认超时为 60 秒)。

如果在处理大型应用程序包,或者遇到超时,请使用 -Async 参数。 该命令会在群集接受注册命令时返回。 注册操作会根据需要继续。 Get-ServiceFabricApplicationType 命令将列出应用程序类型版本及其注册状态。 此命令可用于确定注册的完成时间。

Get-ServiceFabricApplicationType
ApplicationTypeName    : MyApplicationType
ApplicationTypeVersion : 1.0.0
Status                 : Available
DefaultParameters      : { "Stateless1_InstanceCount" = "-1" }

从映像存储中删除应用程序包

如果包已复制到映像存储区,则应在成功注册该应用程序后将其从临时位置中删除。 从映像存储区中删除应用程序包可以释放系统资源。 保留未使用的应用程序包会占用磁盘存储空间,导致应用程序出现性能问题。

Remove-ServiceFabricApplicationPackage -ApplicationPackagePathInImageStore MyApplicationV1

创建应用程序

可以使用 New-ServiceFabricApplication cmdlet 通过已成功注册的任何应用程序类型版本来实例化应用程序。 每个应用程序的名称必须以“fabric:” 方案开头,并且必须对每个应用程序实例是唯一的。 还会创建目标应用程序类型的应用程序清单中定义的任何默认服务。

New-ServiceFabricApplication fabric:/MyApp MyApplicationType 1.0.0
ApplicationName        : fabric:/MyApp
ApplicationTypeName    : MyApplicationType
ApplicationTypeVersion : 1.0.0
ApplicationParameters  : {}

可以为已注册应用程序类型的任何给定版本创建多个应用程序实例。 每个应用程序实例都会隔离运行,具有其自己的工作目录和进程。

若要查看有哪些已命名应用和服务正在群集中运行,请运行 Get-ServiceFabricApplicationGet-ServiceFabricService cmdlet:

Get-ServiceFabricApplication  
ApplicationName        : fabric:/MyApp
ApplicationTypeName    : MyApplicationType
ApplicationTypeVersion : 1.0.0
ApplicationStatus      : Ready
HealthState            : Ok
ApplicationParameters  : {}
Get-ServiceFabricApplication | Get-ServiceFabricService
ServiceName            : fabric:/MyApp/Stateless1
ServiceKind            : Stateless
ServiceTypeName        : Stateless1Type
IsServiceGroup         : False
ServiceManifestVersion : 1.0.0
ServiceStatus          : Active
HealthState            : Ok

删除应用程序

当不再需要某个应用程序实例时,可以使用 Remove-ServiceFabricApplication cmdlet 按名称将其永久删除。 Remove-ServiceFabricApplication 还将自动删除属于该应用程序的所有服务,永久删除所有服务状态。

警告

此操作无法撤消,并且无法恢复应用程序状态。

Remove-ServiceFabricApplication fabric:/MyApp
Confirm
Continue with this operation?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"):
Remove application instance succeeded
Get-ServiceFabricApplication

取消注册应用程序类型

当不再需要某个特定版本的应用程序类型时,应使用 Unregister-ServiceFabricApplicationType cmdlet 取消注册该应用程序类型。 取消注册未使用的应用程序类型时,会通过删除应用程序类型文件释放映像存储区使用的存储空间。 如果使用了复制到映像存储区,取消注册应用程序类型不会删除复制到映像存储临时位置的应用程序包。 只要没有针对其实例化的应用程序或引用它的挂起应用程序升级,就可以注销应用程序类型。

若要查看群集中当前已注册的应用程序类型,请运行 Get-ServiceFabricApplicationType

Get-ServiceFabricApplicationType
ApplicationTypeName    : MyApplicationType
ApplicationTypeVersion : 1.0.0
Status                 : Available
DefaultParameters      : { "Stateless1_InstanceCount" = "-1" }

运行 Unregister-ServiceFabricApplicationType 来取消注册特定的应用程序类型:

Unregister-ServiceFabricApplicationType MyApplicationType 1.0.0

故障排除

Copy-ServiceFabricApplicationPackage 请求 ImageStoreConnectionString

Service Fabric SDK 环境应已默认设置正确。 若有需要,所有命令的 ImageStoreConnectionString 都应匹配 Service Fabric 群集正在使用的值。 可以在使用 Get-ServiceFabricClusterManifest 和 Get-ImageStoreConnectionStringFromClusterManifest 命令检索到的群集清单中找到 ImageStoreConnectionString:

Get-ImageStoreConnectionStringFromClusterManifest(Get-ServiceFabricClusterManifest)

Service Fabric SDK PowerShell 模块中包含的 Get-ImageStoreConnectionStringFromClusterManifest cmdlet,用于获取映像存储连接字符串。 要导入 SDK 模块,请运行:

Import-Module "$ENV:ProgramFiles\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK\ServiceFabricSDK.psm1"

ImageStoreConnectionString 可在群集清单中找到:

<ClusterManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" Name="Server-Default-SingleNode" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">

    [...]

    <Section Name="Management">
      <Parameter Name="ImageStoreConnectionString" Value="file:D:\ServiceFabric\Data\ImageStore" />
    </Section>

    [...]

有关映像存储和映像存储连接字符串的补充信息,请参阅了解映像存储连接字符串

部署大型应用程序包

问题:大型应用程序包(GB 级别)的 Copy-ServiceFabricApplicationPackage 超时。 请尝试:

  • 通过 TimeoutSec 参数为 Copy-ServiceFabricApplicationPackage 命令指定更长的超时。 此超时默认为 30 分钟。
  • 检查源计算机和群集之间的网络连接。 如果连接缓慢,请考虑使用一台网络连接状况更好的计算机。 如果客户端计算机位于另一个区域,而不在此群集中,请考虑使用此群集的邻近区域或同区域中的客户端计算机。
  • 检查是否已达到外部限制。 例如,将映像存储区配置为使用 Azure 存储时,可能会限制上传。

问题:已成功完成上传包,但 Register-ServiceFabricApplicationType 超时。请尝试:

  • 复制到映像存储之前对包进行压缩。 压缩可减小文件大小,减少文件数量,这反过来会减少通信流量和 Service Fabric 必须执行的工作量。 上传操作可能会变慢(尤其是包括压缩时间时),但注册和注销应用程序类型会加快。
  • 通过 TimeoutSec 参数为 Register-ServiceFabricApplicationType 指定更长的超时。
  • Register-ServiceFabricApplicationType 指定 Async 开关。 当群集接受命令并且应用程序类型的注册以异步方式继续时,该命令将返回。 因此,在此情况下,无需指定较长的超时。 Get-ServiceFabricApplicationType 命令列出已成功注册的所有应用程序类型版本及其注册状态。 此命令可用于确定注册的完成时间。
Get-ServiceFabricApplicationType
ApplicationTypeName    : MyApplicationType
ApplicationTypeVersion : 1.0.0
Status                 : Available
DefaultParameters      : { "Stateless1_InstanceCount" = "-1" }

部署包含多个文件的应用程序包

问题:对于包含多个文件(上千个)的应用程序包,Register-ServiceFabricApplicationType 超时。 请尝试:

Get-ServiceFabricApplicationType
ApplicationTypeName    : MyApplicationType
ApplicationTypeVersion : 1.0.0
Status                 : Available
DefaultParameters      : { "Stateless1_InstanceCount" = "-1" }

后续步骤

打包应用程序

Service Fabric 应用程序升级

Service Fabric 运行状况简介

对 Service Fabric 进行诊断和故障排除

在 Service Fabric 中对应用程序建模