将 .Net Core 应用程序部署到 Linux Service Fabric 集群

3
我有一个使用.Net Core编写的Service Fabric应用程序。它可以在本地Windows SF集群上运行良好,它由一个没有Web组件的单个无状态服务组成。
现在我尝试将其部署到Linux SF集群中。我能够通过使用service-fabric-onebox实例在Docker中运行SF。
我使用从azuresfcsharp yeomen模板获得的entryPoint.sh文件,并更改了ServiceManifest.xml文件中的EntryPoint Program节点。我还使用dotnet cli编译我的项目,并使用-r ubuntu.16.04-x64开关。
现在,当我尝试部署到我的SF集群时,出现了问题。
    Error event: SourceId='System.Hosting', Property='CodePackageActivation:Code:EntryPoint'.

There was an error during CodePackage activation.The service host terminated with exit code:32512

有什么想法吗?

可能是 Azure Service Fabric 激活错误 的重复问题。 - Shridhar R Kulkarni
1个回答

6

我终于弄明白了。我将在这里发布答案,但我也会顺便介绍一下在Windows上开发Service Fabric项目并在Linux上运行的所有步骤。

入口点

在SF项目的ServiceManifest.xml中,有一个EntryPoint/ExeHost/Program节点。在Windows中,它指向msbuild生成的exe文件。但在Linux上不是这样。

  • 如果您没有安装npm,请先安装它。
  • 运行npm i -g yo
  • 运行npm i -g generator-azuresfcsharp
  • 在测试文件夹中,运行yo azuresfcsharp

当生成器运行时,它会给您一个SF项目文件夹和一个C#项目文件夹。进入SF项目/服务名称文件夹/Code。该文件夹中将有两个名为entryPoint.sh和dotnet-include.sh的文件。

您需要将它们添加到您的项目中,并设置为内容和始终复制。

最后,在ServiceManifest.xml中,将EntryPoint/ExeHost/Program节点更改为entryPoint.sh

编译

使用Visual Studio进行编译无法工作,因为您需要针对Linux运行时。

附注 - 在编译之前,您需要了解Service Fabric包的布局方式。最好的方法是在Visual Studio中右键单击SF项目,单击“Package”,转到资源管理器中的SF项目文件夹,然后查看其中的pkg文件夹。

在控制台窗口中,cd到具有要构建的服务的csproj文件的文件夹。假设您将部署包构建在名为pkg的文件夹中,该文件夹位于解决方案的根目录中。因此运行:

dotnet publish -o ..\pkg\YourServicePkg\Code -r ubuntu.16.04-x64

注意 - 您的 pkg 文件夹必须以 Pkg 结尾。

另外,查看此处列出的可供定位的运行时列表。我刚好在使用 unbuntu。 运行时标识符

完成打包

最后,为了完善您的部署包,您需要在包文件夹的根目录中包含 ApplicationManifest.xml 文件,从您的服务项目中获取 ServiceManifest.xml 文件和 Config 文件夹。服务项目文件可以在 PackageRoot 中找到。

因此,您将拥有:

pkg
|
-> ApplicationManifest.xml
-> YourServicePkg
    |
    -> ServiceManifest.xml
    -> Code (This is where you targeted dotnet publish)
    -> Config

Linux环境

现在你需要本地运行它的地方。我使用了Docker。 这里 是完整设置说明的链接,但我会在这里概述基础知识。

首先,您需要使用以下设置更新Docker守护程序配置:

{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64"
}

然后,拉取图片。
docker pull servicefabricoss/service-fabric-onebox

您需要打开端口19080和19000,使用以下命令:

-p 19080:19080 -p 19000:19000

如果您一直在使用Windows中的Service Fabric本地群集管理器,您需要右键单击系统托盘中的图标并单击“删除群集”。然后等待完成后退出。否则会发生奇怪的事情。
一旦docker镜像启动,打开它的bash并运行./setup.sh,然后是./run.sh 部署
一旦SF在docker上运行并且您可以访问localhost:19080,就可以使用powershell进行部署。
首先,让我们测试我们的软件包是否有效。
Test-ServiceFabricApplicationPackage .\pkg\  

如果这样可以的话,让我们部署。
Connect-ServiceFabricCluster localhost:19000
Register-ServiceFabricApplicationType -ApplicationPathInImageStore YourService
Remove-ServiceFabricApplicationPackage -ImageStoreConnectionString fabric:ImageStore -ApplicationPackagePathInImageStore YourService
New-ServiceFabricApplication -ApplicationName fabric:/YourService -ApplicationTypeVersion 1.0.0 -ApplicationTypeName YourServiceType

您的应用程序应在Linux中启动。

重要提示

以下是导致退出代码:32512错误的原因:

我正在使用GitHub,显然,行结束样式设置为Windows。 因此,当我在另一台计算机上拉取时,行结束符从LF更改为CR LF。

为了解决这个问题,我必须在Notepad++中打开受影响的文件,然后单击“编辑”->“EOL转换”->“Unix(LF)”。

我必须在ApplicationManifest.xml、所有ServiceManifest.xml文件以及所有entryPoint.sh和dotnet-include.sh文件中执行此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接