将Python可执行文件部署到Azure Service Fabric



我正在寻找将Python可执行文件部署到Azure Service Fabric的有用解决方案

这里有node js的文档,但我找不到任何与python相关的

提示:为您节省一些时间,请尝试先在本地运行此程序。我的经验是,很多事情都可能出错,其中最难确定的是节点上的执行权限。

置>

将Python部署到Service Fabric所需的步骤:

  1. 确保Python已经安装在SF节点上(以及你需要的包)。有两种方法:
    • 使用"远程桌面"使用端点"sf_cluster.westeurope.cloudapp.azure.com:node_port"导航到节点。其中node_port是(对我来说)3389-3393。然后通过从Python.org下载安装程序手动安装python。
    • 创建一个python安装脚本,在Guest可执行文件SetupEntryPoint中调用,后面会详细介绍。
    • 在任何情况下,你都需要将Python添加到节点和中,确保将Python和Python/Scripts添加到节点路径中。
  2. 创建一个带有来宾可执行服务的服务结构应用程序。
    1. 指向你的python代码文件夹
    2. 选择要运行的启动文件-留空
    3. 选择CodePackage作为工作文件夹
    4. 按下Ok。
    现在,您有了一个服务结构应用程序,它将把您的代码复制到服务结构集群,但什么也不做。(实际上,它可能会因为没有定义端点而对您大喊大叫,但这是下一个)

现在我们开始一些黑客行为。Service Fabric不会像在Microsoft示例中运行node.exe那样运行Python.exe。所以你需要做的是创建一个运行。CMD脚本基本上是这样做的:

python.exe main.py

使用它作为你的入口点。

现在你的入口点在ServiceManifest.xml看起来像这样:

...
    <EntryPoint>
        <ExeHost>
            <Program>run.cmd</Program>
            <Arguments></Arguments>
            <WorkingFolder>CodePackage</WorkingFolder>
            <ConsoleRedirection FileRetentionCount="5" FileMaxSizeInKb="2048"/> //use this to get logging (very helpful ;)
        </ExeHost>
    </EntryPoint>
</CodePackage>

如果你想用SetupEntryPoint为你安装python,你可以这样做:

<SetupEntryPoint>
  <ExeHost>
    <Program>Setupsetup.bat</Program>
    <WorkingFolder>CodePackage</WorkingFolder>
  </ExeHost>
</SetupEntryPoint>

我的setup.bat看起来像这样(路径有一些问题):

C:WindowsSystem32WindowsPowerShellv1.0powershell.exe -ExecutionPolicy - Bypass -Command ".SetuppythonInstall.ps1"

我的解决方案中的代码被复制到这个结构中:

MyGuestExecutablePkg
    |
    - Code
        - run.cmd
        - main.py
        - Setup
            - setup.bat
        - ....
    - Config
        - Settings.xml
    - ServiceManifest.xml
ApplicationManifest.xml

我希望这能帮助到一些人,但请务必阅读客户可执行文件,以了解我错过的任何内容。1

政策

有些东西需要在Service Fabric节点上解除特权,这就是你如何解除你的服务,以便它运行。cmd,。bat, Python.exe等。以下编辑来自ApplicationManifest.xml

....
<ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="MyGuestExecutablePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <RunAsPolicy CodePackageRef="Code" UserRef="SetupAdminUser" EntryPointType="Setup" />
      <RunAsPolicy CodePackageRef="Code" UserRef="SetupAdminUser" EntryPointType="Main" />
    </Policies>
  </ServiceManifestImport>
....

第一个策略是提升SetupEntryPoint,第二个策略是剔除EntryPoint,也就是。您的服务。确保您在ApplicationManifest.xml的底部定义了这些主体。

</DefaultServices>
  <Principals>
    <Users>
      <User Name="SetupAdminUser">
        <MemberOf>
          <SystemGroup Name="Administrators" />
        </MemberOf>
      </User>
    </Users>
  </Principals>
</ApplicationManifest>

最终想法

我把我的服务作为Flask Api运行,因为这非常容易。因此,Service Fabric所做的"全部"就是启动Flask api,然后确保它在崩溃时重新启动。这使得通过执行

可以很容易地测试和验证部署的哪个部分崩溃了,以及它是否已经启动并运行。
netstat -na | find "5000"

,以验证API确实已启动并运行。

当然,在所有这些之后,您需要在Azure Portal中为您的服务结构集群打开负载均衡器中的端口。

对于Python来说应该没有什么不同,只要你通过脚本扩展直接在节点上安装Python需求(对于Azure)。或者调用Python安装程序作为SetupEntryPoint。

相关内容

  • 没有找到相关文章

最新更新